Skip to content

Endpoints

All endpoints require a Bearer token in the Authorization header. See API Overview for authentication details.

Fetch a single prompt by ID.

ParameterTypeRequiredDescription
promptIdstringYesThe prompt ID from the CMS
ParameterTypeRequiredDescription
versionstringNoSpecific version to fetch (e.g. 1.0.0). Defaults to latest published version.
Terminal window
# Fetch latest version
curl https://api.promptlycms.com/prompts/JPxlUpstuhXB5OwOtKPpj \
-H "Authorization: Bearer pk_live_..."
# Fetch specific version
curl "https://api.promptlycms.com/prompts/JPxlUpstuhXB5OwOtKPpj?version=2.0.0" \
-H "Authorization: Bearer pk_live_..."
{
"promptId": "JPxlUpstuhXB5OwOtKPpj",
"promptName": "Code Review Helper",
"version": "2.0.0",
"systemMessage": "You are a helpful code reviewer.",
"userMessage": "Review this ${language} code:\n${code}",
"config": {
"model": "claude-sonnet-4.6",
"temperature": 0.7,
"schema": [],
"inputData": null,
"inputDataRootName": null
}
}
FieldTypeDescription
promptIdstringThe prompt ID
promptNamestringHuman-readable prompt name
versionstringThe resolved version number
systemMessagestringSystem message content
userMessagestringUser message template with ${variable} placeholders
config.modelstringModel identifier from the CMS
config.temperaturenumberTemperature setting (0-2)
config.schemaSchemaField[]Structured output schema fields (empty if none configured)
config.inputDataunknownInput data configuration
config.inputDataRootNamestring | nullRoot name for input data
publishedVersionsPublishedVersion[]Available published versions (present when include_versions is used on list endpoint)

This example fetches a prompt pinned to a specific version and uses it with generateText() from the Vercel AI SDK:

import { generateText } from 'ai';
import { anthropic } from '@ai-sdk/anthropic';
// Simple helper to replace ${variable} placeholders in template strings
const interpolate = (
template: string,
variables: Record<string, string>,
): string => {
let result = template;
for (const [key, value] of Object.entries(variables)) {
result = result.replaceAll(`\${${key}}`, value);
}
return result;
};
// 1. Fetch a prompt pinned to a specific version
const response = await fetch(
`https://api.promptlycms.com/prompts/${promptId}?version=2.27.0`,
{
headers: {
Authorization: `Bearer ${env.PROMPTLY_API_KEY}`,
},
},
);
const { userMessage, systemMessage, config } = await response.json();
// 2. Pass the prompt content to the AI SDK
const { text } = await generateText({
model: anthropic(config.model),
messages: [
{
role: 'system',
content: systemMessage,
providerOptions: {
anthropic: {
cacheControl: { type: 'ephemeral' },
},
},
},
{
role: 'user',
content: interpolate(userMessage, {
pickupLocation,
movesCount: getMovesCount(),
}),
},
],
temperature: config.temperature,
});

Fetch all prompts for your account.

ParameterTypeRequiredDescription
include_versionsbooleanNoInclude publishedVersions array on each prompt
Terminal window
# List all prompts
curl https://api.promptlycms.com/prompts \
-H "Authorization: Bearer pk_live_..."
# Include version history
curl "https://api.promptlycms.com/prompts?include_versions=true" \
-H "Authorization: Bearer pk_live_..."
[
{
"promptId": "JPxlUpstuhXB5OwOtKPpj",
"promptName": "Code Review Helper",
"version": "2.0.0",
"systemMessage": "You are a helpful code reviewer.",
"userMessage": "Review this ${language} code:\n${code}",
"config": {
"model": "claude-sonnet-4.6",
"temperature": 0.7,
"schema": [],
"inputData": null,
"inputDataRootName": null
}
}
]

When include_versions=true:

[
{
"promptId": "JPxlUpstuhXB5OwOtKPpj",
"promptName": "Code Review Helper",
"version": "2.0.0",
"systemMessage": "You are a helpful code reviewer.",
"userMessage": "Review this ${language} code:\n${code}",
"config": {
"model": "claude-sonnet-4.6",
"temperature": 0.7,
"schema": [],
"inputData": null,
"inputDataRootName": null
},
"publishedVersions": [
{ "version": "1.0.0", "userMessage": "Review this code:\n${code}" },
{ "version": "2.0.0", "userMessage": "Review this ${language} code:\n${code}" }
]
}
]

Fetch a single composer by ID.

ParameterTypeRequiredDescription
composerIdstringYesThe composer ID from the CMS
ParameterTypeRequiredDescription
versionstringNoSpecific version to fetch (e.g. 1.0.0). Defaults to latest published version.
Terminal window
# Fetch latest version
curl https://api.promptlycms.com/composers/abc123 \
-H "Authorization: Bearer pk_live_..."
# Fetch specific version
curl "https://api.promptlycms.com/composers/abc123?version=1.0.0" \
-H "Authorization: Bearer pk_live_..."
{
"composerId": "abc123",
"composerName": "My Composer",
"version": "1.0.0",
"config": { "schema": [], "inputData": null, "inputDataRootName": null },
"segments": [
{ "type": "static", "content": "<p>Hello</p>" },
{
"type": "prompt",
"promptId": "p1",
"promptName": "Intro Prompt",
"version": "1.0.0",
"systemMessage": "You are a helpful assistant.",
"userMessage": "Write an intro for ${text}",
"config": { "model": "claude-sonnet-4.6", "temperature": 0.7 }
}
]
}
FieldTypeDescription
composerIdstringThe composer ID
composerNamestringHuman-readable composer name
versionstringThe resolved version number
config.schemaSchemaField[]Structured output schema fields (empty if none configured)
config.inputDataunknownInput data configuration
config.inputDataRootNamestring | nullRoot name for input data
segmentsComposerSegment[]Ordered list of static and prompt segments

Each segment is either a static segment with HTML content, or a prompt segment with promptId, promptName, version, systemMessage, userMessage, and config.


Fetch all composers for your account.

ParameterTypeRequiredDescription
include_versionsbooleanNoInclude publishedVersions array on each composer
Terminal window
# List all composers
curl https://api.promptlycms.com/composers \
-H "Authorization: Bearer pk_live_..."
# Include version history
curl "https://api.promptlycms.com/composers?include_versions=true" \
-H "Authorization: Bearer pk_live_..."
[
{
"composerId": "abc123",
"composerName": "My Composer",
"version": "1.0.0",
"config": { "schema": [], "inputData": null, "inputDataRootName": null },
"segments": [
{ "type": "static", "content": "<p>Hello</p>" },
{
"type": "prompt",
"promptId": "p1",
"promptName": "Intro Prompt",
"version": "1.0.0",
"systemMessage": "You are a helpful assistant.",
"userMessage": "Write an intro for ${text}",
"config": { "model": "claude-sonnet-4.6", "temperature": 0.7 }
}
]
}
]

When include_versions=true:

[
{
"composerId": "abc123",
"composerName": "My Composer",
"version": "1.0.0",
"config": { "schema": [], "inputData": null, "inputDataRootName": null },
"segments": [
{ "type": "static", "content": "<p>Hello</p>" },
{
"type": "prompt",
"promptId": "p1",
"promptName": "Intro Prompt",
"version": "1.0.0",
"systemMessage": "You are a helpful assistant.",
"userMessage": "Write an intro for ${text}",
"config": { "model": "claude-sonnet-4.6", "temperature": 0.7 }
}
],
"publishedVersions": [
{ "version": "1.0.0" }
]
}
]

All endpoints return errors in a consistent format. See Errors for the full reference.

{
"error": "Missing or invalid API key",
"code": "UNAUTHORIZED"
}