PromptEasy.eu API
v1.2.0https://api.prompteasy.euPromptEasy.eu API documentation for Enterprise clients. For required company / team level roles for each operation, see Operation Rights documentation.
Authentication
ApiKeyAuthapiKeyAPI Key: X-Api-Key in header
BearerAuthhttpScheme: bearer
General
General operations related to PromptEasy.eu API health and operating.
Basic heartbeat endpoint
Response
The current time
API down
curl -X GET 'https://api.prompteasy.eu/'const response = await fetch('https://api.prompteasy.eu/', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/')
data = response.json(){
"time": "2025-11-25T13:12:29.000Z"
}Get system status
Response
System status response detailing health of various services
System status response detailing health of various services
Authorization
ApiKeyAuthapiKey in headercurl -X GET 'https://api.prompteasy.eu/v1/status'const response = await fetch('https://api.prompteasy.eu/v1/status', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/status')
data = response.json(){
"database": true,
"workers": true,
"payment_gateway": true,
"optional_ai": true,
"email": true,
"mcp": true
}{
"database": true,
"workers": true,
"payment_gateway": true,
"optional_ai": true,
"email": true,
"mcp": true
}Health check endpoint
Response
System health status
curl -X GET 'https://api.prompteasy.eu/v1/health'const response = await fetch('https://api.prompteasy.eu/v1/health', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/health')
data = response.json()Get details of the latest contract for a given agreement type
Parameters
agreementstringrequiredpathThe agreement type (e.g. tos, privacy, high_risk_ai)
Response
Latest contract details
Contract not found
Authorization
ApiKeyAuthapiKey in headercurl -X GET 'https://api.prompteasy.eu/v1/contracts/{agreement}'const response = await fetch('https://api.prompteasy.eu/v1/contracts/{agreement}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/contracts/{agreement}')
data = response.json(){
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_name": "Terms of Service",
"version": 1,
"contract_content": "Standard Terms of Service text...",
"changes_summary": "Minor wording updates in Section 2.",
"agreement_for": "tos",
"only_for_plan": "premium",
"is_user_contract": false,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}{
"message": "Contract not found."
}MCP
Model Context Protocol (MCP) server SSE endpoint. To get started with MCP, see MCP documentation.
Model Context Protocol (MCP) server SSE endpoint
Response
MCP Server SSE transport stream
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/mcp/server'const response = await fetch('https://api.prompteasy.eu/v1/mcp/server', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/mcp/server')
data = response.json()Model Context Protocol (MCP) server message endpoint
Response
MCP Server message response
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/mcp/server'const response = await fetch('https://api.prompteasy.eu/v1/mcp/server', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.prompteasy.eu/v1/mcp/server')
data = response.json()Model Context Protocol (MCP) server session endpoint
Response
No Content
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/mcp/server'const response = await fetch('https://api.prompteasy.eu/v1/mcp/server', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/mcp/server')
data = response.json()Authentication
Operations related to user authentication with PromptEasy.eu API.
Login
Body
emailstringrequiredpasswordstringrequiredrememberbooleanResponse
Login successful
Login credentials correct, 2FA setup started
Login credentials correct, waiting 2FA code next. Make same request but with 2fa_code
Login credentials were correct but 2fa_code was wrong
Login credentials were incorrect
Authorization
ApiKeyAuthapiKey in headercurl -X POST 'https://api.prompteasy.eu/v1/login' \
-H 'Content-Type: application/json' \
-d '{
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rd",
"remember": true
}'const response = await fetch('https://api.prompteasy.eu/v1/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rd",
"remember": true
}),
});
const data = await response.json();import requests
payload = {
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rd",
"remember": True
}
response = requests.post('https://api.prompteasy.eu/v1/login', json=payload)
data = response.json(){
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rd",
"remember": true
}{
"name": "John Doe",
"token": "string",
"aup_missing": true,
"recovery_codes": [
{
"code": "1234-5678",
"used_at": null
}
]
}{
"message": "Two-factor authentication setup required",
"qr_code": "string",
"uri": "otpauth://totp/PromptEasy.eu...",
"string": "J64LMYRKWG43ZW2MP..."
}Request password reset link
Body
emailstringrequiredResponse
Password reset link sent
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headercurl -X POST 'https://api.prompteasy.eu/v1/forgot-password' \
-H 'Content-Type: application/json' \
-d '{
"email": "foo@bar.invalid"
}'const response = await fetch('https://api.prompteasy.eu/v1/forgot-password', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "foo@bar.invalid"
}),
});
const data = await response.json();import requests
payload = {
"email": "foo@bar.invalid"
}
response = requests.post('https://api.prompteasy.eu/v1/forgot-password', json=payload)
data = response.json(){
"email": "foo@bar.invalid"
}{
"status": "We have emailed your password reset link."
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Reset password with token
Body
emailstring<email>requiredpasswordstringrequiredpassword_confirmationstringrequiredParameters
tokenstringrequiredpathThe password reset token.
Response
Password reset successful
Error while resetting password
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headercurl -X POST 'https://api.prompteasy.eu/v1/reset-password/{token}' \
-H 'Content-Type: application/json' \
-d '{
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rdNew",
"password_confirmation": "V3rys3cr3tP@ssw0rdNew"
}'const response = await fetch('https://api.prompteasy.eu/v1/reset-password/{token}', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rdNew",
"password_confirmation": "V3rys3cr3tP@ssw0rdNew"
}),
});
const data = await response.json();import requests
payload = {
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rdNew",
"password_confirmation": "V3rys3cr3tP@ssw0rdNew"
}
response = requests.post('https://api.prompteasy.eu/v1/reset-password/{token}', json=payload)
data = response.json(){
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rdNew",
"password_confirmation": "V3rys3cr3tP@ssw0rdNew"
}{
"status": "Password reset done"
}{
"email": "Error while resetting password"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Logout
Response
No Content
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/logout'const response = await fetch('https://api.prompteasy.eu/v1/logout', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.prompteasy.eu/v1/logout')
data = response.json()Registration
Operations related to tenant & user registration with PromptEasy.eu API.
Get a list of countries
Response
A list of countries
Authorization
ApiKeyAuthapiKey in headercurl -X GET 'https://api.prompteasy.eu/v1/countries'const response = await fetch('https://api.prompteasy.eu/v1/countries', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/countries')
data = response.json()[
{
"code": "BE",
"name": "Belgium"
}
]Verify if an email domain is academic
Parameters
emailstring<email>requiredqueryResponse
Verification result
Authorization
ApiKeyAuthapiKey in headercurl -X GET 'https://api.prompteasy.eu/v1/academic/verify'const response = await fetch('https://api.prompteasy.eu/v1/academic/verify', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/academic/verify')
data = response.json(){
"is_academic": true
}Register a new user and tenant
Body
namestringrequiredemailstringrequiredtenant_namestringtenant_emailstringcountry_codestringrequiredis_individualbooleanrequiredpostal_codestringvat_idstringplan_typestringrequiredpromotion_codestring | nullterms_acceptedbooleanrequiredResponse
Registration completed successfully
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headercurl -X POST 'https://api.prompteasy.eu/v1/register' \
-H 'Content-Type: application/json' \
-d '{
"name": "John Doe",
"email": "foo@bar.invalid",
"tenant_name": "Acme Inc.",
"tenant_email": "foo@bar.invalid",
"country_code": "BE",
"is_individual": false,
"postal_code": 12345,
"vat_id": "BE1234567890",
"plan_type": "premium",
"promotion_code": "PROMO50",
"terms_accepted": true
}'const response = await fetch('https://api.prompteasy.eu/v1/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "John Doe",
"email": "foo@bar.invalid",
"tenant_name": "Acme Inc.",
"tenant_email": "foo@bar.invalid",
"country_code": "BE",
"is_individual": false,
"postal_code": 12345,
"vat_id": "BE1234567890",
"plan_type": "premium",
"promotion_code": "PROMO50",
"terms_accepted": true
}),
});
const data = await response.json();import requests
payload = {
"name": "John Doe",
"email": "foo@bar.invalid",
"tenant_name": "Acme Inc.",
"tenant_email": "foo@bar.invalid",
"country_code": "BE",
"is_individual": False,
"postal_code": 12345,
"vat_id": "BE1234567890",
"plan_type": "premium",
"promotion_code": "PROMO50",
"terms_accepted": True
}
response = requests.post('https://api.prompteasy.eu/v1/register', json=payload)
data = response.json(){
"name": "John Doe",
"email": "foo@bar.invalid",
"tenant_name": "Acme Inc.",
"tenant_email": "foo@bar.invalid",
"country_code": "BE",
"is_individual": false,
"postal_code": 12345,
"vat_id": "BE1234567890",
"plan_type": "premium",
"promotion_code": "PROMO50",
"terms_accepted": true
}{
"message": "Registration completed."
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Vaults
Read more about vaults from Vaults documentation.
Get a list of vaults
Response
A list of vaults
Unauthorized
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/vaults'const response = await fetch('https://api.prompteasy.eu/v1/vaults', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/vaults')
data = response.json()[
{
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}
]Create a new vault
Body
namestringdescriptionstringteam_idinteger | nulltenant_vaultbooleanpublic_vaultbooleanResponse
Vault object
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/vaults' \
-H 'Content-Type: application/json' \
-d '{
"name": "My Vault",
"description": "A vault for my prompts",
"team_id": 1,
"tenant_vault": true,
"public_vault": true
}'const response = await fetch('https://api.prompteasy.eu/v1/vaults', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "My Vault",
"description": "A vault for my prompts",
"team_id": 1,
"tenant_vault": true,
"public_vault": true
}),
});
const data = await response.json();import requests
payload = {
"name": "My Vault",
"description": "A vault for my prompts",
"team_id": 1,
"tenant_vault": True,
"public_vault": True
}
response = requests.post('https://api.prompteasy.eu/v1/vaults', json=payload)
data = response.json(){
"name": "My Vault",
"description": "A vault for my prompts",
"team_id": 1,
"tenant_vault": true,
"public_vault": true
}{
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Detach a vault
Parameters
vaultintegerrequiredpathResponse
No Content
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/vaults/{vault}/detach'const response = await fetch('https://api.prompteasy.eu/v1/vaults/{vault}/detach', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.prompteasy.eu/v1/vaults/{vault}/detach')
data = response.json()Attach a vault
Body
team_idinteger | nulltenant_vaultbooleanParameters
vaultintegerrequiredpathResponse
No Content
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/vaults/{vault}/attach' \
-H 'Content-Type: application/json' \
-d '{
"team_id": 1,
"tenant_vault": true
}'const response = await fetch('https://api.prompteasy.eu/v1/vaults/{vault}/attach', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"team_id": 1,
"tenant_vault": true
}),
});
const data = await response.json();import requests
payload = {
"team_id": 1,
"tenant_vault": True
}
response = requests.post('https://api.prompteasy.eu/v1/vaults/{vault}/attach', json=payload)
data = response.json(){
"team_id": 1,
"tenant_vault": true
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Get a single vault
Parameters
vaultintegerrequiredpathResponse
Vault object
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/vaults/{vault}'const response = await fetch('https://api.prompteasy.eu/v1/vaults/{vault}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/vaults/{vault}')
data = response.json(){
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}Update a vault
Body
namestringdescriptionstring | nullpublic_vaultbooleanParameters
vaultintegerrequiredpathResponse
Vault object
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/vaults/{vault}' \
-H 'Content-Type: application/json' \
-d '{
"name": "My Vault",
"description": "An updated description for my vault",
"public_vault": true
}'const response = await fetch('https://api.prompteasy.eu/v1/vaults/{vault}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "My Vault",
"description": "An updated description for my vault",
"public_vault": true
}),
});
const data = await response.json();import requests
payload = {
"name": "My Vault",
"description": "An updated description for my vault",
"public_vault": True
}
response = requests.put('https://api.prompteasy.eu/v1/vaults/{vault}', json=payload)
data = response.json(){
"name": "My Vault",
"description": "An updated description for my vault",
"public_vault": true
}{
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Delete a vault
Parameters
vaultintegerrequiredpathResponse
No Content
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/vaults/{vault}'const response = await fetch('https://api.prompteasy.eu/v1/vaults/{vault}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/vaults/{vault}')
data = response.json()Prompts
Read more about prompts from Prompts documentation.
Get a list of most recent prompts
Response
Most recent prompts
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/prompts'const response = await fetch('https://api.prompteasy.eu/v1/prompts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/prompts')
data = response.json()[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"title": "string",
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}
]Create a new prompt
Body
vault_idintegerllm_modelstringllm_system_messagestringllm_settingsLlmSettingstitlestringpromptstringparametersPromptParameterscategoriesArray<integer>keywordsstring | nullResponse
Prompt object
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/prompts' \
-H 'Content-Type: application/json' \
-d '{
"vault_id": 1,
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"categories": [
1
],
"keywords": "blog, coffee, writing"
}'const response = await fetch('https://api.prompteasy.eu/v1/prompts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"vault_id": 1,
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"categories": [
1
],
"keywords": "blog, coffee, writing"
}),
});
const data = await response.json();import requests
payload = {
"vault_id": 1,
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"categories": [
1
],
"keywords": "blog, coffee, writing"
}
response = requests.post('https://api.prompteasy.eu/v1/prompts', json=payload)
data = response.json(){
"vault_id": 1,
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"categories": [
1
],
"keywords": "blog, coffee, writing"
}{
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Search for prompts (alternative GET method)
Parameters
searchstringqueryvault_idintegerquerycategory_idintegerqueryResponse
A paginated list of prompts
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/prompts/search'const response = await fetch('https://api.prompteasy.eu/v1/prompts/search', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/prompts/search')
data = response.json(){
"current_page": 0,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"title": "string",
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}
],
"first_page_url": "https://example.com",
"from": 0,
"last_page": 0,
"last_page_url": "https://example.com",
"links": [
{
"url": "https://example.com",
"label": "string",
"active": true
}
],
"next_page_url": "https://example.com",
"path": "https://example.com",
"per_page": 0,
"prev_page_url": "https://example.com",
"to": 0,
"total": 0
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Search for prompts
Body
searchstringvault_idintegercategory_idintegerResponse
A paginated list of prompts
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/prompts/search' \
-H 'Content-Type: application/json' \
-d '{
"search": "search terms",
"vault_id": 1,
"category_id": 1
}'const response = await fetch('https://api.prompteasy.eu/v1/prompts/search', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"search": "search terms",
"vault_id": 1,
"category_id": 1
}),
});
const data = await response.json();import requests
payload = {
"search": "search terms",
"vault_id": 1,
"category_id": 1
}
response = requests.post('https://api.prompteasy.eu/v1/prompts/search', json=payload)
data = response.json(){
"search": "search terms",
"vault_id": 1,
"category_id": 1
}{
"current_page": 0,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"title": "string",
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}
],
"first_page_url": "https://example.com",
"from": 0,
"last_page": 0,
"last_page_url": "https://example.com",
"links": [
{
"url": "https://example.com",
"label": "string",
"active": true
}
],
"next_page_url": "https://example.com",
"path": "https://example.com",
"per_page": 0,
"prev_page_url": "https://example.com",
"to": 0,
"total": 0
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Detach a prompt
Parameters
promptstring<uuid>requiredpathResponse
No Content
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/prompts/{prompt}/detach'const response = await fetch('https://api.prompteasy.eu/v1/prompts/{prompt}/detach', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.prompteasy.eu/v1/prompts/{prompt}/detach')
data = response.json()Attach a prompt
Body
vault_idintegerParameters
promptstring<uuid>requiredpathResponse
No Content
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/prompts/{prompt}/attach' \
-H 'Content-Type: application/json' \
-d '{
"vault_id": 1
}'const response = await fetch('https://api.prompteasy.eu/v1/prompts/{prompt}/attach', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"vault_id": 1
}),
});
const data = await response.json();import requests
payload = {
"vault_id": 1
}
response = requests.post('https://api.prompteasy.eu/v1/prompts/{prompt}/attach', json=payload)
data = response.json(){
"vault_id": 1
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Get a single prompt
Parameters
promptstring<uuid>requiredpathfor_editbooleanfalsequeryIf true, disables transparency template injection and skips generating an executed receipt.
X-PE-Team-IDintegerheaderOptional team ID override for CFO board execution telemetry.
X-PE-Expected-LLM-ModelstringheaderOptional expected LLM model override for CFO board execution telemetry.
Response
Prompt object with X-PE-Execution-ID header for CFO board execution telemetry.
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/prompts/{prompt}'const response = await fetch('https://api.prompteasy.eu/v1/prompts/{prompt}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/prompts/{prompt}')
data = response.json(){
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}Delete a prompt
Parameters
promptstring<uuid>requiredpathResponse
No Content
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/prompts/{prompt}'const response = await fetch('https://api.prompteasy.eu/v1/prompts/{prompt}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/prompts/{prompt}')
data = response.json()Get a specific version of a prompt (current or history)
Parameters
promptstring<uuid>requiredpathversionintegerrequiredpathThe version number of the prompt
X-PE-Team-IDintegerheaderOptional team ID override for CFO board execution telemetry.
X-PE-Expected-LLM-ModelstringheaderOptional expected LLM model override for CFO board execution telemetry.
Response
Prompt object with X-PE-Execution-ID header for CFO board execution telemetry.
Unauthorized
Forbidden
Prompt or version not found
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/prompts/{prompt}/{version}'const response = await fetch('https://api.prompteasy.eu/v1/prompts/{prompt}/{version}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/prompts/{prompt}/{version}')
data = response.json(){
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}Get prompt suggestions
Parameters
promptstring<uuid>requiredpathResponse
A list of prompt suggestions
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/prompts/{prompt}/suggestions'const response = await fetch('https://api.prompteasy.eu/v1/prompts/{prompt}/suggestions', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/prompts/{prompt}/suggestions')
data = response.json()[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"rejected": true,
"pivot": {
"categories": [
1
]
},
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Get prompt history
Parameters
promptstring<uuid>requiredpathResponse
A list of prompt history
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/prompts/{prompt}/history'const response = await fetch('https://api.prompteasy.eu/v1/prompts/{prompt}/history', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/prompts/{prompt}/history')
data = response.json()[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"pivot": {},
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Create a new prompt suggestion
Body
prompt_idstring<uuid>llm_modelstringllm_system_messagestringllm_settingsLlmSettingstitlestringpromptstringparametersPromptParameterspivotPromptSuggestionPivotkeywordsstring | nullResponse
Prompt suggestion object
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/suggestions' \
-H 'Content-Type: application/json' \
-d '{
"prompt_id": "uuid",
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"pivot": {
"categories": [
1
]
},
"keywords": "blog, coffee, writing"
}'const response = await fetch('https://api.prompteasy.eu/v1/suggestions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"prompt_id": "uuid",
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"pivot": {
"categories": [
1
]
},
"keywords": "blog, coffee, writing"
}),
});
const data = await response.json();import requests
payload = {
"prompt_id": "uuid",
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"pivot": {
"categories": [
1
]
},
"keywords": "blog, coffee, writing"
}
response = requests.post('https://api.prompteasy.eu/v1/suggestions', json=payload)
data = response.json(){
"prompt_id": "uuid",
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"pivot": {
"categories": [
1
]
},
"keywords": "blog, coffee, writing"
}{
"id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"rejected": true,
"pivot": {
"categories": [
1
]
},
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Get a single prompt suggestion
Parameters
suggestionstring<uuid>requiredpathResponse
Prompt suggestion object
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/suggestions/{suggestion}'const response = await fetch('https://api.prompteasy.eu/v1/suggestions/{suggestion}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/suggestions/{suggestion}')
data = response.json(){
"id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"rejected": true,
"pivot": {
"categories": [
1
]
},
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Reject a prompt suggestion
Parameters
suggestionstring<uuid>requiredpathResponse
No Content
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/suggestions/{suggestion}/reject'const response = await fetch('https://api.prompteasy.eu/v1/suggestions/{suggestion}/reject', {
method: 'PUT',
});
const data = await response.json();import requests
response = requests.put('https://api.prompteasy.eu/v1/suggestions/{suggestion}/reject')
data = response.json()Approve a prompt suggestion
Parameters
suggestionstring<uuid>requiredpathResponse
Prompt object
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/suggestions/{suggestion}/approve'const response = await fetch('https://api.prompteasy.eu/v1/suggestions/{suggestion}/approve', {
method: 'PUT',
});
const data = await response.json();import requests
response = requests.put('https://api.prompteasy.eu/v1/suggestions/{suggestion}/approve')
data = response.json(){
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}Get a single prompt history
Parameters
historystring<uuid>requiredpathResponse
Prompt history object
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/history/{history}'const response = await fetch('https://api.prompteasy.eu/v1/history/{history}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/history/{history}')
data = response.json(){
"id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"pivot": {},
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Restore a prompt history
Parameters
historystring<uuid>requiredpathResponse
Prompt object
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/history/{history}/restore'const response = await fetch('https://api.prompteasy.eu/v1/history/{history}/restore', {
method: 'PUT',
});
const data = await response.json();import requests
response = requests.put('https://api.prompteasy.eu/v1/history/{history}/restore')
data = response.json(){
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}Get a list of detached prompts
Response
A paginated list of detached prompts
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/detached-prompts'const response = await fetch('https://api.prompteasy.eu/v1/detached-prompts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/detached-prompts')
data = response.json(){
"current_page": 0,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"title": "string",
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}
],
"first_page_url": "https://example.com",
"from": 0,
"last_page": 0,
"last_page_url": "https://example.com",
"links": [
{
"url": "https://example.com",
"label": "string",
"active": true
}
],
"next_page_url": "https://example.com",
"path": "https://example.com",
"per_page": 0,
"prev_page_url": "https://example.com",
"to": 0,
"total": 0
}Get a single detached prompt
Parameters
promptstring<uuid>requiredpathResponse
Prompt object
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/detached-prompts/{prompt}'const response = await fetch('https://api.prompteasy.eu/v1/detached-prompts/{prompt}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/detached-prompts/{prompt}')
data = response.json(){
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}Consult AI for prompt improvement
Body
categoriesArray<string>titlestringpromptstringResponse
AI consult response
Unauthorized
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/ai/consult' \
-H 'Content-Type: application/json' \
-d '{
"categories": [
"coding"
],
"title": "My Prompt",
"prompt": "Write a blog post about coffee"
}'const response = await fetch('https://api.prompteasy.eu/v1/ai/consult', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"categories": [
"coding"
],
"title": "My Prompt",
"prompt": "Write a blog post about coffee"
}),
});
const data = await response.json();import requests
payload = {
"categories": [
"coding"
],
"title": "My Prompt",
"prompt": "Write a blog post about coffee"
}
response = requests.post('https://api.prompteasy.eu/v1/ai/consult', json=payload)
data = response.json(){
"categories": [
"coding"
],
"title": "My Prompt",
"prompt": "Write a blog post about coffee"
}{
"keywords": "blog, coffee, writing",
"prompt": "Write a blog post about [[Topic]]"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Check for prompts that need migration
Response
Number of prompts that need migration
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/migrations'const response = await fetch('https://api.prompteasy.eu/v1/migrations', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/migrations')
data = response.json(){
"prompts": 5
}Migrate prompts to default vault
Response
No Content
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/migrations'const response = await fetch('https://api.prompteasy.eu/v1/migrations', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.prompteasy.eu/v1/migrations')
data = response.json()Export prompts to CSV
Body
vault_idintegercategory_idintegerResponse
CSV file download
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/export' \
-H 'Content-Type: application/json' \
-d '{
"vault_id": 1,
"category_id": 1
}'const response = await fetch('https://api.prompteasy.eu/v1/export', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"vault_id": 1,
"category_id": 1
}),
});
const data = await response.json();import requests
payload = {
"vault_id": 1,
"category_id": 1
}
response = requests.post('https://api.prompteasy.eu/v1/export', json=payload)
data = response.json(){
"vault_id": 1,
"category_id": 1
}<binary>{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Get a list of categories
Response
A list of categories
Unauthorized
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/categories'const response = await fetch('https://api.prompteasy.eu/v1/categories', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/categories')
data = response.json()[
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
]Create a new category
Body
namestringslugstringdescriptionstringResponse
Category object
Unauthorized
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/categories' \
-H 'Content-Type: application/json' \
-d '{
"name": "My Category",
"slug": "my-category",
"description": "A category for my prompts"
}'const response = await fetch('https://api.prompteasy.eu/v1/categories', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "My Category",
"slug": "my-category",
"description": "A category for my prompts"
}),
});
const data = await response.json();import requests
payload = {
"name": "My Category",
"slug": "my-category",
"description": "A category for my prompts"
}
response = requests.post('https://api.prompteasy.eu/v1/categories', json=payload)
data = response.json(){
"name": "My Category",
"slug": "my-category",
"description": "A category for my prompts"
}{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Get a single category
Parameters
categoryintegerrequiredpathResponse
Category object
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/categories/{category}'const response = await fetch('https://api.prompteasy.eu/v1/categories/{category}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/categories/{category}')
data = response.json(){
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}Update a category
Body
namestringslugstringdescriptionstringParameters
categoryintegerrequiredpathResponse
Category object
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/categories/{category}' \
-H 'Content-Type: application/json' \
-d '{
"name": "My Category",
"slug": "my-category",
"description": "A category for my prompts"
}'const response = await fetch('https://api.prompteasy.eu/v1/categories/{category}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "My Category",
"slug": "my-category",
"description": "A category for my prompts"
}),
});
const data = await response.json();import requests
payload = {
"name": "My Category",
"slug": "my-category",
"description": "A category for my prompts"
}
response = requests.put('https://api.prompteasy.eu/v1/categories/{category}', json=payload)
data = response.json(){
"name": "My Category",
"slug": "my-category",
"description": "A category for my prompts"
}{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Delete a category
Parameters
categoryintegerrequiredpathResponse
No Content
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/categories/{category}'const response = await fetch('https://api.prompteasy.eu/v1/categories/{category}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/categories/{category}')
data = response.json()Generate a slug from a string
Body
textstringResponse
Slug object
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/slugify' \
-H 'Content-Type: application/json' \
-d '{
"text": "Some Text"
}'const response = await fetch('https://api.prompteasy.eu/v1/slugify', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"text": "Some Text"
}),
});
const data = await response.json();import requests
payload = {
"text": "Some Text"
}
response = requests.post('https://api.prompteasy.eu/v1/slugify', json=payload)
data = response.json(){
"text": "Some Text"
}{
"slug": "some-text"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Users
Read more about users management from Users Management documentation.
Get the user's own details
Response
User object
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/user'const response = await fetch('https://api.prompteasy.eu/v1/user', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/user')
data = response.json(){
"user": {
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
},
"devices": [
{
"ip": "255.255.255.255",
"added_at": 1765205985
}
]
}Update own user details
Body
namestringemailstringpasswordstringpassword_confirmationstringcurrent_passwordstringResponse
User object
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/user' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"current_password": "string"
}'const response = await fetch('https://api.prompteasy.eu/v1/user', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"current_password": "string"
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"current_password": "string"
}
response = requests.put('https://api.prompteasy.eu/v1/user', json=payload)
data = response.json(){
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"current_password": "string"
}{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}Accept latest Acceptable Use Policy
Response
AUP accepted or already agreed
Unauthorized
Forbidden
AUP contract not found
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/user/aup'const response = await fetch('https://api.prompteasy.eu/v1/user/aup', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.prompteasy.eu/v1/user/aup')
data = response.json(){
"message": "AUP accepted."
}Remove own safe devices which doesn't require 2FA code
Response
No Content
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/user/2fa/devices'const response = await fetch('https://api.prompteasy.eu/v1/user/2fa/devices', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/user/2fa/devices')
data = response.json()Show current user recovery codes
Body
current_passwordstringResponse
User recovery codes object
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/user/2fa/recovery-codes/view' \
-H 'Content-Type: application/json' \
-d '{
"current_password": "string"
}'const response = await fetch('https://api.prompteasy.eu/v1/user/2fa/recovery-codes/view', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"current_password": "string"
}),
});
const data = await response.json();import requests
payload = {
"current_password": "string"
}
response = requests.post('https://api.prompteasy.eu/v1/user/2fa/recovery-codes/view', json=payload)
data = response.json(){
"current_password": "string"
}{
"message": "Recovery codes generated",
"recovery_codes": [
{
"code": "1234-5678",
"used_at": null
}
]
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Generate recovery codes for current user
Body
current_passwordstringResponse
User recovery codes object
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/user/2fa/recovery-codes/regenerate' \
-H 'Content-Type: application/json' \
-d '{
"current_password": "string"
}'const response = await fetch('https://api.prompteasy.eu/v1/user/2fa/recovery-codes/regenerate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"current_password": "string"
}),
});
const data = await response.json();import requests
payload = {
"current_password": "string"
}
response = requests.post('https://api.prompteasy.eu/v1/user/2fa/recovery-codes/regenerate', json=payload)
data = response.json(){
"current_password": "string"
}{
"message": "Recovery codes generated",
"recovery_codes": [
{
"code": "1234-5678",
"used_at": null
}
]
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Get a list of users in the tenant
Response
A list of users
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/users'const response = await fetch('https://api.prompteasy.eu/v1/users', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/users')
data = response.json()[
{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}
]Create a new user
Body
namestringemailstringuser_levelstringsuperadmin_capabilitiesArray<string> | nulloperativefinancelegalGranular capabilities array for superadmin users (operative, finance, legal)
Response
User object
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/users' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"email": "string",
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}'const response = await fetch('https://api.prompteasy.eu/v1/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"email": "string",
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"email": "string",
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}
response = requests.post('https://api.prompteasy.eu/v1/users', json=payload)
data = response.json(){
"name": "string",
"email": "string",
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Create a service account (bot user)
Body
namestringis_adminbooleanapi_accessbooleanWhether the service account has API access
Response
Service account object with token
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/users/service-account' \
-H 'Content-Type: application/json' \
-d '{
"name": "Bot User",
"is_admin": false,
"api_access": true
}'const response = await fetch('https://api.prompteasy.eu/v1/users/service-account', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Bot User",
"is_admin": false,
"api_access": true
}),
});
const data = await response.json();import requests
payload = {
"name": "Bot User",
"is_admin": False,
"api_access": True
}
response = requests.post('https://api.prompteasy.eu/v1/users/service-account', json=payload)
data = response.json(){
"name": "Bot User",
"is_admin": false,
"api_access": true
}{
"user": {
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
},
"token": "1|..."
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Get user details
Parameters
userintegerrequiredpathResponse
User object
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/users/{user}'const response = await fetch('https://api.prompteasy.eu/v1/users/{user}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/users/{user}')
data = response.json(){
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}Update a user
Body
namestringemailstringpasswordstringpassword_confirmationstringemail_verified_atbooleanuser_levelstringsuperadmin_capabilitiesArray<string> | nulloperativefinancelegalGranular capabilities array for superadmin users (operative, finance, legal)
namestringemailstringpasswordstringpassword_confirmationstringemail_verified_atbooleanuser_levelstringapi_accessbooleanAPI access configuration (only available for service accounts/bot users on Enterprise plan)
Parameters
userintegerrequiredpathResponse
User object
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/users/{user}' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"email_verified_at": true,
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}'const response = await fetch('https://api.prompteasy.eu/v1/users/{user}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"email_verified_at": true,
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"email_verified_at": True,
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}
response = requests.put('https://api.prompteasy.eu/v1/users/{user}', json=payload)
data = response.json(){
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"email_verified_at": true,
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Delete a user
Parameters
userintegerrequiredpathResponse
No Content
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/users/{user}'const response = await fetch('https://api.prompteasy.eu/v1/users/{user}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/users/{user}')
data = response.json()Remove current user 2FA and send email notification to user to set up 2FA again
Parameters
userintegerrequiredpathResponse
No Content
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/users/{user}/2fa'const response = await fetch('https://api.prompteasy.eu/v1/users/{user}/2fa', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/users/{user}/2fa')
data = response.json()Get active user and tenant metadata
Response
User metadata
Unauthorized
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/metadata'const response = await fetch('https://api.prompteasy.eu/v1/metadata', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/metadata')
data = response.json(){
"user_id": 1,
"user": "John Doe",
"level": "superadmin",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"tenant": "Acme Inc.",
"days_to_next_payment": -6,
"is_trial": true,
"has_set_payment_details": true,
"country_code": "BE",
"individual": false,
"ai_enabled": false,
"auto_approve_suggestions": false,
"cfo_board_enabled": true,
"plan": "premium",
"aup_missing": false,
"teams": [
{
"id": 1,
"name": "Tech Team",
"role": "viewer"
}
]
}Teams
Read more about teams from Teams documentation.
Get a list of teams
Response
A list of teams
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/teams'const response = await fetch('https://api.prompteasy.eu/v1/teams', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/teams')
data = response.json()[
{
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
]Create a new team
Body
namestringTeam name
user_idintegerUser id to be added as admin
Response
Team object
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/teams' \
-H 'Content-Type: application/json' \
-d '{
"name": "Tech Team",
"user_id": 1
}'const response = await fetch('https://api.prompteasy.eu/v1/teams', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Tech Team",
"user_id": 1
}),
});
const data = await response.json();import requests
payload = {
"name": "Tech Team",
"user_id": 1
}
response = requests.post('https://api.prompteasy.eu/v1/teams', json=payload)
data = response.json(){
"name": "Tech Team",
"user_id": 1
}{
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Get a single team
Parameters
teamintegerrequiredpathResponse
Team object with users
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/teams/{team}'const response = await fetch('https://api.prompteasy.eu/v1/teams/{team}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/teams/{team}')
data = response.json(){
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"users": [
{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}
]
}Update a team
Body
namestringTeam name
user_idintegerUser id to be added as admin
Parameters
teamintegerrequiredpathResponse
Team object
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/teams/{team}' \
-H 'Content-Type: application/json' \
-d '{
"name": "Tech Team",
"user_id": 1
}'const response = await fetch('https://api.prompteasy.eu/v1/teams/{team}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Tech Team",
"user_id": 1
}),
});
const data = await response.json();import requests
payload = {
"name": "Tech Team",
"user_id": 1
}
response = requests.put('https://api.prompteasy.eu/v1/teams/{team}', json=payload)
data = response.json(){
"name": "Tech Team",
"user_id": 1
}{
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Delete a team
Parameters
teamintegerrequiredpathResponse
No Content
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/teams/{team}'const response = await fetch('https://api.prompteasy.eu/v1/teams/{team}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/teams/{team}')
data = response.json()Get a list of users in a team
Parameters
teamintegerrequiredpathResponse
Team object with users
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/teams/{team}/members'const response = await fetch('https://api.prompteasy.eu/v1/teams/{team}/members', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/teams/{team}/members')
data = response.json(){
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"users": [
{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}
]
}Add a member to a team
Body
idintegerUser id
rolestringParameters
teamintegerrequiredpathResponse
Team object with users
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/teams/{team}/members' \
-H 'Content-Type: application/json' \
-d '{
"id": 1,
"role": "viewer"
}'const response = await fetch('https://api.prompteasy.eu/v1/teams/{team}/members', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"id": 1,
"role": "viewer"
}),
});
const data = await response.json();import requests
payload = {
"id": 1,
"role": "viewer"
}
response = requests.post('https://api.prompteasy.eu/v1/teams/{team}/members', json=payload)
data = response.json(){
"id": 1,
"role": "viewer"
}{
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"users": [
{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}
]
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Get a list of vaults in a team
Parameters
teamintegerrequiredpathResponse
A list of vaults
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/teams/{team}/vaults'const response = await fetch('https://api.prompteasy.eu/v1/teams/{team}/vaults', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/teams/{team}/vaults')
data = response.json()[
{
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}
]Edit a member's role in a team
Body
rolestringParameters
teamintegerrequiredpathuserintegerrequiredpathResponse
Team object with users
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/teams/{team}/members/{user}' \
-H 'Content-Type: application/json' \
-d '{
"role": "viewer"
}'const response = await fetch('https://api.prompteasy.eu/v1/teams/{team}/members/{user}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"role": "viewer"
}),
});
const data = await response.json();import requests
payload = {
"role": "viewer"
}
response = requests.put('https://api.prompteasy.eu/v1/teams/{team}/members/{user}', json=payload)
data = response.json(){
"role": "viewer"
}{
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"users": [
{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}
]
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Remove a member from a team
Parameters
teamintegerrequiredpathuserintegerrequiredpathResponse
No Content
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/teams/{team}/members/{user}'const response = await fetch('https://api.prompteasy.eu/v1/teams/{team}/members/{user}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/teams/{team}/members/{user}')
data = response.json()Agreements
Read more about agreements from Agreements & Compliance documentation.
Check agreement signature compliance status
Parameters
agreement_forstringquerySpecific contract type to check (e.g., tos, privacy, custody, high_risk_ai). If provided, returns a simple boolean indicating whether the latest version is signed.
Response
Agreement compliance check results.
Unauthorized
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/agreements/check'const response = await fetch('https://api.prompteasy.eu/v1/agreements/check', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/agreements/check')
data = response.json()trueList all signed agreements for the tenant
Response
A list of signed agreements
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/agreements'const response = await fetch('https://api.prompteasy.eu/v1/agreements', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/agreements')
data = response.json()[
{
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"tenant_id": "a81d4a03-7cf5-4cf0-9dc8-f5e1823793df",
"tenant_name": "Acme Inc.",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"signatory": "John Doe",
"signature_hash": "5e8837e8f7dbe4f9d788c0ab58807d893d79a250781cde2415d860341b12b322",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"contract": {
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_name": "Terms of Service",
"version": 1,
"contract_content": "Standard Terms of Service text...",
"changes_summary": "Minor wording updates in Section 2.",
"agreement_for": "tos",
"only_for_plan": "premium",
"is_user_contract": false,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}
]Get details of a specific signed agreement
Parameters
agreementstring<uuid>requiredpathResponse
Agreement details
Unauthorized
Forbidden
Not Found
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/agreements/{agreement}'const response = await fetch('https://api.prompteasy.eu/v1/agreements/{agreement}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/agreements/{agreement}')
data = response.json(){
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"tenant_id": "a81d4a03-7cf5-4cf0-9dc8-f5e1823793df",
"tenant_name": "Acme Inc.",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"signatory": "John Doe",
"signature_hash": "5e8837e8f7dbe4f9d788c0ab58807d893d79a250781cde2415d860341b12b322",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"contract": {
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_name": "Terms of Service",
"version": 1,
"contract_content": "Standard Terms of Service text...",
"changes_summary": "Minor wording updates in Section 2.",
"agreement_for": "tos",
"only_for_plan": "premium",
"is_user_contract": false,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}Sign a contract
Body
namestringrequiredMust exactly match the user's name
Parameters
contractstring<uuid>requiredpathuserintegerrequiredpathResponse
Contract successfully signed
Unauthorized
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/agreements/{contract}/{user}/sign' \
-H 'Content-Type: application/json' \
-d '{
"name": "John Doe"
}'const response = await fetch('https://api.prompteasy.eu/v1/agreements/{contract}/{user}/sign', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "John Doe"
}),
});
const data = await response.json();import requests
payload = {
"name": "John Doe"
}
response = requests.post('https://api.prompteasy.eu/v1/agreements/{contract}/{user}/sign', json=payload)
data = response.json(){
"name": "John Doe"
}{
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"tenant_id": "a81d4a03-7cf5-4cf0-9dc8-f5e1823793df",
"tenant_name": "Acme Inc.",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"signatory": "John Doe",
"signature_hash": "5e8837e8f7dbe4f9d788c0ab58807d893d79a250781cde2415d860341b12b322",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"contract": {
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_name": "Terms of Service",
"version": 1,
"contract_content": "Standard Terms of Service text...",
"changes_summary": "Minor wording updates in Section 2.",
"agreement_for": "tos",
"only_for_plan": "premium",
"is_user_contract": false,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Tenants
Tenant view and update operations. More info about compliance can be found from from Agreements & Compliance documentation.
Get active tenant
Response
Tenant object
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/tenant'const response = await fetch('https://api.prompteasy.eu/v1/tenant', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/tenant')
data = response.json(){
"id": "a81d4a03-7cf5-4cf0-9dc8-f5e1823793df",
"name": "Acme Inc.",
"email": "foo@bar.invalid",
"country": "FI",
"postal_code": "12345",
"vat_id": "FI12345678",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"pm_type": "visa",
"pm_last_four": "4242",
"plan": {
"id": 1,
"name": "Enterprise Plan",
"slug": "enterprise",
"payment": "post-paid",
"seats": 10,
"duration": "month",
"price_vat0": 4900,
"vat": 24,
"price_with_vat": 6076,
"currency": "EUR",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
},
"tax_exempt": false,
"quantity": 10,
"ends_at": "2025-12-25T13:12:29.000Z",
"billing_portal": "https://billing.prompteasy.eu/...",
"high_risk_ai": false,
"cfo_board_enabled": true,
"compliance_months": 6,
"contracts": {
"tos": {
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
},
"privacy": {
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
},
"high_risk_ai": {
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
}
},
"settings": {
"is_individual": false,
"ai_enabled": false,
"suggestion_auto_approve": false,
"pagination_per_page": 50
}
}Update a tenant
Body
is_individualbooleanai_enabledbooleansuggestion_auto_approvebooleanpagination_per_pageintegerhigh_risk_aibooleanWhether high risk AI features are enabled
Response
Tenant object
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/tenant' \
-H 'Content-Type: application/json' \
-d '{
"is_individual": false,
"ai_enabled": true,
"suggestion_auto_approve": true,
"pagination_per_page": 20,
"high_risk_ai": true
}'const response = await fetch('https://api.prompteasy.eu/v1/tenant', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"is_individual": false,
"ai_enabled": true,
"suggestion_auto_approve": true,
"pagination_per_page": 20,
"high_risk_ai": true
}),
});
const data = await response.json();import requests
payload = {
"is_individual": False,
"ai_enabled": True,
"suggestion_auto_approve": True,
"pagination_per_page": 20,
"high_risk_ai": True
}
response = requests.put('https://api.prompteasy.eu/v1/tenant', json=payload)
data = response.json(){
"is_individual": false,
"ai_enabled": true,
"suggestion_auto_approve": true,
"pagination_per_page": 20,
"high_risk_ai": true
}{
"id": "a81d4a03-7cf5-4cf0-9dc8-f5e1823793df",
"name": "Acme Inc.",
"email": "foo@bar.invalid",
"country": "FI",
"postal_code": "12345",
"vat_id": "FI12345678",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"pm_type": "visa",
"pm_last_four": "4242",
"plan": {
"id": 1,
"name": "Enterprise Plan",
"slug": "enterprise",
"payment": "post-paid",
"seats": 10,
"duration": "month",
"price_vat0": 4900,
"vat": 24,
"price_with_vat": 6076,
"currency": "EUR",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
},
"tax_exempt": false,
"quantity": 10,
"ends_at": "2025-12-25T13:12:29.000Z",
"billing_portal": "https://billing.prompteasy.eu/...",
"high_risk_ai": false,
"cfo_board_enabled": true,
"compliance_months": 6,
"contracts": {
"tos": {
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
},
"privacy": {
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
},
"high_risk_ai": {
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
}
},
"settings": {
"is_individual": false,
"ai_enabled": false,
"suggestion_auto_approve": false,
"pagination_per_page": 50
}
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Download unencrypted compliance data
Response
A raw, unencrypted JSONL file containing the compliance details of the tenant.
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/tenant/custody'const response = await fetch('https://api.prompteasy.eu/v1/tenant/custody', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/tenant/custody')
data = response.json()"<binary>"Transparency Templates
Read more about transparency templates from Transparency Templates documentation.
List all transparency templates
Response
A list of transparency templates.
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/transparency-templates'const response = await fetch('https://api.prompteasy.eu/v1/transparency-templates', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/transparency-templates')
data = response.json()[
{
"id": "019e7806-337d-729c-8a2e-210308da3d02",
"tenant_id": 1,
"template": "This is transparency template notice text.",
"created_at": "2026-05-30T08:22:33.000Z",
"updated_at": "2026-05-30T08:22:33.000Z",
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}
]Create a transparency template
Body
templatestringrequiredResponse
Transparency template created successfully.
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/transparency-templates' \
-H 'Content-Type: application/json' \
-d '{
"template": "string"
}'const response = await fetch('https://api.prompteasy.eu/v1/transparency-templates', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"template": "string"
}),
});
const data = await response.json();import requests
payload = {
"template": "string"
}
response = requests.post('https://api.prompteasy.eu/v1/transparency-templates', json=payload)
data = response.json(){
"template": "string"
}{
"id": "019e7806-337d-729c-8a2e-210308da3d02",
"tenant_id": 1,
"template": "This is transparency template notice text.",
"created_at": "2026-05-30T08:22:33.000Z",
"updated_at": "2026-05-30T08:22:33.000Z",
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}List all vaults for transparency templates tool
Response
A list of vaults with transparency template binding info.
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/transparency-templates/vaults'const response = await fetch('https://api.prompteasy.eu/v1/transparency-templates/vaults', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/transparency-templates/vaults')
data = response.json()[
{
"id": 0,
"name": "string",
"transparency_template_id": "550e8400-e29b-41d4-a716-446655440000"
}
]Bind a transparency template to a vault
Body
transparency_template_idstring<uuid>requiredParameters
vaultintegerrequiredpathResponse
Vault successfully bound.
Forbidden
Not Found
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/transparency-templates/vaults/{vault}/bind' \
-H 'Content-Type: application/json' \
-d '{
"transparency_template_id": "550e8400-e29b-41d4-a716-446655440000"
}'const response = await fetch('https://api.prompteasy.eu/v1/transparency-templates/vaults/{vault}/bind', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"transparency_template_id": "550e8400-e29b-41d4-a716-446655440000"
}),
});
const data = await response.json();import requests
payload = {
"transparency_template_id": "550e8400-e29b-41d4-a716-446655440000"
}
response = requests.post('https://api.prompteasy.eu/v1/transparency-templates/vaults/{vault}/bind', json=payload)
data = response.json(){
"transparency_template_id": "550e8400-e29b-41d4-a716-446655440000"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Unbind the transparency template from a vault
Parameters
vaultintegerrequiredpathResponse
Vault successfully unbound.
Forbidden
Not Found
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/transparency-templates/vaults/{vault}/unbind'const response = await fetch('https://api.prompteasy.eu/v1/transparency-templates/vaults/{vault}/unbind', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.prompteasy.eu/v1/transparency-templates/vaults/{vault}/unbind')
data = response.json()Get details of a single transparency template
Parameters
templatestring<uuid>requiredpathResponse
Transparency template details
Forbidden
Not Found
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/transparency-templates/{template}'const response = await fetch('https://api.prompteasy.eu/v1/transparency-templates/{template}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/transparency-templates/{template}')
data = response.json(){
"id": "019e7806-337d-729c-8a2e-210308da3d02",
"tenant_id": 1,
"template": "This is transparency template notice text.",
"created_at": "2026-05-30T08:22:33.000Z",
"updated_at": "2026-05-30T08:22:33.000Z",
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}Update a transparency template
Body
templatestringrequiredParameters
templatestring<uuid>requiredpathResponse
Transparency template updated successfully
Forbidden
Not Found
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/transparency-templates/{template}' \
-H 'Content-Type: application/json' \
-d '{
"template": "string"
}'const response = await fetch('https://api.prompteasy.eu/v1/transparency-templates/{template}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"template": "string"
}),
});
const data = await response.json();import requests
payload = {
"template": "string"
}
response = requests.put('https://api.prompteasy.eu/v1/transparency-templates/{template}', json=payload)
data = response.json(){
"template": "string"
}{
"id": "019e7806-337d-729c-8a2e-210308da3d02",
"tenant_id": 1,
"template": "This is transparency template notice text.",
"created_at": "2026-05-30T08:22:33.000Z",
"updated_at": "2026-05-30T08:22:33.000Z",
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Delete a transparency template
Parameters
templatestring<uuid>requiredpathResponse
No Content
Forbidden
Not Found
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/transparency-templates/{template}'const response = await fetch('https://api.prompteasy.eu/v1/transparency-templates/{template}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/transparency-templates/{template}')
data = response.json()Audit
About audit log functionality you can find more info from Audit Log documentation. About Vault Receipts, see Vault Receipts documentation.
Get the audit log for the tenant
Response
A list of audit log entries
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/audit'const response = await fetch('https://api.prompteasy.eu/v1/audit', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/audit')
data = response.json()[
{
"id": 0,
"ip": "string",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"operation": "string",
"target": "string"
}
]Export audit logs as unencrypted JSONL
Export audit logs as a JSONL file with optional timeframe filtering. Recording of the export action is logged prior to streaming the export.
Parameters
start_timestring<date-time>queryOptional start time filter (ISO 8601 string)
end_timestring<date-time>queryOptional end time filter (ISO 8601 string)
Response
A raw JSONL file containing tenant header and audit log entries.
Unauthorized
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/audit/export'const response = await fetch('https://api.prompteasy.eu/v1/audit/export', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/audit/export')
data = response.json()"<binary>"Get the audit log for a specific user
Parameters
userintegerrequiredpathResponse
A list of audit log entries
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/audit/users/{user}'const response = await fetch('https://api.prompteasy.eu/v1/audit/users/{user}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/audit/users/{user}')
data = response.json()[
{
"id": 0,
"ip": "string",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"operation": "string",
"target": "string"
}
]Get the audit log for a specific target
Parameters
targetTablestringrequiredpathidintegerrequiredpathResponse
A list of audit log entries
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/audit/target/{targetTable}/{id}'const response = await fetch('https://api.prompteasy.eu/v1/audit/target/{targetTable}/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/audit/target/{targetTable}/{id}')
data = response.json()[
{
"id": 0,
"ip": "string",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"operation": "string",
"target": "string"
}
]Get the audit log for a specific date range
Parameters
startTimestring<date-time>requiredpathendTimestring<date-time>requiredpathResponse
A list of audit log entries
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/audit/start/{startTime}/end/{endTime}'const response = await fetch('https://api.prompteasy.eu/v1/audit/start/{startTime}/end/{endTime}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/audit/start/{startTime}/end/{endTime}')
data = response.json()[
{
"id": 0,
"ip": "string",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"operation": "string",
"target": "string"
}
]Get the audit log starting from a specific time
Parameters
startTimestring<date-time>requiredpathResponse
A list of audit log entries
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/audit/start/{startTime}'const response = await fetch('https://api.prompteasy.eu/v1/audit/start/{startTime}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/audit/start/{startTime}')
data = response.json()[
{
"id": 0,
"ip": "string",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"operation": "string",
"target": "string"
}
]Get the cryptographic vault receipts for the tenant
Response
A paginated list of cryptographic vault receipts
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/audit/receipts'const response = await fetch('https://api.prompteasy.eu/v1/audit/receipts', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/audit/receipts')
data = response.json(){
"current_page": 0,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"datetime": "2024-01-15T09:30:00Z",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"action": "modified",
"hash": "string"
}
],
"first_page_url": "https://example.com",
"from": 0,
"last_page": 0,
"last_page_url": "https://example.com",
"links": [
{
"url": "https://example.com",
"label": "string",
"active": true
}
],
"next_page_url": "https://example.com",
"path": "https://example.com",
"per_page": 0,
"prev_page_url": "https://example.com",
"to": 0,
"total": 0
}Get detailed cryptographic vault receipt details
Parameters
receiptstring<uuid>requiredpathResponse
Detailed vault receipt representation
Forbidden
Receipt not found
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/audit/receipts/{receipt}'const response = await fetch('https://api.prompteasy.eu/v1/audit/receipts/{receipt}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/audit/receipts/{receipt}')
data = response.json(){
"id": "550e8400-e29b-41d4-a716-446655440000",
"datetime": "2024-01-15T09:30:00Z",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_history_id": "550e8400-e29b-41d4-a716-446655440000",
"action": "modified",
"hash": "string",
"signature": "string",
"prompt": "string",
"llm_system_message": "string",
"prompt_version": 0,
"metadata": {}
}Verify the cryptographic vault receipt integrity
Parameters
receiptstring<uuid>requiredpathResponse
Verification result of a cryptographic vault receipt
Forbidden
Receipt not found
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/audit/receipts/{receipt}/verify'const response = await fetch('https://api.prompteasy.eu/v1/audit/receipts/{receipt}/verify', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/audit/receipts/{receipt}/verify')
data = response.json(){
"valid": true,
"receipt": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"datetime": "2024-01-15T09:30:00Z",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_history_id": "550e8400-e29b-41d4-a716-446655440000",
"action": "modified",
"hash": "string",
"signature": "string",
"prompt": "string",
"llm_system_message": "string",
"prompt_version": 0,
"metadata": {}
}
}Tokens
Operations related to user's personal access tokens, and service accounts API tokens. Information about rate limits can be found from Rate Limits documentation.
Get personal access tokens
Response
List of tokens
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/tokens'const response = await fetch('https://api.prompteasy.eu/v1/tokens', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/tokens')
data = response.json()[
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]Issue a access token for a bot user
Parameters
userintegerrequiredpathResponse
Token response
Target user is not a bot
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/tokens/bot/{user}'const response = await fetch('https://api.prompteasy.eu/v1/tokens/bot/{user}', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.prompteasy.eu/v1/tokens/bot/{user}')
data = response.json(){
"token": "1|..."
}Issue a personal access token
Response
Token response
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/tokens/personal'const response = await fetch('https://api.prompteasy.eu/v1/tokens/personal', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('https://api.prompteasy.eu/v1/tokens/personal')
data = response.json(){
"token": "1|..."
}Revoke a access token
Parameters
tokenIdstringrequiredpathResponse
Token revoked successfully
Token not found or unauthorized
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/tokens/{tokenId}'const response = await fetch('https://api.prompteasy.eu/v1/tokens/{tokenId}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/tokens/{tokenId}')
data = response.json(){
"message": "Token revoked."
}API Keys
Operations related to API keys (generate and revoke your Enterprise X-Api-Key).
List Enterprise API Keys
Response
List of API keys
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/api-keys'const response = await fetch('https://api.prompteasy.eu/v1/api-keys', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/api-keys')
data = response.json()[
{
"id": 1,
"service": "my-production-backend",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}
]Create a new Enterprise API Key
Body
servicestringrequiredResponse
API key created successfully
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/api-keys' \
-H 'Content-Type: application/json' \
-d '{
"service": "my-production-backend"
}'const response = await fetch('https://api.prompteasy.eu/v1/api-keys', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"service": "my-production-backend"
}),
});
const data = await response.json();import requests
payload = {
"service": "my-production-backend"
}
response = requests.post('https://api.prompteasy.eu/v1/api-keys', json=payload)
data = response.json(){
"service": "my-production-backend"
}{
"id": 1,
"service": "my-production-backend",
"token": "pe_abcdef1234567890abcdef1234567890abcdef12",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}Revoke an Enterprise API Key
Parameters
apiKeyintegerrequiredpathResponse
API key revoked successfully
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/api-keys/{apiKey}'const response = await fetch('https://api.prompteasy.eu/v1/api-keys/{apiKey}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/api-keys/{apiKey}')
data = response.json(){
"message": "API key revoked."
}Telemetry
Operations related to post-LLM prompt execution telemetry reporting.
Report execution telemetry details post-LLM call
Body
actual_llm_modelstringActual LLM model name used for completion
prompt_tokensinteger>= 0Number of prompt/input tokens used
completion_tokensinteger>= 0Number of output/completion tokens generated
cached_prompt_tokensinteger>= 0Number of cached prompt tokens
reasoning_tokensinteger>= 0Number of reasoning tokens used
latency_msinteger>= 0Total request execution duration in milliseconds
ttft_msinteger>= 0Time to first token in milliseconds
finish_reasonstringLLM completion finish reason
statusinteger123Execution status (1 = fetched, 2 = completed, 3 = failed)
Parameters
executionstring<uuid>requiredpathResponse
Telemetry recorded successfully
Forbidden
Not Found
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/executions/{execution}/telemetry' \
-H 'Content-Type: application/json' \
-d '{
"actual_llm_model": "gpt-4o",
"prompt_tokens": 1500,
"completion_tokens": 300,
"cached_prompt_tokens": 500,
"reasoning_tokens": 100,
"latency_ms": 1250,
"ttft_ms": 200,
"finish_reason": "stop",
"status": 2
}'const response = await fetch('https://api.prompteasy.eu/v1/executions/{execution}/telemetry', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"actual_llm_model": "gpt-4o",
"prompt_tokens": 1500,
"completion_tokens": 300,
"cached_prompt_tokens": 500,
"reasoning_tokens": 100,
"latency_ms": 1250,
"ttft_ms": 200,
"finish_reason": "stop",
"status": 2
}),
});
const data = await response.json();import requests
payload = {
"actual_llm_model": "gpt-4o",
"prompt_tokens": 1500,
"completion_tokens": 300,
"cached_prompt_tokens": 500,
"reasoning_tokens": 100,
"latency_ms": 1250,
"ttft_ms": 200,
"finish_reason": "stop",
"status": 2
}
response = requests.post('https://api.prompteasy.eu/v1/executions/{execution}/telemetry', json=payload)
data = response.json(){
"actual_llm_model": "gpt-4o",
"prompt_tokens": 1500,
"completion_tokens": 300,
"cached_prompt_tokens": 500,
"reasoning_tokens": 100,
"latency_ms": 1250,
"ttft_ms": 200,
"finish_reason": "stop",
"status": 2
}{
"message": "Telemetry recorded successfully.",
"execution_id": "018f0000-0000-7000-8000-000000000002",
"has_telemetry": true,
"status": 2
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Analytics
Operations related to CFO Board analytics and tenant model rates management.
Get CFO Board Analytics
Parameters
start_datestring<date>queryend_datestring<date>queryResponse
CFO board analytics data
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/analytics/cfo-board'const response = await fetch('https://api.prompteasy.eu/v1/analytics/cfo-board', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/analytics/cfo-board')
data = response.json(){
"cfo_board_enabled": true,
"period": {
"start": "2026-08-01",
"end": "2026-08-31"
},
"summary": {
"total_executions": 100,
"total_estimated_cost_cents": 2500,
"currency": "EUR"
},
"by_team": [
{
"team_id": 1,
"team_name": "Finance Engineering",
"executions_count": 100,
"percentage": 100,
"estimated_cost_cents": 2500
}
],
"by_model": [
{
"model": "claude-3-5-sonnet-20241022",
"executions_count": 100,
"percentage": 100,
"prompt_tokens": 50000,
"completion_tokens": 10000,
"cached_prompt_tokens": 5000,
"reasoning_tokens": 0,
"estimated_cost_cents": 2500
}
],
"daily_trends": [
{
"date": "2026-08-01",
"executions": 100,
"cost_cents": 2500
}
]
}Update CFO Board Tenant Settings
Body
cfo_board_enabledbooleanrequiredEnable or disable CFO Board analytics for the tenant
Response
Settings updated successfully
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/analytics/cfo-board/settings' \
-H 'Content-Type: application/json' \
-d '{
"cfo_board_enabled": true
}'const response = await fetch('https://api.prompteasy.eu/v1/analytics/cfo-board/settings', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"cfo_board_enabled": true
}),
});
const data = await response.json();import requests
payload = {
"cfo_board_enabled": True
}
response = requests.post('https://api.prompteasy.eu/v1/analytics/cfo-board/settings', json=payload)
data = response.json(){
"cfo_board_enabled": true
}{
"message": "CFO Board settings updated successfully.",
"cfo_board_enabled": true
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}List Tenant Model Rates
Response
List of configured model rates
Forbidden
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X GET 'https://api.prompteasy.eu/v1/analytics/cfo-board/rates'const response = await fetch('https://api.prompteasy.eu/v1/analytics/cfo-board/rates', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('https://api.prompteasy.eu/v1/analytics/cfo-board/rates')
data = response.json()[
{
"id": 1,
"tenant_id": 10,
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 300,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0,
"created_at": "2026-08-01T12:00:00Z",
"updated_at": "2026-08-01T12:00:00Z"
}
]Create Tenant Model Rate
Body
model_patternstringrequiredModel pattern string or regex to match against actual LLM models
token_unitinteger>= 1Token unit divisor for pricing (default 1,000,000)
prompt_token_cost_centsnumber>= 0Cost in cents per token_unit prompt tokens
completion_token_cost_centsnumber>= 0Cost in cents per token_unit completion tokens
cached_prompt_token_cost_centsnumber>= 0Cost in cents per token_unit cached prompt tokens
reasoning_token_cost_centsnumber>= 0Cost in cents per token_unit reasoning tokens
Response
Rate created successfully
Forbidden
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X POST 'https://api.prompteasy.eu/v1/analytics/cfo-board/rates' \
-H 'Content-Type: application/json' \
-d '{
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 300,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}'const response = await fetch('https://api.prompteasy.eu/v1/analytics/cfo-board/rates', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 300,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}),
});
const data = await response.json();import requests
payload = {
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 300,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}
response = requests.post('https://api.prompteasy.eu/v1/analytics/cfo-board/rates', json=payload)
data = response.json(){
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 300,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}{
"id": 1,
"tenant_id": 10,
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 300,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0,
"created_at": "2026-08-01T12:00:00Z",
"updated_at": "2026-08-01T12:00:00Z"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Update Tenant Model Rate
Body
model_patternstringtoken_unitinteger>= 1prompt_token_cost_centsnumber>= 0completion_token_cost_centsnumber>= 0cached_prompt_token_cost_centsnumber>= 0reasoning_token_cost_centsnumber>= 0Parameters
rateintegerrequiredpathResponse
Rate updated successfully
Forbidden
Not Found
Unprocessable Entity
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X PUT 'https://api.prompteasy.eu/v1/analytics/cfo-board/rates/{rate}' \
-H 'Content-Type: application/json' \
-d '{
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 350,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}'const response = await fetch('https://api.prompteasy.eu/v1/analytics/cfo-board/rates/{rate}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 350,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}),
});
const data = await response.json();import requests
payload = {
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 350,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}
response = requests.put('https://api.prompteasy.eu/v1/analytics/cfo-board/rates/{rate}', json=payload)
data = response.json(){
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 350,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}{
"id": 1,
"tenant_id": 10,
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 300,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0,
"created_at": "2026-08-01T12:00:00Z",
"updated_at": "2026-08-01T12:00:00Z"
}{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}Delete Tenant Model Rate
Parameters
rateintegerrequiredpathResponse
Rate deleted successfully
Forbidden
Not Found
Authorization
ApiKeyAuthapiKey in headerBearerAuthhttp (bearer)curl -X DELETE 'https://api.prompteasy.eu/v1/analytics/cfo-board/rates/{rate}'const response = await fetch('https://api.prompteasy.eu/v1/analytics/cfo-board/rates/{rate}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('https://api.prompteasy.eu/v1/analytics/cfo-board/rates/{rate}')
data = response.json()Models
SystemStatus
objectdatabasebooleanHealth of the EU-West project database
workersbooleanHealth of the background queue workers
payment_gatewaybooleanHealth of the external payment gateway (Stripe)
optional_aibooleanHealth of the optional AI interface (Gemini)
emailbooleanHealth of the email interface (Mailgun)
mcpbooleanHealth of the internal MCP server
{
"database": true,
"workers": true,
"payment_gateway": true,
"optional_ai": true,
"email": true,
"mcp": true
}Auth
objectnamestringtokenstringaccess token
aup_missingbooleanIndicates whether the user still needs to agree to the latest Acceptable Use Policy
recovery_codesArray<RecoveryCode>If user has finalised 2FA setup, auth object contains recovery codes too
{
"name": "John Doe",
"token": "string",
"aup_missing": true,
"recovery_codes": [
{
"code": "1234-5678",
"used_at": null
}
]
}TwoFactorSetup
objectmessagestringqr_codestring2FA setup QR code as SVG string
uristring2FA uri
stringstring2FA shared secret
{
"message": "Two-factor authentication setup required",
"qr_code": "string",
"uri": "otpauth://totp/PromptEasy.eu...",
"string": "J64LMYRKWG43ZW2MP..."
}HeartbeatMetadata
objectuser_idintegeruserstringlevelstringsuperadmin_capabilitiesArray<string> | nulloperativefinancelegalGranular capabilities array for superadmin users (operative, finance, legal)
tenantstringdays_to_next_paymentintegeris_trialbooleanhas_set_payment_detailsbooleancountry_codestringindividualbooleanai_enabledbooleanauto_approve_suggestionsbooleancfo_board_enabledbooleanIndicates whether the CFO Board telemetry pipeline is enabled for the tenant
planstringaup_missingbooleanIndicates whether the user still needs to agree to the latest Acceptable Use Policy
teamsArray<UserTeam>{
"user_id": 1,
"user": "John Doe",
"level": "superadmin",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"tenant": "Acme Inc.",
"days_to_next_payment": -6,
"is_trial": true,
"has_set_payment_details": true,
"country_code": "BE",
"individual": false,
"ai_enabled": false,
"auto_approve_suggestions": false,
"cfo_board_enabled": true,
"plan": "premium",
"aup_missing": false,
"teams": [
{
"id": 1,
"name": "Tech Team",
"role": "viewer"
}
]
}UserTeam
objectidintegernamestringrolestring{
"id": 1,
"name": "Tech Team",
"role": "viewer"
}LoginRequest
objectemailstringrequiredpasswordstringrequiredrememberboolean{
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rd",
"remember": true
}TwoFactorRequest
objectemailstringrequiredpasswordstringrequired2fa_codestringrequired{
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rd",
"2fa_code": 123456
}RegisterRequest
objectnamestringrequiredemailstringrequiredtenant_namestringtenant_emailstringcountry_codestringrequiredis_individualbooleanrequiredpostal_codestringvat_idstringplan_typestringrequiredpromotion_codestring | nullterms_acceptedbooleanrequired{
"name": "John Doe",
"email": "foo@bar.invalid",
"tenant_name": "Acme Inc.",
"tenant_email": "foo@bar.invalid",
"country_code": "BE",
"is_individual": false,
"postal_code": 12345,
"vat_id": "BE1234567890",
"plan_type": "premium",
"promotion_code": "PROMO50",
"terms_accepted": true
}ForgotPasswordResponse
objectstatusstring{
"status": "We have emailed your password reset link."
}UpdateTenantRequest
objectis_individualbooleanai_enabledbooleansuggestion_auto_approvebooleanpagination_per_pageintegerhigh_risk_aibooleanWhether high risk AI features are enabled
{
"is_individual": false,
"ai_enabled": true,
"suggestion_auto_approve": true,
"pagination_per_page": 20,
"high_risk_ai": true
}TeamRequest
objectnamestringTeam name
user_idintegerUser id to be added as admin
{
"name": "Tech Team",
"user_id": 1
}StoreUserRequest
objectnamestringemailstringuser_levelstringsuperadmin_capabilitiesArray<string> | nulloperativefinancelegalGranular capabilities array for superadmin users (operative, finance, legal)
{
"name": "string",
"email": "string",
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}CreateServiceAccountRequest
objectnamestringis_adminbooleanapi_accessbooleanWhether the service account has API access
{
"name": "Bot User",
"is_admin": false,
"api_access": true
}UpdateUserRequest
objectnamestringemailstringpasswordstringpassword_confirmationstringemail_verified_atbooleanuser_levelstringsuperadmin_capabilitiesArray<string> | nulloperativefinancelegalGranular capabilities array for superadmin users (operative, finance, legal)
{
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"email_verified_at": true,
"user_level": "string",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
]
}UpdateOwnRequest
objectnamestringemailstringpasswordstringpassword_confirmationstringcurrent_passwordstring{
"name": "string",
"email": "string",
"password": "string",
"password_confirmation": "string",
"current_password": "string"
}VaultRequest
objectnamestringdescriptionstringteam_idinteger | nulltenant_vaultbooleanpublic_vaultboolean{
"name": "My Vault",
"description": "A vault for my prompts",
"team_id": 1,
"tenant_vault": true,
"public_vault": true
}AttachVaultRequest
objectteam_idinteger | nulltenant_vaultboolean{
"team_id": 1,
"tenant_vault": true
}CategoryRequest
objectnamestringslugstringdescriptionstring{
"name": "My Category",
"slug": "my-category",
"description": "A category for my prompts"
}PromptRequest
objectvault_idintegerllm_modelstringllm_system_messagestringllm_settingsLlmSettingstitlestringpromptstringparametersPromptParameterscategoriesArray<integer>keywordsstring | null{
"vault_id": 1,
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"categories": [
1
],
"keywords": "blog, coffee, writing"
}SearchRequest
objectsearchstringvault_idintegercategory_idinteger{
"search": "search terms",
"vault_id": 1,
"category_id": 1
}PromptSuggestionRequest
objectprompt_idstring<uuid>llm_modelstringllm_system_messagestringllm_settingsLlmSettingstitlestringpromptstringparametersPromptParameterspivotPromptSuggestionPivotkeywordsstring | null{
"prompt_id": "uuid",
"llm_model": "gpt-4o",
"llm_system_message": "You are a helpful assistant.",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "My Prompt",
"prompt": "This is a prompt.",
"parameters": {
"param1": "value1"
},
"pivot": {
"categories": [
1
]
},
"keywords": "blog, coffee, writing"
}AiConsultRequest
objectcategoriesArray<string>titlestringpromptstring{
"categories": [
"coding"
],
"title": "My Prompt",
"prompt": "Write a blog post about coffee"
}Tenant
objectidstring<uuid>namestringemailstringcountrystringpostal_codestringvat_idstringcreated_atstring<date-time>updated_atstring<date-time>pm_typestringpm_last_fourstringplanobjecttax_exemptbooleanquantityintegerends_atstring<date-time>billing_portalstringhigh_risk_aibooleancfo_board_enabledbooleanIndicates whether the CFO Board telemetry pipeline is enabled for the tenant
compliance_monthsintegercontractsobjectsettingsTenantSettings{
"id": "a81d4a03-7cf5-4cf0-9dc8-f5e1823793df",
"name": "Acme Inc.",
"email": "foo@bar.invalid",
"country": "FI",
"postal_code": "12345",
"vat_id": "FI12345678",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"pm_type": "visa",
"pm_last_four": "4242",
"plan": {
"id": 1,
"name": "Enterprise Plan",
"slug": "enterprise",
"payment": "post-paid",
"seats": 10,
"duration": "month",
"price_vat0": 4900,
"vat": 24,
"price_with_vat": 6076,
"currency": "EUR",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
},
"tax_exempt": false,
"quantity": 10,
"ends_at": "2025-12-25T13:12:29.000Z",
"billing_portal": "https://billing.prompteasy.eu/...",
"high_risk_ai": false,
"cfo_board_enabled": true,
"compliance_months": 6,
"contracts": {
"tos": {
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
},
"privacy": {
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
},
"high_risk_ai": {
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
}
},
"settings": {
"is_individual": false,
"ai_enabled": false,
"suggestion_auto_approve": false,
"pagination_per_page": 50
}
}TenantContractStatus
objectsignedbooleansigned_atstring<date-time>signatorystring{
"signed": true,
"signed_at": "2025-11-25T13:12:29.000Z",
"signatory": "John Doe"
}Team
objectidintegernamestringtenant_idintegercreated_atstring<date-time>updated_atstring<date-time>{
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}TeamWithUsers
objectidintegernamestringtenant_idintegercreated_atstring<date-time>updated_atstring<date-time>usersArray<User>{
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"users": [
{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}
]
}User
objectidintegernamestringemailstringemail_verified_atstring<date-time>user_levelstringsuperadmin_capabilitiesArray<string> | nulloperativefinancelegalGranular capabilities array for superadmin users (operative, finance, legal)
created_atstring<date-time>updated_atstring<date-time>tenant_idintegerlast_active_atstring<date-time>aup_accepted_atstring<date-time> | nullaup_version_numberinteger | nulltokensArray<TokenInfo>In some cases superadmin can see user tokens
{
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
}UserDevice
objectipstringadded_atinteger<timestamp>{
"ip": "255.255.255.255",
"added_at": 1765205985
}UserWithDevices
objectuserUserdevicesArray<UserDevice>{
"user": {
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
},
"devices": [
{
"ip": "255.255.255.255",
"added_at": 1765205985
}
]
}ServiceAccount
objectuserUsertokenstring{
"user": {
"id": 1,
"name": "John Doe",
"email": "foo@bar.invalid",
"email_verified_at": "2025-12-02T18:24:52.000Z",
"user_level": "moderator",
"superadmin_capabilities": [
"operative",
"finance",
"legal"
],
"created_at": "2025-12-02T18:24:52.000Z",
"updated_at": "2025-12-02T18:24:52.000Z",
"tenant_id": 1,
"last_active_at": "2025-12-02T18:24:52.000Z",
"aup_accepted_at": "2026-08-15T12:00:00.000Z",
"aup_version_number": 1,
"tokens": [
{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}
]
},
"token": "1|..."
}RecoveryCode
objectcodestringused_atstring<date-time> | null{
"code": "1234-5678",
"used_at": null
}RecoveryCodesList
objectmessagestringrecovery_codesArray<RecoveryCode>{
"message": "Recovery codes generated",
"recovery_codes": [
{
"code": "1234-5678",
"used_at": null
}
]
}AuditLog
objectidintegeripstringuserAuditLogUseroperationstringtargetstring{
"id": 0,
"ip": "string",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"operation": "string",
"target": "string"
}Vault
objectidintegertenant_idintegerteam_idinteger | nulltenant_vaultbooleanpublic_vaultbooleandefaultbooleannamestringdescriptionstringcreated_atstring<date-time>updated_atstring<date-time>teamTeam{
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}Contract
objectidstring<uuid>contract_idstring<uuid> | nullcontract_namestringversionintegercontract_contentstringchanges_summarystring | nullagreement_forstringonly_for_planstring | nullis_user_contractbooleancreated_atstring<date-time>updated_atstring<date-time>{
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_name": "Terms of Service",
"version": 1,
"contract_content": "Standard Terms of Service text...",
"changes_summary": "Minor wording updates in Section 2.",
"agreement_for": "tos",
"only_for_plan": "premium",
"is_user_contract": false,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}Agreement
objectidstring<uuid>tenant_idstring<uuid>tenant_namestringcontract_idstring<uuid>signatorystringsignature_hashstringcreated_atstring<date-time>updated_atstring<date-time>contractContract{
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"tenant_id": "a81d4a03-7cf5-4cf0-9dc8-f5e1823793df",
"tenant_name": "Acme Inc.",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"signatory": "John Doe",
"signature_hash": "5e8837e8f7dbe4f9d788c0ab58807d893d79a250781cde2415d860341b12b322",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"contract": {
"id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_id": "9b2d5a39-ec9b-4b21-b3b4-4ffc8b671a53",
"contract_name": "Terms of Service",
"version": 1,
"contract_content": "Standard Terms of Service text...",
"changes_summary": "Minor wording updates in Section 2.",
"agreement_for": "tos",
"only_for_plan": "premium",
"is_user_contract": false,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
}SignAgreementRequest
objectnamestringrequiredMust exactly match the user's name
{
"name": "John Doe"
}ResetPasswordRequest
objectemailstring<email>requiredpasswordstringrequiredpassword_confirmationstringrequired{
"email": "foo@bar.invalid",
"password": "V3rys3cr3tP@ssw0rdNew",
"password_confirmation": "V3rys3cr3tP@ssw0rdNew"
}VaultUpdateRequest
objectnamestringdescriptionstring | nullpublic_vaultboolean{
"name": "My Vault",
"description": "An updated description for my vault",
"public_vault": true
}UpdateServiceAccountRequest
objectnamestringemailstringpasswordstringpassword_confirmationstringemail_verified_atbooleanuser_levelstringapi_accessbooleanAPI access configuration (only available for service accounts/bot users on Enterprise plan)
{
"name": "Bot User",
"email": "bot@tenant.invalid",
"password": "temporaryPassword123",
"password_confirmation": "temporaryPassword123",
"email_verified_at": true,
"user_level": "user",
"api_access": true
}Category
objectidintegertenant_idintegerslugstringnamestringdescriptionstringcreated_atstring<date-time>updated_atstring<date-time>{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}PromptSnapshot
objectidstring<uuid>tenant_idintegervault_idintegerllm_modelstringtitlestringkeywordsstringcreated_atstring<date-time>updated_atstring<date-time>vaultVaultcategoriesArray<Category>is_in_vault_receiptsbooleandays_until_safe_deletioninteger{
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"title": "string",
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}Prompt
objectidstring<uuid>tenant_idintegervault_idintegerllm_modelstringllm_system_messagestringllm_settingsLlmSettingstitlestringpromptstringparametersPromptParameterskeywordsstringprompt_versionintegercreated_atstring<date-time>updated_atstring<date-time>vaultVaultcategoriesArray<Category>is_in_vault_receiptsbooleandays_until_safe_deletioninteger{
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}PromptSuggestion
objectidstring<uuid>prompt_idstring<uuid>rejectedbooleanpivotPromptSuggestionPivotllm_modelstringllm_system_messagestringllm_settingsLlmSettingstitlestringpromptstringparametersPromptParameterskeywordsstringcreated_atstring<date-time>updated_atstring<date-time>{
"id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"rejected": true,
"pivot": {
"categories": [
1
]
},
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}PromptHistory
objectidstring<uuid>prompt_idstring<uuid>pivotobjectllm_modelstringllm_system_messagestringllm_settingsLlmSettingstitlestringpromptstringparametersPromptParameterskeywordsstringprompt_versionintegercreated_atstring<date-time>updated_atstring<date-time>{
"id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"pivot": {},
"llm_model": "string",
"llm_system_message": "string",
"llm_settings": {
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
},
"title": "string",
"prompt": "string",
"parameters": {
"param1": "value1"
},
"keywords": "string",
"prompt_version": 0,
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}PaginatedPrompts
objectcurrent_pageintegerdataArray<PromptSnapshot>first_page_urlstring<uri>fromintegerlast_pageintegerlast_page_urlstring<uri>linksArray<PaginationLink>next_page_urlstring<uri> | nullpathstring<uri>per_pageintegerprev_page_urlstring<uri> | nulltointegertotalinteger{
"current_page": 0,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": 0,
"vault_id": 0,
"llm_model": "string",
"title": "string",
"keywords": "string",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z",
"vault": {
"id": 1,
"tenant_id": 1,
"team_id": 1,
"tenant_vault": true,
"public_vault": true,
"default": false,
"name": "My Vault",
"description": "A vault for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z",
"team": {
"id": 1,
"name": "Tech Team",
"tenant_id": 1,
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
},
"categories": [
{
"id": 1,
"tenant_id": 1,
"slug": "my-category",
"name": "My Category",
"description": "A category for my prompts",
"created_at": "2025-11-25T13:12:29.000Z",
"updated_at": "2025-11-25T13:12:29.000Z"
}
],
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}
],
"first_page_url": "https://example.com",
"from": 0,
"last_page": 0,
"last_page_url": "https://example.com",
"links": [
{
"url": "https://example.com",
"label": "string",
"active": true
}
],
"next_page_url": "https://example.com",
"path": "https://example.com",
"per_page": 0,
"prev_page_url": "https://example.com",
"to": 0,
"total": 0
}AiConsultResponse
objectkeywordsstringpromptstring{
"keywords": "blog, coffee, writing",
"prompt": "Write a blog post about [[Topic]]"
}TokenInfo
objectidintegertokenstringcreated_atstring<date-time>last_used_atstring<date-time> | null{
"id": 1,
"token": "1|...",
"created_at": "2024-01-15T09:30:00Z",
"last_used_at": "2024-01-15T09:30:00Z"
}ValidationError
objectmessagestringerrorsValidationErrorErrors{
"message": "Validation failed",
"errors": {
"name": [
"Email required"
]
}
}LlmSettings
objecttempnumber<float>top_pnumber<float>top_kintegermax_tokensintegerstop_sequencesArray<string>{
"temp": 0.7,
"top_p": 0.9,
"top_k": 50,
"max_tokens": 2048,
"stop_sequences": [
"stop"
]
}TenantSettings
objectis_individualbooleanai_enabledbooleansuggestion_auto_approvebooleanpagination_per_pageinteger{
"is_individual": false,
"ai_enabled": false,
"suggestion_auto_approve": false,
"pagination_per_page": 50
}TransparencyTemplate
objectidstring<uuid>tenant_idintegertemplatestringcreated_atstring<date-time>updated_atstring<date-time>is_in_vault_receiptsbooleandays_until_safe_deletioninteger{
"id": "019e7806-337d-729c-8a2e-210308da3d02",
"tenant_id": 1,
"template": "This is transparency template notice text.",
"created_at": "2026-05-30T08:22:33.000Z",
"updated_at": "2026-05-30T08:22:33.000Z",
"is_in_vault_receipts": true,
"days_until_safe_deletion": 0
}AuditLogUser
objectidinteger | nullnamestringinitialsstring{
"id": 0,
"name": "string",
"initials": "string"
}PaginationLink
objecturlstring<uri> | nulllabelstringactiveboolean{
"url": "https://example.com",
"label": "string",
"active": true
}VaultReceipt
objectidstring<uuid>datetimestring<date-time>userobjectprompt_idstring<uuid> | nullprompt_history_idstring<uuid> | nullactionstringmodifiedversionedexecutedhashstringsignaturestringpromptstring | nullllm_system_messagestring | nullprompt_versionintegermetadataobject{
"id": "550e8400-e29b-41d4-a716-446655440000",
"datetime": "2024-01-15T09:30:00Z",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_history_id": "550e8400-e29b-41d4-a716-446655440000",
"action": "modified",
"hash": "string",
"signature": "string",
"prompt": "string",
"llm_system_message": "string",
"prompt_version": 0,
"metadata": {}
}VaultReceiptVerification
objectvalidbooleanreceiptVaultReceipt{
"valid": true,
"receipt": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"datetime": "2024-01-15T09:30:00Z",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"prompt_history_id": "550e8400-e29b-41d4-a716-446655440000",
"action": "modified",
"hash": "string",
"signature": "string",
"prompt": "string",
"llm_system_message": "string",
"prompt_version": 0,
"metadata": {}
}
}PaginatedVaultReceipts
objectcurrent_pageintegerdataArray<VaultReceiptListItem>first_page_urlstring<uri>fromintegerlast_pageintegerlast_page_urlstring<uri>linksArray<PaginationLink>next_page_urlstring<uri> | nullpathstring<uri>per_pageintegerprev_page_urlstring<uri> | nulltointegertotalinteger{
"current_page": 0,
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"datetime": "2024-01-15T09:30:00Z",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"action": "modified",
"hash": "string"
}
],
"first_page_url": "https://example.com",
"from": 0,
"last_page": 0,
"last_page_url": "https://example.com",
"links": [
{
"url": "https://example.com",
"label": "string",
"active": true
}
],
"next_page_url": "https://example.com",
"path": "https://example.com",
"per_page": 0,
"prev_page_url": "https://example.com",
"to": 0,
"total": 0
}VaultReceiptListItem
objectidstring<uuid>datetimestring<date-time>userobjectactionstringmodifiedversionedexecutedhashstring{
"id": "550e8400-e29b-41d4-a716-446655440000",
"datetime": "2024-01-15T09:30:00Z",
"user": {
"id": 0,
"name": "string",
"initials": "string"
},
"action": "modified",
"hash": "string"
}ApiKey
objectidintegerservicestringcreated_atstring<date-time>updated_atstring<date-time>{
"id": 1,
"service": "my-production-backend",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}ApiKeyWithToken
objectidintegerservicestringtokenstringcreated_atstring<date-time>updated_atstring<date-time>{
"id": 1,
"service": "my-production-backend",
"token": "pe_abcdef1234567890abcdef1234567890abcdef12",
"created_at": "2024-01-15T09:30:00Z",
"updated_at": "2024-01-15T09:30:00Z"
}PromptExecutionTelemetryPayload
objectactual_llm_modelstringActual LLM model name used for completion
prompt_tokensinteger>= 0Number of prompt/input tokens used
completion_tokensinteger>= 0Number of output/completion tokens generated
cached_prompt_tokensinteger>= 0Number of cached prompt tokens
reasoning_tokensinteger>= 0Number of reasoning tokens used
latency_msinteger>= 0Total request execution duration in milliseconds
ttft_msinteger>= 0Time to first token in milliseconds
finish_reasonstringLLM completion finish reason
statusinteger123Execution status (1 = fetched, 2 = completed, 3 = failed)
{
"actual_llm_model": "gpt-4o",
"prompt_tokens": 1500,
"completion_tokens": 300,
"cached_prompt_tokens": 500,
"reasoning_tokens": 100,
"latency_ms": 1250,
"ttft_ms": 200,
"finish_reason": "stop",
"status": 2
}PromptExecutionTelemetryResponse
objectmessagestringrequiredexecution_idstring<uuid>requiredhas_telemetrybooleanrequiredstatusintegerrequired{
"message": "Telemetry recorded successfully.",
"execution_id": "018f0000-0000-7000-8000-000000000002",
"has_telemetry": true,
"status": 2
}CfoBoardAnalyticsResponse
objectcfo_board_enabledbooleanrequiredperiodobjectrequiredsummaryobjectrequiredby_teamArray<CfoBoardTeamAnalytics>requiredby_modelArray<CfoBoardModelAnalytics>requireddaily_trendsArray<CfoBoardDailyTrend>required{
"cfo_board_enabled": true,
"period": {
"start": "2026-08-01",
"end": "2026-08-31"
},
"summary": {
"total_executions": 100,
"total_estimated_cost_cents": 2500,
"currency": "EUR"
},
"by_team": [
{
"team_id": 1,
"team_name": "Finance Engineering",
"executions_count": 100,
"percentage": 100,
"estimated_cost_cents": 2500
}
],
"by_model": [
{
"model": "claude-3-5-sonnet-20241022",
"executions_count": 100,
"percentage": 100,
"prompt_tokens": 50000,
"completion_tokens": 10000,
"cached_prompt_tokens": 5000,
"reasoning_tokens": 0,
"estimated_cost_cents": 2500
}
],
"daily_trends": [
{
"date": "2026-08-01",
"executions": 100,
"cost_cents": 2500
}
]
}CfoBoardTeamAnalytics
objectteam_idinteger | nullrequiredteam_namestringrequiredexecutions_countintegerrequiredpercentagenumber<float>requiredestimated_cost_centsintegerrequired{
"team_id": 1,
"team_name": "Finance Engineering",
"executions_count": 100,
"percentage": 100,
"estimated_cost_cents": 2500
}CfoBoardModelAnalytics
objectmodelstringrequiredexecutions_countintegerrequiredpercentagenumber<float>requiredprompt_tokensintegerrequiredcompletion_tokensintegerrequiredcached_prompt_tokensintegerrequiredreasoning_tokensintegerrequiredestimated_cost_centsintegerrequired{
"model": "claude-3-5-sonnet-20241022",
"executions_count": 100,
"percentage": 100,
"prompt_tokens": 50000,
"completion_tokens": 10000,
"cached_prompt_tokens": 5000,
"reasoning_tokens": 0,
"estimated_cost_cents": 2500
}CfoBoardDailyTrend
objectdatestring<date>requiredexecutionsintegerrequiredcost_centsintegerrequired{
"date": "2026-08-01",
"executions": 100,
"cost_cents": 2500
}CfoBoardSettingsPayload
objectcfo_board_enabledbooleanrequiredEnable or disable CFO Board analytics for the tenant
{
"cfo_board_enabled": true
}CfoBoardSettingsResponse
objectmessagestringrequiredcfo_board_enabledbooleanrequired{
"message": "CFO Board settings updated successfully.",
"cfo_board_enabled": true
}TenantModelRate
objectidintegerrequiredtenant_idintegerrequiredmodel_patternstringrequiredtoken_unitintegerrequiredprompt_token_cost_centsnumberrequiredcompletion_token_cost_centsnumberrequiredcached_prompt_token_cost_centsnumberrequiredreasoning_token_cost_centsnumberrequiredcreated_atstring<date-time>updated_atstring<date-time>{
"id": 1,
"tenant_id": 10,
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 300,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0,
"created_at": "2026-08-01T12:00:00Z",
"updated_at": "2026-08-01T12:00:00Z"
}TenantModelRateCreatePayload
objectmodel_patternstringrequiredModel pattern string or regex to match against actual LLM models
token_unitinteger>= 1Token unit divisor for pricing (default 1,000,000)
prompt_token_cost_centsnumber>= 0Cost in cents per token_unit prompt tokens
completion_token_cost_centsnumber>= 0Cost in cents per token_unit completion tokens
cached_prompt_token_cost_centsnumber>= 0Cost in cents per token_unit cached prompt tokens
reasoning_token_cost_centsnumber>= 0Cost in cents per token_unit reasoning tokens
{
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 300,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}TenantModelRateUpdatePayload
objectmodel_patternstringtoken_unitinteger>= 1prompt_token_cost_centsnumber>= 0completion_token_cost_centsnumber>= 0cached_prompt_token_cost_centsnumber>= 0reasoning_token_cost_centsnumber>= 0{
"model_pattern": "claude-3-5-sonnet",
"token_unit": 1000000,
"prompt_token_cost_cents": 350,
"completion_token_cost_cents": 1500,
"cached_prompt_token_cost_cents": 30,
"reasoning_token_cost_cents": 0
}