Home

PromptEasy.eu API

v1.2.0
Base URL
https://api.prompteasy.eu

PromptEasy.eu API documentation for Enterprise clients. For required company / team level roles for each operation, see Operation Rights documentation.

Authentication

ApiKeyAuthapiKey

API Key: X-Api-Key in header

BearerAuthhttp

Scheme: bearer

General

General operations related to PromptEasy.eu API health and operating.

Basic heartbeat endpoint

GET
https://api.prompteasy.eu

Response

200OKHeartbeat

The current time

500Internal Server Error

API down

Basic heartbeat endpoint
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()
200
{
  "time": "2025-11-25T13:12:29.000Z"
}

Get system status

GET
https://api.prompteasy.eu/v1/status

Response

200OKSystemStatus

System status response detailing health of various services

503Service UnavailableSystemStatus

System status response detailing health of various services

Authorization

ApiKeyAuthapiKey in header
Get system status
curl -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

GET
https://api.prompteasy.eu/v1/health

Response

200OK

System health status

Health check endpoint
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

GET
https://api.prompteasy.eu/v1/contracts/{agreement}

Parameters

agreementstringrequiredpath

The agreement type (e.g. tos, privacy, high_risk_ai)

Response

200OKContract

Latest contract details

404Not Foundobject

Contract not found

Authorization

ApiKeyAuthapiKey in header
Get details of the latest contract for a given agreement type
curl -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

GET
https://api.prompteasy.eu/v1/mcp/server

Response

200OK

MCP Server SSE transport stream

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Model Context Protocol (MCP) server SSE endpoint
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

POST
https://api.prompteasy.eu/v1/mcp/server

Response

200OK

MCP Server message response

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Model Context Protocol (MCP) server message endpoint
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

DELETE
https://api.prompteasy.eu/v1/mcp/server

Response

204No Content

No Content

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Model Context Protocol (MCP) server session endpoint
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

POST
https://api.prompteasy.eu/v1/login

Body

application/json
emailstringrequired
passwordstringrequired
rememberboolean

Response

200OKAuth

Login successful

202AcceptedTwoFactorSetup

Login credentials correct, 2FA setup started

204No Content

Login credentials correct, waiting 2FA code next. Make same request but with 2fa_code

400Bad Request

Login credentials were correct but 2fa_code was wrong

401Unauthorized

Login credentials were incorrect

Authorization

ApiKeyAuthapiKey in header
Login
curl -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()
Request Body
{
  "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

POST
https://api.prompteasy.eu/v1/forgot-password

Body

application/json
emailstringrequired

Response

200OKForgotPasswordResponse

Password reset link sent

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
Request password reset link
curl -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()
Request Body
{
  "email": "foo@bar.invalid"
}
{
  "status": "We have emailed your password reset link."
}
{
  "message": "Validation failed",
  "errors": {
    "name": [
      "Email required"
    ]
  }
}

Reset password with token

POST
https://api.prompteasy.eu/v1/reset-password/{token}

Body

application/json
emailstring<email>required
passwordstringrequired
password_confirmationstringrequired

Parameters

tokenstringrequiredpath

The password reset token.

Response

200OKobject

Password reset successful

400Bad Requestobject

Error while resetting password

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
Reset password with token
curl -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()
Request Body
{
  "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

POST
https://api.prompteasy.eu/v1/logout

Response

204No Content

No Content

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Logout
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

GET
https://api.prompteasy.eu/v1/countries

Response

200OKArray<Country>

A list of countries

Authorization

ApiKeyAuthapiKey in header
Get a list of countries
curl -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()
200
[
  {
    "code": "BE",
    "name": "Belgium"
  }
]

Verify if an email domain is academic

GET
https://api.prompteasy.eu/v1/academic/verify

Parameters

emailstring<email>requiredquery

Response

200OKobject

Verification result

Authorization

ApiKeyAuthapiKey in header
Verify if an email domain is academic
curl -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()
200
{
  "is_academic": true
}

Register a new user and tenant

POST
https://api.prompteasy.eu/v1/register

Body

application/json
namestringrequired
emailstringrequired
tenant_namestring
tenant_emailstring
country_codestringrequired
is_individualbooleanrequired
postal_codestring
vat_idstring
plan_typestringrequired
promotion_codestring | null
terms_acceptedbooleanrequired

Response

200OKobject

Registration completed successfully

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
Register a new user and tenant
curl -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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/vaults

Response

200OKArray<Vault>

A list of vaults

401Unauthorized

Unauthorized

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a list of vaults
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/vaults

Body

application/json
namestring
descriptionstring
team_idinteger | null
tenant_vaultboolean
public_vaultboolean

Response

201CreatedVault

Vault object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create a new vault
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()
Request Body
{
  "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

POST
https://api.prompteasy.eu/v1/vaults/{vault}/detach

Parameters

vaultintegerrequiredpath

Response

204No Content

No Content

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Detach a vault
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

POST
https://api.prompteasy.eu/v1/vaults/{vault}/attach

Body

application/json
team_idinteger | null
tenant_vaultboolean

Parameters

vaultintegerrequiredpath

Response

204No Content

No Content

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Attach a vault
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()
Request Body
{
  "team_id": 1,
  "tenant_vault": true
}
422
{
  "message": "Validation failed",
  "errors": {
    "name": [
      "Email required"
    ]
  }
}

Get a single vault

GET
https://api.prompteasy.eu/v1/vaults/{vault}

Parameters

vaultintegerrequiredpath

Response

200OKVault

Vault object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a single vault
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()
200
{
  "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

PUT
https://api.prompteasy.eu/v1/vaults/{vault}

Body

application/json
namestring
descriptionstring | null
public_vaultboolean

Parameters

vaultintegerrequiredpath

Response

200OKVault

Vault object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Update a vault
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()
Request Body
{
  "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

DELETE
https://api.prompteasy.eu/v1/vaults/{vault}

Parameters

vaultintegerrequiredpath

Response

204No Content

No Content

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Delete a vault
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

GET
https://api.prompteasy.eu/v1/prompts

Response

200OKArray<PromptSnapshot>

Most recent prompts

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a list of most recent prompts
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/prompts

Body

application/json
vault_idinteger
llm_modelstring
llm_system_messagestring
llm_settingsLlmSettings
Show child attributes
tempnumber<float>
top_pnumber<float>
top_kinteger
max_tokensinteger
stop_sequencesArray<string>
titlestring
promptstring
parametersPromptParameters
Show child attributes
param1string
categoriesArray<integer>
keywordsstring | null

Response

201CreatedPrompt

Prompt object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create a new prompt
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()
Request Body
{
  "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)

GET
https://api.prompteasy.eu/v1/prompts/search

Parameters

searchstringquery
vault_idintegerquery
category_idintegerquery

Response

200OKPaginatedPrompts

A paginated list of prompts

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Search for prompts (alternative GET method)
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

POST
https://api.prompteasy.eu/v1/prompts/search

Body

application/json
searchstring
vault_idinteger
category_idinteger

Response

200OKPaginatedPrompts

A paginated list of prompts

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Search for prompts
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()
Request Body
{
  "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

POST
https://api.prompteasy.eu/v1/prompts/{prompt}/detach

Parameters

promptstring<uuid>requiredpath

Response

204No Content

No Content

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Detach a prompt
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

POST
https://api.prompteasy.eu/v1/prompts/{prompt}/attach

Body

application/json
vault_idinteger

Parameters

promptstring<uuid>requiredpath

Response

204No Content

No Content

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Attach a prompt
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()
Request Body
{
  "vault_id": 1
}
422
{
  "message": "Validation failed",
  "errors": {
    "name": [
      "Email required"
    ]
  }
}

Get a single prompt

GET
https://api.prompteasy.eu/v1/prompts/{prompt}

Parameters

promptstring<uuid>requiredpath
for_editbooleanfalsequery

If true, disables transparency template injection and skips generating an executed receipt.

X-PE-Team-IDintegerheader

Optional team ID override for CFO board execution telemetry.

X-PE-Expected-LLM-Modelstringheader

Optional expected LLM model override for CFO board execution telemetry.

Response

200OKPrompt

Prompt object with X-PE-Execution-ID header for CFO board execution telemetry.

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a single prompt
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()
200
{
  "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

DELETE
https://api.prompteasy.eu/v1/prompts/{prompt}

Parameters

promptstring<uuid>requiredpath

Response

204No Content

No Content

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Delete a prompt
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)

GET
https://api.prompteasy.eu/v1/prompts/{prompt}/{version}

Parameters

promptstring<uuid>requiredpath
versionintegerrequiredpath

The version number of the prompt

X-PE-Team-IDintegerheader

Optional team ID override for CFO board execution telemetry.

X-PE-Expected-LLM-Modelstringheader

Optional expected LLM model override for CFO board execution telemetry.

Response

200OKPrompt

Prompt object with X-PE-Execution-ID header for CFO board execution telemetry.

401Unauthorized

Unauthorized

403Forbidden

Forbidden

404Not Found

Prompt or version not found

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a specific version of a prompt (current or history)
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()
200
{
  "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

GET
https://api.prompteasy.eu/v1/prompts/{prompt}/suggestions

Parameters

promptstring<uuid>requiredpath

Response

200OKArray<PromptSuggestion>

A list of prompt suggestions

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get prompt suggestions
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()
200
[
  {
    "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

GET
https://api.prompteasy.eu/v1/prompts/{prompt}/history

Parameters

promptstring<uuid>requiredpath

Response

200OKArray<PromptHistory>

A list of prompt history

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get prompt history
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/suggestions

Body

application/json
prompt_idstring<uuid>
llm_modelstring
llm_system_messagestring
llm_settingsLlmSettings
Show child attributes
tempnumber<float>
top_pnumber<float>
top_kinteger
max_tokensinteger
stop_sequencesArray<string>
titlestring
promptstring
parametersPromptParameters
Show child attributes
param1string
pivotPromptSuggestionPivot
Show child attributes
categoriesArray<integer>
keywordsstring | null

Response

201CreatedPromptSuggestion

Prompt suggestion object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create a new prompt suggestion
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/suggestions/{suggestion}

Parameters

suggestionstring<uuid>requiredpath

Response

200OKPromptSuggestion

Prompt suggestion object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a single prompt suggestion
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()
200
{
  "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

PUT
https://api.prompteasy.eu/v1/suggestions/{suggestion}/reject

Parameters

suggestionstring<uuid>requiredpath

Response

204No Content

No Content

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Reject a prompt suggestion
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

PUT
https://api.prompteasy.eu/v1/suggestions/{suggestion}/approve

Parameters

suggestionstring<uuid>requiredpath

Response

200OKPrompt

Prompt object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Approve a prompt suggestion
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()
200
{
  "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

GET
https://api.prompteasy.eu/v1/history/{history}

Parameters

historystring<uuid>requiredpath

Response

200OKPromptHistory

Prompt history object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a single prompt history
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()
200
{
  "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

PUT
https://api.prompteasy.eu/v1/history/{history}/restore

Parameters

historystring<uuid>requiredpath

Response

200OKPrompt

Prompt object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Restore a prompt history
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()
200
{
  "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

GET
https://api.prompteasy.eu/v1/detached-prompts

Response

200OKPaginatedPrompts

A paginated list of detached prompts

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a list of detached prompts
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()
200
{
  "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

GET
https://api.prompteasy.eu/v1/detached-prompts/{prompt}

Parameters

promptstring<uuid>requiredpath

Response

200OKPrompt

Prompt object

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a single detached prompt
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()
200
{
  "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

POST
https://api.prompteasy.eu/v1/ai/consult

Body

application/json
categoriesArray<string>
titlestring
promptstring

Response

200OKAiConsultResponse

AI consult response

401Unauthorized

Unauthorized

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Consult AI for prompt improvement
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/migrations

Response

200OKMigrationStatusResponse

Number of prompts that need migration

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Check for prompts that need migration
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()
200
{
  "prompts": 5
}

Migrate prompts to default vault

POST
https://api.prompteasy.eu/v1/migrations

Response

204No Content

No Content

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Migrate prompts to default vault
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

POST
https://api.prompteasy.eu/v1/export

Body

application/json
vault_idinteger
category_idinteger

Response

200OKstring<binary>

CSV file download

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Export prompts to CSV
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()
Request Body
{
  "vault_id": 1,
  "category_id": 1
}
<binary>
{
  "message": "Validation failed",
  "errors": {
    "name": [
      "Email required"
    ]
  }
}

Get a list of categories

GET
https://api.prompteasy.eu/v1/categories

Response

200OKArray<Category>

A list of categories

401Unauthorized

Unauthorized

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a list of categories
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/categories

Body

application/json
namestring
slugstring
descriptionstring

Response

201CreatedCategory

Category object

401Unauthorized

Unauthorized

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create a new category
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/categories/{category}

Parameters

categoryintegerrequiredpath

Response

200OKCategory

Category object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a single category
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()
200
{
  "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

PUT
https://api.prompteasy.eu/v1/categories/{category}

Body

application/json
namestring
slugstring
descriptionstring

Parameters

categoryintegerrequiredpath

Response

200OKCategory

Category object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Update a category
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()
Request Body
{
  "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

DELETE
https://api.prompteasy.eu/v1/categories/{category}

Parameters

categoryintegerrequiredpath

Response

204No Content

No Content

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Delete a category
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

POST
https://api.prompteasy.eu/v1/slugify

Body

application/json
textstring

Response

200OKSlug

Slug object

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Generate a slug from a string
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/user

Response

200OKUserWithDevices

User object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get the user's own details
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()
200
{
  "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

PUT
https://api.prompteasy.eu/v1/user

Body

application/json
namestring
emailstring
passwordstring
password_confirmationstring
current_passwordstring

Response

200OKUser

User object

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Update own user details
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()
Request Body
{
  "name": "string",
  "email": "string",
  "password": "string",
  "password_confirmation": "string",
  "current_password": "string"
}
200
{
  "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

POST
https://api.prompteasy.eu/v1/user/aup

Response

200OKobject

AUP accepted or already agreed

401Unauthorized

Unauthorized

403Forbidden

Forbidden

404Not Found

AUP contract not found

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Accept latest Acceptable Use Policy
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()
200
{
  "message": "AUP accepted."
}

Remove own safe devices which doesn't require 2FA code

DELETE
https://api.prompteasy.eu/v1/user/2fa/devices

Response

204No Content

No Content

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Remove own safe devices which doesn't require 2FA code
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

POST
https://api.prompteasy.eu/v1/user/2fa/recovery-codes/view

Body

application/json
current_passwordstring

Response

200OKRecoveryCodesList

User recovery codes object

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Show current user recovery codes
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()
Request Body
{
  "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

POST
https://api.prompteasy.eu/v1/user/2fa/recovery-codes/regenerate

Body

application/json
current_passwordstring

Response

200OKRecoveryCodesList

User recovery codes object

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Generate recovery codes for current user
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/users

Response

200OKArray<User>

A list of users

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a list of users in the tenant
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/users

Body

application/json
namestring
emailstring
user_levelstring
superadmin_capabilitiesArray<string> | nulloperativefinancelegal

Granular capabilities array for superadmin users (operative, finance, legal)

Response

201CreatedUser

User object

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create a new user
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()
Request Body
{
  "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)

POST
https://api.prompteasy.eu/v1/users/service-account

Body

application/json
namestring
is_adminboolean
api_accessboolean

Whether the service account has API access

Response

201CreatedServiceAccount

Service account object with token

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create a service account (bot user)
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/users/{user}

Parameters

userintegerrequiredpath

Response

200OKUser

User object

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get user details
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()
200
{
  "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

PUT
https://api.prompteasy.eu/v1/users/{user}

Body

application/json
One of
namestring
emailstring
passwordstring
password_confirmationstring
email_verified_atboolean
user_levelstring
superadmin_capabilitiesArray<string> | nulloperativefinancelegal

Granular capabilities array for superadmin users (operative, finance, legal)

namestring
emailstring
passwordstring
password_confirmationstring
email_verified_atboolean
user_levelstring
api_accessboolean

API access configuration (only available for service accounts/bot users on Enterprise plan)

Parameters

userintegerrequiredpath

Response

200OKUser

User object

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Update a user
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()
Request Body
{
  "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

DELETE
https://api.prompteasy.eu/v1/users/{user}

Parameters

userintegerrequiredpath

Response

204No Content

No Content

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Delete a user
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

DELETE
https://api.prompteasy.eu/v1/users/{user}/2fa

Parameters

userintegerrequiredpath

Response

204No Content

No Content

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Remove current user 2FA and send email notification to user to set up 2FA again
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

GET
https://api.prompteasy.eu/v1/metadata

Response

200OKHeartbeatMetadata

User metadata

401Unauthorized

Unauthorized

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get active user and tenant metadata
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()
200
{
  "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

GET
https://api.prompteasy.eu/v1/teams

Response

200OKArray<Team>

A list of teams

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a list of teams
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/teams

Body

application/json
namestring

Team name

user_idinteger

User id to be added as admin

Response

201CreatedTeam

Team object

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create a new team
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/teams/{team}

Parameters

teamintegerrequiredpath

Response

200OKTeam & object

Team object with users

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a single team
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()
200
{
  "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

PUT
https://api.prompteasy.eu/v1/teams/{team}

Body

application/json
namestring

Team name

user_idinteger

User id to be added as admin

Parameters

teamintegerrequiredpath

Response

200OKTeam

Team object

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Update a team
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()
Request Body
{
  "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

DELETE
https://api.prompteasy.eu/v1/teams/{team}

Parameters

teamintegerrequiredpath

Response

204No Content

No Content

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Delete a team
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

GET
https://api.prompteasy.eu/v1/teams/{team}/members

Parameters

teamintegerrequiredpath

Response

200OKTeam & object

Team object with users

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a list of users in a team
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()
200
{
  "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

POST
https://api.prompteasy.eu/v1/teams/{team}/members

Body

application/json
idinteger

User id

rolestring

Parameters

teamintegerrequiredpath

Response

200OKTeam & object

Team object with users

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Add a member to a team
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/teams/{team}/vaults

Parameters

teamintegerrequiredpath

Response

200OKArray<Vault>

A list of vaults

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get a list of vaults in a team
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()
200
[
  {
    "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

PUT
https://api.prompteasy.eu/v1/teams/{team}/members/{user}

Body

application/json
rolestring

Parameters

teamintegerrequiredpath
userintegerrequiredpath

Response

200OKTeam & object

Team object with users

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Edit a member's role in a team
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()
Request Body
{
  "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

DELETE
https://api.prompteasy.eu/v1/teams/{team}/members/{user}

Parameters

teamintegerrequiredpath
userintegerrequiredpath

Response

204No Content

No Content

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Remove a member from a team
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

GET
https://api.prompteasy.eu/v1/agreements/check

Parameters

agreement_forstringquery

Specific 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

200OKboolean | object

Agreement compliance check results.

401Unauthorized

Unauthorized

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Check agreement signature compliance status
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()
200
true

List all signed agreements for the tenant

GET
https://api.prompteasy.eu/v1/agreements

Response

200OKArray<Agreement>

A list of signed agreements

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
List all signed agreements for the tenant
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()
200
[
  {
    "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

GET
https://api.prompteasy.eu/v1/agreements/{agreement}

Parameters

agreementstring<uuid>requiredpath

Response

200OKAgreement

Agreement details

401Unauthorized

Unauthorized

403Forbidden

Forbidden

404Not Found

Not Found

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get details of a specific signed agreement
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()
200
{
  "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

POST
https://api.prompteasy.eu/v1/agreements/{contract}/{user}/sign

Body

application/json
namestringrequired

Must exactly match the user's name

Parameters

contractstring<uuid>requiredpath
userintegerrequiredpath

Response

201CreatedAgreement

Contract successfully signed

401Unauthorized

Unauthorized

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Sign a contract
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/tenant

Response

200OKTenant

Tenant object

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get active tenant
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()
200
{
  "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

PUT
https://api.prompteasy.eu/v1/tenant

Body

application/json
is_individualboolean
ai_enabledboolean
suggestion_auto_approveboolean
pagination_per_pageinteger
high_risk_aiboolean

Whether high risk AI features are enabled

Response

200OKTenant

Tenant object

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Update a tenant
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/tenant/custody

Response

200OKstring<binary>

A raw, unencrypted JSONL file containing the compliance details of the tenant.

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Download unencrypted compliance data
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()
200
"<binary>"

Transparency Templates

Read more about transparency templates from Transparency Templates documentation.

List all transparency templates

GET
https://api.prompteasy.eu/v1/transparency-templates

Response

200OKArray<TransparencyTemplate>

A list of transparency templates.

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
List all transparency templates
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/transparency-templates

Body

application/json
templatestringrequired

Response

201CreatedTransparencyTemplate

Transparency template created successfully.

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create a transparency template
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/transparency-templates/vaults

Response

200OKArray<object>

A list of vaults with transparency template binding info.

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
List all vaults for transparency templates tool
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()
200
[
  {
    "id": 0,
    "name": "string",
    "transparency_template_id": "550e8400-e29b-41d4-a716-446655440000"
  }
]

Bind a transparency template to a vault

POST
https://api.prompteasy.eu/v1/transparency-templates/vaults/{vault}/bind

Body

application/json
transparency_template_idstring<uuid>required

Parameters

vaultintegerrequiredpath

Response

200OK

Vault successfully bound.

403Forbidden

Forbidden

404Not Found

Not Found

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Bind a transparency template to a vault
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()
Request Body
{
  "transparency_template_id": "550e8400-e29b-41d4-a716-446655440000"
}
422
{
  "message": "Validation failed",
  "errors": {
    "name": [
      "Email required"
    ]
  }
}

Unbind the transparency template from a vault

POST
https://api.prompteasy.eu/v1/transparency-templates/vaults/{vault}/unbind

Parameters

vaultintegerrequiredpath

Response

200OK

Vault successfully unbound.

403Forbidden

Forbidden

404Not Found

Not Found

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Unbind the transparency template from a vault
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

GET
https://api.prompteasy.eu/v1/transparency-templates/{template}

Parameters

templatestring<uuid>requiredpath

Response

200OKTransparencyTemplate

Transparency template details

403Forbidden

Forbidden

404Not Found

Not Found

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get details of a single transparency template
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()
200
{
  "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

PUT
https://api.prompteasy.eu/v1/transparency-templates/{template}

Body

application/json
templatestringrequired

Parameters

templatestring<uuid>requiredpath

Response

200OKTransparencyTemplate

Transparency template updated successfully

403Forbidden

Forbidden

404Not Found

Not Found

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Update a transparency template
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()
Request Body
{
  "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

DELETE
https://api.prompteasy.eu/v1/transparency-templates/{template}

Parameters

templatestring<uuid>requiredpath

Response

204No Content

No Content

403Forbidden

Forbidden

404Not Found

Not Found

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Delete a transparency template
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

GET
https://api.prompteasy.eu/v1/audit

Response

200OKArray<AuditLog>

A list of audit log entries

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get the audit log for the tenant
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()
200
[
  {
    "id": 0,
    "ip": "string",
    "user": {
      "id": 0,
      "name": "string",
      "initials": "string"
    },
    "operation": "string",
    "target": "string"
  }
]

Export audit logs as unencrypted JSONL

GET
https://api.prompteasy.eu/v1/audit/export

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>query

Optional start time filter (ISO 8601 string)

end_timestring<date-time>query

Optional end time filter (ISO 8601 string)

Response

200OKstring<binary>

A raw JSONL file containing tenant header and audit log entries.

401Unauthorized

Unauthorized

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Export audit logs as unencrypted JSONL
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()
200
"<binary>"

Get the audit log for a specific user

GET
https://api.prompteasy.eu/v1/audit/users/{user}

Parameters

userintegerrequiredpath

Response

200OKArray<AuditLog>

A list of audit log entries

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get the audit log for a specific user
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()
200
[
  {
    "id": 0,
    "ip": "string",
    "user": {
      "id": 0,
      "name": "string",
      "initials": "string"
    },
    "operation": "string",
    "target": "string"
  }
]

Get the audit log for a specific target

GET
https://api.prompteasy.eu/v1/audit/target/{targetTable}/{id}

Parameters

targetTablestringrequiredpath
idintegerrequiredpath

Response

200OKArray<AuditLog>

A list of audit log entries

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get the audit log for a specific target
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()
200
[
  {
    "id": 0,
    "ip": "string",
    "user": {
      "id": 0,
      "name": "string",
      "initials": "string"
    },
    "operation": "string",
    "target": "string"
  }
]

Get the audit log for a specific date range

GET
https://api.prompteasy.eu/v1/audit/start/{startTime}/end/{endTime}

Parameters

startTimestring<date-time>requiredpath
endTimestring<date-time>requiredpath

Response

200OKArray<AuditLog>

A list of audit log entries

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get the audit log for a specific date range
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()
200
[
  {
    "id": 0,
    "ip": "string",
    "user": {
      "id": 0,
      "name": "string",
      "initials": "string"
    },
    "operation": "string",
    "target": "string"
  }
]

Get the audit log starting from a specific time

GET
https://api.prompteasy.eu/v1/audit/start/{startTime}

Parameters

startTimestring<date-time>requiredpath

Response

200OKArray<AuditLog>

A list of audit log entries

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get the audit log starting from a specific time
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()
200
[
  {
    "id": 0,
    "ip": "string",
    "user": {
      "id": 0,
      "name": "string",
      "initials": "string"
    },
    "operation": "string",
    "target": "string"
  }
]

Get the cryptographic vault receipts for the tenant

GET
https://api.prompteasy.eu/v1/audit/receipts

Response

200OKPaginatedVaultReceipts

A paginated list of cryptographic vault receipts

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get the cryptographic vault receipts for the tenant
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()
200
{
  "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

GET
https://api.prompteasy.eu/v1/audit/receipts/{receipt}

Parameters

receiptstring<uuid>requiredpath

Response

200OKVaultReceipt

Detailed vault receipt representation

403Forbidden

Forbidden

404Not Found

Receipt not found

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get detailed cryptographic vault receipt details
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()
200
{
  "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

GET
https://api.prompteasy.eu/v1/audit/receipts/{receipt}/verify

Parameters

receiptstring<uuid>requiredpath

Response

200OKVaultReceiptVerification

Verification result of a cryptographic vault receipt

403Forbidden

Forbidden

404Not Found

Receipt not found

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Verify the cryptographic vault receipt integrity
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()
200
{
  "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

GET
https://api.prompteasy.eu/v1/tokens

Response

200OKArray<TokenInfo>

List of tokens

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get personal access tokens
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/tokens/bot/{user}

Parameters

userintegerrequiredpath

Response

200OKToken

Token response

400Bad Request

Target user is not a bot

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Issue a access token for a bot user
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()
200
{
  "token": "1|..."
}

Issue a personal access token

POST
https://api.prompteasy.eu/v1/tokens/personal

Response

200OKToken

Token response

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Issue a personal access token
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()
200
{
  "token": "1|..."
}

Revoke a access token

DELETE
https://api.prompteasy.eu/v1/tokens/{tokenId}

Parameters

tokenIdstringrequiredpath

Response

200OKobject

Token revoked successfully

404Not Found

Token not found or unauthorized

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Revoke a access token
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()
200
{
  "message": "Token revoked."
}

API Keys

Operations related to API keys (generate and revoke your Enterprise X-Api-Key).

List Enterprise API Keys

GET
https://api.prompteasy.eu/v1/api-keys

Response

200OKArray<ApiKey>

List of API keys

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
List Enterprise API Keys
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/api-keys

Body

application/json
servicestringrequired

Response

201CreatedApiKeyWithToken

API key created successfully

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create a new Enterprise API Key
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()
Request Body
{
  "service": "my-production-backend"
}
201
{
  "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

DELETE
https://api.prompteasy.eu/v1/api-keys/{apiKey}

Parameters

apiKeyintegerrequiredpath

Response

200OKobject

API key revoked successfully

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Revoke an Enterprise API Key
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()
200
{
  "message": "API key revoked."
}

Telemetry

Operations related to post-LLM prompt execution telemetry reporting.

Report execution telemetry details post-LLM call

POST
https://api.prompteasy.eu/v1/executions/{execution}/telemetry

Body

application/json
actual_llm_modelstring

Actual LLM model name used for completion

prompt_tokensinteger>= 0

Number of prompt/input tokens used

completion_tokensinteger>= 0

Number of output/completion tokens generated

cached_prompt_tokensinteger>= 0

Number of cached prompt tokens

reasoning_tokensinteger>= 0

Number of reasoning tokens used

latency_msinteger>= 0

Total request execution duration in milliseconds

ttft_msinteger>= 0

Time to first token in milliseconds

finish_reasonstring

LLM completion finish reason

statusinteger123

Execution status (1 = fetched, 2 = completed, 3 = failed)

Parameters

executionstring<uuid>requiredpath

Response

200OKPromptExecutionTelemetryResponse

Telemetry recorded successfully

403Forbidden

Forbidden

404Not Found

Not Found

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Report execution telemetry details post-LLM call
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/analytics/cfo-board

Parameters

start_datestring<date>query
end_datestring<date>query

Response

200OKCfoBoardAnalyticsResponse

CFO board analytics data

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Get CFO Board Analytics
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()
200
{
  "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

POST
https://api.prompteasy.eu/v1/analytics/cfo-board/settings

Body

application/json
cfo_board_enabledbooleanrequired

Enable or disable CFO Board analytics for the tenant

Response

200OKCfoBoardSettingsResponse

Settings updated successfully

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Update CFO Board Tenant Settings
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()
Request Body
{
  "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

GET
https://api.prompteasy.eu/v1/analytics/cfo-board/rates

Response

200OKArray<TenantModelRate>

List of configured model rates

403Forbidden

Forbidden

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
List Tenant Model Rates
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()
200
[
  {
    "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

POST
https://api.prompteasy.eu/v1/analytics/cfo-board/rates

Body

application/json
model_patternstringrequired

Model pattern string or regex to match against actual LLM models

token_unitinteger>= 1

Token unit divisor for pricing (default 1,000,000)

prompt_token_cost_centsnumber>= 0

Cost in cents per token_unit prompt tokens

completion_token_cost_centsnumber>= 0

Cost in cents per token_unit completion tokens

cached_prompt_token_cost_centsnumber>= 0

Cost in cents per token_unit cached prompt tokens

reasoning_token_cost_centsnumber>= 0

Cost in cents per token_unit reasoning tokens

Response

201CreatedTenantModelRate

Rate created successfully

403Forbidden

Forbidden

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Create Tenant Model Rate
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()
Request Body
{
  "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

PUT
https://api.prompteasy.eu/v1/analytics/cfo-board/rates/{rate}

Body

application/json
model_patternstring
token_unitinteger>= 1
prompt_token_cost_centsnumber>= 0
completion_token_cost_centsnumber>= 0
cached_prompt_token_cost_centsnumber>= 0
reasoning_token_cost_centsnumber>= 0

Parameters

rateintegerrequiredpath

Response

200OKTenantModelRate

Rate updated successfully

403Forbidden

Forbidden

404Not Found

Not Found

422Unprocessable EntityValidationError

Unprocessable Entity

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Update Tenant Model Rate
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()
Request Body
{
  "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

DELETE
https://api.prompteasy.eu/v1/analytics/cfo-board/rates/{rate}

Parameters

rateintegerrequiredpath

Response

204No Content

Rate deleted successfully

403Forbidden

Forbidden

404Not Found

Not Found

Authorization

ApiKeyAuthapiKey in header
BearerAuthhttp (bearer)
Delete Tenant Model Rate
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

object
databaseboolean

Health of the EU-West project database

workersboolean

Health of the background queue workers

payment_gatewayboolean

Health of the external payment gateway (Stripe)

optional_aiboolean

Health of the optional AI interface (Gemini)

emailboolean

Health of the email interface (Mailgun)

mcpboolean

Health of the internal MCP server

Example
{
  "database": true,
  "workers": true,
  "payment_gateway": true,
  "optional_ai": true,
  "email": true,
  "mcp": true
}

Heartbeat

object
timestring
Example
{
  "time": "2025-11-25T13:12:29.000Z"
}

Auth

object
namestring
tokenstring

access token

aup_missingboolean

Indicates 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

Show child attributes
codestring
used_atstring<date-time> | null
Example
{
  "name": "John Doe",
  "token": "string",
  "aup_missing": true,
  "recovery_codes": [
    {
      "code": "1234-5678",
      "used_at": null
    }
  ]
}

TwoFactorSetup

object
messagestring
qr_codestring

2FA setup QR code as SVG string

uristring

2FA uri

stringstring

2FA shared secret

Example
{
  "message": "Two-factor authentication setup required",
  "qr_code": "string",
  "uri": "otpauth://totp/PromptEasy.eu...",
  "string": "J64LMYRKWG43ZW2MP..."
}

HeartbeatMetadata

object
user_idinteger
userstring
levelstring
superadmin_capabilitiesArray<string> | nulloperativefinancelegal

Granular capabilities array for superadmin users (operative, finance, legal)

tenantstring
days_to_next_paymentinteger
is_trialboolean
has_set_payment_detailsboolean
country_codestring
individualboolean
ai_enabledboolean
auto_approve_suggestionsboolean
cfo_board_enabledboolean

Indicates whether the CFO Board telemetry pipeline is enabled for the tenant

planstring
aup_missingboolean

Indicates whether the user still needs to agree to the latest Acceptable Use Policy

teamsArray<UserTeam>
Show child attributes
idinteger
namestring
rolestring
Example
{
  "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

object
idinteger
namestring
rolestring
Example
{
  "id": 1,
  "name": "Tech Team",
  "role": "viewer"
}

LoginRequest

object
emailstringrequired
passwordstringrequired
rememberboolean
Example
{
  "email": "foo@bar.invalid",
  "password": "V3rys3cr3tP@ssw0rd",
  "remember": true
}

TwoFactorRequest

object
emailstringrequired
passwordstringrequired
2fa_codestringrequired
Example
{
  "email": "foo@bar.invalid",
  "password": "V3rys3cr3tP@ssw0rd",
  "2fa_code": 123456
}

RegisterRequest

object
namestringrequired
emailstringrequired
tenant_namestring
tenant_emailstring
country_codestringrequired
is_individualbooleanrequired
postal_codestring
vat_idstring
plan_typestringrequired
promotion_codestring | null
terms_acceptedbooleanrequired
Example
{
  "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
}

ForgotPasswordRequest

object
emailstringrequired
Example
{
  "email": "foo@bar.invalid"
}

ForgotPasswordResponse

object
statusstring
Example
{
  "status": "We have emailed your password reset link."
}

UpdateTenantRequest

object
is_individualboolean
ai_enabledboolean
suggestion_auto_approveboolean
pagination_per_pageinteger
high_risk_aiboolean

Whether high risk AI features are enabled

Example
{
  "is_individual": false,
  "ai_enabled": true,
  "suggestion_auto_approve": true,
  "pagination_per_page": 20,
  "high_risk_ai": true
}

Country

object
codestring
namestring
Example
{
  "code": "BE",
  "name": "Belgium"
}

TeamRequest

object
namestring

Team name

user_idinteger

User id to be added as admin

Example
{
  "name": "Tech Team",
  "user_id": 1
}

AddMemberToTeamRequest

object
idinteger

User id

rolestring
Example
{
  "id": 1,
  "role": "viewer"
}

EditMemberRoleInTeamRequest

object
rolestring
Example
{
  "role": "viewer"
}

StoreUserRequest

object
namestring
emailstring
user_levelstring
superadmin_capabilitiesArray<string> | nulloperativefinancelegal

Granular capabilities array for superadmin users (operative, finance, legal)

Example
{
  "name": "string",
  "email": "string",
  "user_level": "string",
  "superadmin_capabilities": [
    "operative",
    "finance",
    "legal"
  ]
}

CreateServiceAccountRequest

object
namestring
is_adminboolean
api_accessboolean

Whether the service account has API access

Example
{
  "name": "Bot User",
  "is_admin": false,
  "api_access": true
}

UpdateUserRequest

object
namestring
emailstring
passwordstring
password_confirmationstring
email_verified_atboolean
user_levelstring
superadmin_capabilitiesArray<string> | nulloperativefinancelegal

Granular capabilities array for superadmin users (operative, finance, legal)

Example
{
  "name": "string",
  "email": "string",
  "password": "string",
  "password_confirmation": "string",
  "email_verified_at": true,
  "user_level": "string",
  "superadmin_capabilities": [
    "operative",
    "finance",
    "legal"
  ]
}

UpdateOwnRequest

object
namestring
emailstring
passwordstring
password_confirmationstring
current_passwordstring
Example
{
  "name": "string",
  "email": "string",
  "password": "string",
  "password_confirmation": "string",
  "current_password": "string"
}

CurrentPasswordRequest

object
current_passwordstring
Example
{
  "current_password": "string"
}

VaultRequest

object
namestring
descriptionstring
team_idinteger | null
tenant_vaultboolean
public_vaultboolean
Example
{
  "name": "My Vault",
  "description": "A vault for my prompts",
  "team_id": 1,
  "tenant_vault": true,
  "public_vault": true
}

AttachVaultRequest

object
team_idinteger | null
tenant_vaultboolean
Example
{
  "team_id": 1,
  "tenant_vault": true
}

CategoryRequest

object
namestring
slugstring
descriptionstring
Example
{
  "name": "My Category",
  "slug": "my-category",
  "description": "A category for my prompts"
}

SlugifyRequest

object
textstring
Example
{
  "text": "Some Text"
}

PromptRequest

object
vault_idinteger
llm_modelstring
llm_system_messagestring
llm_settingsLlmSettings
Show child attributes
tempnumber<float>
top_pnumber<float>
top_kinteger
max_tokensinteger
stop_sequencesArray<string>
titlestring
promptstring
parametersPromptParameters
Show child attributes
param1string
categoriesArray<integer>
keywordsstring | null
Example
{
  "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"
}

AttachPromptRequest

object
vault_idinteger
Example
{
  "vault_id": 1
}

SearchRequest

object
searchstring
vault_idinteger
category_idinteger
Example
{
  "search": "search terms",
  "vault_id": 1,
  "category_id": 1
}

PromptSuggestionRequest

object
prompt_idstring<uuid>
llm_modelstring
llm_system_messagestring
llm_settingsLlmSettings
Show child attributes
tempnumber<float>
top_pnumber<float>
top_kinteger
max_tokensinteger
stop_sequencesArray<string>
titlestring
promptstring
parametersPromptParameters
Show child attributes
param1string
pivotPromptSuggestionPivot
Show child attributes
categoriesArray<integer>
keywordsstring | null
Example
{
  "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

object
categoriesArray<string>
titlestring
promptstring
Example
{
  "categories": [
    "coding"
  ],
  "title": "My Prompt",
  "prompt": "Write a blog post about coffee"
}

ExportRequest

object
vault_idinteger
category_idinteger
Example
{
  "vault_id": 1,
  "category_id": 1
}

Tenant

object
idstring<uuid>
namestring
emailstring
countrystring
postal_codestring
vat_idstring
created_atstring<date-time>
updated_atstring<date-time>
pm_typestring
pm_last_fourstring
planobject
Show child attributes
idinteger
namestring
slugstring
paymentstring
seatsinteger
durationstring
price_vat0integer
vatinteger
price_with_vatinteger
currencystring
created_atstring<date-time>
updated_atstring<date-time>
tax_exemptboolean
quantityinteger
ends_atstring<date-time>
billing_portalstring
high_risk_aiboolean
cfo_board_enabledboolean

Indicates whether the CFO Board telemetry pipeline is enabled for the tenant

compliance_monthsinteger
contractsobject
Show child attributes
tosTenantContractStatus
Show child attributes
signedboolean
signed_atstring<date-time>
signatorystring
privacyTenantContractStatus
Show child attributes
signedboolean
signed_atstring<date-time>
signatorystring
high_risk_aiTenantContractStatus
Show child attributes
signedboolean
signed_atstring<date-time>
signatorystring
settingsTenantSettings
Show child attributes
is_individualboolean
ai_enabledboolean
suggestion_auto_approveboolean
pagination_per_pageinteger
Example
{
  "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

object
signedboolean
signed_atstring<date-time>
signatorystring
Example
{
  "signed": true,
  "signed_at": "2025-11-25T13:12:29.000Z",
  "signatory": "John Doe"
}

Team

object
idinteger
namestring
tenant_idinteger
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "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

object
idinteger
namestring
tenant_idinteger
created_atstring<date-time>
updated_atstring<date-time>
usersArray<User>
Show child attributes
idinteger
namestring
emailstring
email_verified_atstring<date-time>
user_levelstring
superadmin_capabilitiesArray<string> | nulloperativefinancelegal

Granular capabilities array for superadmin users (operative, finance, legal)

created_atstring<date-time>
updated_atstring<date-time>
tenant_idinteger
last_active_atstring<date-time>
aup_accepted_atstring<date-time> | null
aup_version_numberinteger | null
tokensArray<TokenInfo>

In some cases superadmin can see user tokens

Show child attributes
idinteger
tokenstring
created_atstring<date-time>
last_used_atstring<date-time> | null
Example
{
  "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

object
idinteger
namestring
emailstring
email_verified_atstring<date-time>
user_levelstring
superadmin_capabilitiesArray<string> | nulloperativefinancelegal

Granular capabilities array for superadmin users (operative, finance, legal)

created_atstring<date-time>
updated_atstring<date-time>
tenant_idinteger
last_active_atstring<date-time>
aup_accepted_atstring<date-time> | null
aup_version_numberinteger | null
tokensArray<TokenInfo>

In some cases superadmin can see user tokens

Show child attributes
idinteger
tokenstring
created_atstring<date-time>
last_used_atstring<date-time> | null
Example
{
  "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

object
ipstring
added_atinteger<timestamp>
Example
{
  "ip": "255.255.255.255",
  "added_at": 1765205985
}

UserWithDevices

object
userUser
Show child attributes
idinteger
namestring
emailstring
email_verified_atstring<date-time>
user_levelstring
superadmin_capabilitiesArray<string> | nulloperativefinancelegal

Granular capabilities array for superadmin users (operative, finance, legal)

created_atstring<date-time>
updated_atstring<date-time>
tenant_idinteger
last_active_atstring<date-time>
aup_accepted_atstring<date-time> | null
aup_version_numberinteger | null
tokensArray<TokenInfo>

In some cases superadmin can see user tokens

Show child attributes
idinteger
tokenstring
created_atstring<date-time>
last_used_atstring<date-time> | null
devicesArray<UserDevice>
Show child attributes
ipstring
added_atinteger<timestamp>
Example
{
  "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

object
userUser
Show child attributes
idinteger
namestring
emailstring
email_verified_atstring<date-time>
user_levelstring
superadmin_capabilitiesArray<string> | nulloperativefinancelegal

Granular capabilities array for superadmin users (operative, finance, legal)

created_atstring<date-time>
updated_atstring<date-time>
tenant_idinteger
last_active_atstring<date-time>
aup_accepted_atstring<date-time> | null
aup_version_numberinteger | null
tokensArray<TokenInfo>

In some cases superadmin can see user tokens

Show child attributes
idinteger
tokenstring
created_atstring<date-time>
last_used_atstring<date-time> | null
tokenstring
Example
{
  "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

object
codestring
used_atstring<date-time> | null
Example
{
  "code": "1234-5678",
  "used_at": null
}

RecoveryCodesList

object
messagestring
recovery_codesArray<RecoveryCode>
Show child attributes
codestring
used_atstring<date-time> | null
Example
{
  "message": "Recovery codes generated",
  "recovery_codes": [
    {
      "code": "1234-5678",
      "used_at": null
    }
  ]
}

AuditLog

object
idinteger
ipstring
userAuditLogUser
Show child attributes
idinteger | null
namestring
initialsstring
operationstring
targetstring
Example
{
  "id": 0,
  "ip": "string",
  "user": {
    "id": 0,
    "name": "string",
    "initials": "string"
  },
  "operation": "string",
  "target": "string"
}

Vault

object
idinteger
tenant_idinteger
team_idinteger | null
tenant_vaultboolean
public_vaultboolean
defaultboolean
namestring
descriptionstring
created_atstring<date-time>
updated_atstring<date-time>
teamTeam
Show child attributes
idinteger
namestring
tenant_idinteger
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "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

object
idstring<uuid>
contract_idstring<uuid> | null
contract_namestring
versioninteger
contract_contentstring
changes_summarystring | null
agreement_forstring
only_for_planstring | null
is_user_contractboolean
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "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

object
idstring<uuid>
tenant_idstring<uuid>
tenant_namestring
contract_idstring<uuid>
signatorystring
signature_hashstring
created_atstring<date-time>
updated_atstring<date-time>
contractContract
Show child attributes
idstring<uuid>
contract_idstring<uuid> | null
contract_namestring
versioninteger
contract_contentstring
changes_summarystring | null
agreement_forstring
only_for_planstring | null
is_user_contractboolean
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "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

object
namestringrequired

Must exactly match the user's name

Example
{
  "name": "John Doe"
}

ResetPasswordRequest

object
emailstring<email>required
passwordstringrequired
password_confirmationstringrequired
Example
{
  "email": "foo@bar.invalid",
  "password": "V3rys3cr3tP@ssw0rdNew",
  "password_confirmation": "V3rys3cr3tP@ssw0rdNew"
}

VaultUpdateRequest

object
namestring
descriptionstring | null
public_vaultboolean
Example
{
  "name": "My Vault",
  "description": "An updated description for my vault",
  "public_vault": true
}

UpdateServiceAccountRequest

object
namestring
emailstring
passwordstring
password_confirmationstring
email_verified_atboolean
user_levelstring
api_accessboolean

API access configuration (only available for service accounts/bot users on Enterprise plan)

Example
{
  "name": "Bot User",
  "email": "bot@tenant.invalid",
  "password": "temporaryPassword123",
  "password_confirmation": "temporaryPassword123",
  "email_verified_at": true,
  "user_level": "user",
  "api_access": true
}

Category

object
idinteger
tenant_idinteger
slugstring
namestring
descriptionstring
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "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"
}

Slug

object
slugstring
Example
{
  "slug": "some-text"
}

PromptSnapshot

object
idstring<uuid>
tenant_idinteger
vault_idinteger
llm_modelstring
titlestring
keywordsstring
created_atstring<date-time>
updated_atstring<date-time>
vaultVault
Show child attributes
idinteger
tenant_idinteger
team_idinteger | null
tenant_vaultboolean
public_vaultboolean
defaultboolean
namestring
descriptionstring
created_atstring<date-time>
updated_atstring<date-time>
teamTeam
Show child attributes
idinteger
namestring
tenant_idinteger
created_atstring<date-time>
updated_atstring<date-time>
categoriesArray<Category>
Show child attributes
idinteger
tenant_idinteger
slugstring
namestring
descriptionstring
created_atstring<date-time>
updated_atstring<date-time>
is_in_vault_receiptsboolean
days_until_safe_deletioninteger
Example
{
  "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

object
idstring<uuid>
tenant_idinteger
vault_idinteger
llm_modelstring
llm_system_messagestring
llm_settingsLlmSettings
Show child attributes
tempnumber<float>
top_pnumber<float>
top_kinteger
max_tokensinteger
stop_sequencesArray<string>
titlestring
promptstring
parametersPromptParameters
Show child attributes
param1string
keywordsstring
prompt_versioninteger
created_atstring<date-time>
updated_atstring<date-time>
vaultVault
Show child attributes
idinteger
tenant_idinteger
team_idinteger | null
tenant_vaultboolean
public_vaultboolean
defaultboolean
namestring
descriptionstring
created_atstring<date-time>
updated_atstring<date-time>
teamTeam
Show child attributes
idinteger
namestring
tenant_idinteger
created_atstring<date-time>
updated_atstring<date-time>
categoriesArray<Category>
Show child attributes
idinteger
tenant_idinteger
slugstring
namestring
descriptionstring
created_atstring<date-time>
updated_atstring<date-time>
is_in_vault_receiptsboolean
days_until_safe_deletioninteger
Example
{
  "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

object
idstring<uuid>
prompt_idstring<uuid>
rejectedboolean
pivotPromptSuggestionPivot
Show child attributes
categoriesArray<integer>
llm_modelstring
llm_system_messagestring
llm_settingsLlmSettings
Show child attributes
tempnumber<float>
top_pnumber<float>
top_kinteger
max_tokensinteger
stop_sequencesArray<string>
titlestring
promptstring
parametersPromptParameters
Show child attributes
param1string
keywordsstring
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "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

object
idstring<uuid>
prompt_idstring<uuid>
pivotobject
llm_modelstring
llm_system_messagestring
llm_settingsLlmSettings
Show child attributes
tempnumber<float>
top_pnumber<float>
top_kinteger
max_tokensinteger
stop_sequencesArray<string>
titlestring
promptstring
parametersPromptParameters
Show child attributes
param1string
keywordsstring
prompt_versioninteger
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "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

object
current_pageinteger
dataArray<PromptSnapshot>
Show child attributes
idstring<uuid>
tenant_idinteger
vault_idinteger
llm_modelstring
titlestring
keywordsstring
created_atstring<date-time>
updated_atstring<date-time>
vaultVault
Show child attributes
idinteger
tenant_idinteger
team_idinteger | null
tenant_vaultboolean
public_vaultboolean
defaultboolean
namestring
descriptionstring
created_atstring<date-time>
updated_atstring<date-time>
teamTeam
Show child attributes
idinteger
namestring
tenant_idinteger
created_atstring<date-time>
updated_atstring<date-time>
categoriesArray<Category>
Show child attributes
idinteger
tenant_idinteger
slugstring
namestring
descriptionstring
created_atstring<date-time>
updated_atstring<date-time>
is_in_vault_receiptsboolean
days_until_safe_deletioninteger
first_page_urlstring<uri>
frominteger
last_pageinteger
last_page_urlstring<uri>
linksArray<PaginationLink>
Show child attributes
urlstring<uri> | null
labelstring
activeboolean
next_page_urlstring<uri> | null
pathstring<uri>
per_pageinteger
prev_page_urlstring<uri> | null
tointeger
totalinteger
Example
{
  "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

object
keywordsstring
promptstring
Example
{
  "keywords": "blog, coffee, writing",
  "prompt": "Write a blog post about [[Topic]]"
}

Token

object
tokenstring
Example
{
  "token": "1|..."
}

TokenInfo

object
idinteger
tokenstring
created_atstring<date-time>
last_used_atstring<date-time> | null
Example
{
  "id": 1,
  "token": "1|...",
  "created_at": "2024-01-15T09:30:00Z",
  "last_used_at": "2024-01-15T09:30:00Z"
}

ValidationError

object
messagestring
errorsValidationErrorErrors
Show child attributes
nameArray<string>
Example
{
  "message": "Validation failed",
  "errors": {
    "name": [
      "Email required"
    ]
  }
}

ServerError

object

API down

any

MigrationStatusResponse

object
promptsinteger
Example
{
  "prompts": 5
}

LlmSettings

object
tempnumber<float>
top_pnumber<float>
top_kinteger
max_tokensinteger
stop_sequencesArray<string>
Example
{
  "temp": 0.7,
  "top_p": 0.9,
  "top_k": 50,
  "max_tokens": 2048,
  "stop_sequences": [
    "stop"
  ]
}

PromptParameters

object
param1string
Example
{
  "param1": "value1"
}

PromptSuggestionPivot

object
categoriesArray<integer>
Example
{
  "categories": [
    1
  ]
}

TenantSettings

object
is_individualboolean
ai_enabledboolean
suggestion_auto_approveboolean
pagination_per_pageinteger
Example
{
  "is_individual": false,
  "ai_enabled": false,
  "suggestion_auto_approve": false,
  "pagination_per_page": 50
}

TransparencyTemplate

object
idstring<uuid>
tenant_idinteger
templatestring
created_atstring<date-time>
updated_atstring<date-time>
is_in_vault_receiptsboolean
days_until_safe_deletioninteger
Example
{
  "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

object
idinteger | null
namestring
initialsstring
Example
{
  "id": 0,
  "name": "string",
  "initials": "string"
}

ValidationErrorErrors

object
nameArray<string>
Example
{
  "name": [
    "Email required"
  ]
}

VaultReceipt

object
idstring<uuid>
datetimestring<date-time>
userobject
Show child attributes
idinteger | null
namestring
initialsstring
prompt_idstring<uuid> | null
prompt_history_idstring<uuid> | null
actionstringmodifiedversionedexecuted
hashstring
signaturestring
promptstring | null
llm_system_messagestring | null
prompt_versioninteger
metadataobject
Example
{
  "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

object
validboolean
receiptVaultReceipt
Show child attributes
idstring<uuid>
datetimestring<date-time>
userobject
Show child attributes
idinteger | null
namestring
initialsstring
prompt_idstring<uuid> | null
prompt_history_idstring<uuid> | null
actionstringmodifiedversionedexecuted
hashstring
signaturestring
promptstring | null
llm_system_messagestring | null
prompt_versioninteger
metadataobject
Example
{
  "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

object
current_pageinteger
dataArray<VaultReceiptListItem>
Show child attributes
idstring<uuid>
datetimestring<date-time>
userobject
Show child attributes
idinteger | null
namestring
initialsstring
actionstringmodifiedversionedexecuted
hashstring
first_page_urlstring<uri>
frominteger
last_pageinteger
last_page_urlstring<uri>
linksArray<PaginationLink>
Show child attributes
urlstring<uri> | null
labelstring
activeboolean
next_page_urlstring<uri> | null
pathstring<uri>
per_pageinteger
prev_page_urlstring<uri> | null
tointeger
totalinteger
Example
{
  "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

object
idstring<uuid>
datetimestring<date-time>
userobject
Show child attributes
idinteger | null
namestring
initialsstring
actionstringmodifiedversionedexecuted
hashstring
Example
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "datetime": "2024-01-15T09:30:00Z",
  "user": {
    "id": 0,
    "name": "string",
    "initials": "string"
  },
  "action": "modified",
  "hash": "string"
}

ApiKey

object
idinteger
servicestring
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "id": 1,
  "service": "my-production-backend",
  "created_at": "2024-01-15T09:30:00Z",
  "updated_at": "2024-01-15T09:30:00Z"
}

ApiKeyWithToken

object
idinteger
servicestring
tokenstring
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "id": 1,
  "service": "my-production-backend",
  "token": "pe_abcdef1234567890abcdef1234567890abcdef12",
  "created_at": "2024-01-15T09:30:00Z",
  "updated_at": "2024-01-15T09:30:00Z"
}

PromptExecutionTelemetryPayload

object
actual_llm_modelstring

Actual LLM model name used for completion

prompt_tokensinteger>= 0

Number of prompt/input tokens used

completion_tokensinteger>= 0

Number of output/completion tokens generated

cached_prompt_tokensinteger>= 0

Number of cached prompt tokens

reasoning_tokensinteger>= 0

Number of reasoning tokens used

latency_msinteger>= 0

Total request execution duration in milliseconds

ttft_msinteger>= 0

Time to first token in milliseconds

finish_reasonstring

LLM completion finish reason

statusinteger123

Execution status (1 = fetched, 2 = completed, 3 = failed)

Example
{
  "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

object
messagestringrequired
execution_idstring<uuid>required
has_telemetrybooleanrequired
statusintegerrequired
Example
{
  "message": "Telemetry recorded successfully.",
  "execution_id": "018f0000-0000-7000-8000-000000000002",
  "has_telemetry": true,
  "status": 2
}

CfoBoardAnalyticsResponse

object
cfo_board_enabledbooleanrequired
periodobjectrequired
Show child attributes
startstring<date>required
endstring<date>required
summaryobjectrequired
Show child attributes
total_executionsintegerrequired
total_estimated_cost_centsintegerrequired
currencystringrequired
by_teamArray<CfoBoardTeamAnalytics>required
Show child attributes
team_idinteger | nullrequired
team_namestringrequired
executions_countintegerrequired
percentagenumber<float>required
estimated_cost_centsintegerrequired
by_modelArray<CfoBoardModelAnalytics>required
Show child attributes
modelstringrequired
executions_countintegerrequired
percentagenumber<float>required
prompt_tokensintegerrequired
completion_tokensintegerrequired
cached_prompt_tokensintegerrequired
reasoning_tokensintegerrequired
estimated_cost_centsintegerrequired
daily_trendsArray<CfoBoardDailyTrend>required
Show child attributes
datestring<date>required
executionsintegerrequired
cost_centsintegerrequired
Example
{
  "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

object
team_idinteger | nullrequired
team_namestringrequired
executions_countintegerrequired
percentagenumber<float>required
estimated_cost_centsintegerrequired
Example
{
  "team_id": 1,
  "team_name": "Finance Engineering",
  "executions_count": 100,
  "percentage": 100,
  "estimated_cost_cents": 2500
}

CfoBoardModelAnalytics

object
modelstringrequired
executions_countintegerrequired
percentagenumber<float>required
prompt_tokensintegerrequired
completion_tokensintegerrequired
cached_prompt_tokensintegerrequired
reasoning_tokensintegerrequired
estimated_cost_centsintegerrequired
Example
{
  "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

object
datestring<date>required
executionsintegerrequired
cost_centsintegerrequired
Example
{
  "date": "2026-08-01",
  "executions": 100,
  "cost_cents": 2500
}

CfoBoardSettingsPayload

object
cfo_board_enabledbooleanrequired

Enable or disable CFO Board analytics for the tenant

Example
{
  "cfo_board_enabled": true
}

CfoBoardSettingsResponse

object
messagestringrequired
cfo_board_enabledbooleanrequired
Example
{
  "message": "CFO Board settings updated successfully.",
  "cfo_board_enabled": true
}

TenantModelRate

object
idintegerrequired
tenant_idintegerrequired
model_patternstringrequired
token_unitintegerrequired
prompt_token_cost_centsnumberrequired
completion_token_cost_centsnumberrequired
cached_prompt_token_cost_centsnumberrequired
reasoning_token_cost_centsnumberrequired
created_atstring<date-time>
updated_atstring<date-time>
Example
{
  "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

object
model_patternstringrequired

Model pattern string or regex to match against actual LLM models

token_unitinteger>= 1

Token unit divisor for pricing (default 1,000,000)

prompt_token_cost_centsnumber>= 0

Cost in cents per token_unit prompt tokens

completion_token_cost_centsnumber>= 0

Cost in cents per token_unit completion tokens

cached_prompt_token_cost_centsnumber>= 0

Cost in cents per token_unit cached prompt tokens

reasoning_token_cost_centsnumber>= 0

Cost in cents per token_unit reasoning tokens

Example
{
  "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

object
model_patternstring
token_unitinteger>= 1
prompt_token_cost_centsnumber>= 0
completion_token_cost_centsnumber>= 0
cached_prompt_token_cost_centsnumber>= 0
reasoning_token_cost_centsnumber>= 0
Example
{
  "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
}