Endpoints
All endpoints require a Bearer token in the Authorization header. See API Overview for authentication details.
GET /prompts/:promptId
Section titled “GET /prompts/:promptId”Fetch a single prompt by ID.
Path parameters
Section titled “Path parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
promptId | string | Yes | The prompt ID from the CMS |
Query parameters
Section titled “Query parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
version | string | No | Specific version to fetch (e.g. 1.0.0). Defaults to latest published version. |
Example requests
Section titled “Example requests”# Fetch latest versioncurl https://api.promptlycms.com/prompts/JPxlUpstuhXB5OwOtKPpj \ -H "Authorization: Bearer pk_live_..."
# Fetch specific versioncurl "https://api.promptlycms.com/prompts/JPxlUpstuhXB5OwOtKPpj?version=2.0.0" \ -H "Authorization: Bearer pk_live_..."// Fetch latest versionconst response = await fetch( 'https://api.promptlycms.com/prompts/JPxlUpstuhXB5OwOtKPpj', { headers: { Authorization: 'Bearer pk_live_...' }, },);const prompt = await response.json();
// Fetch specific versionconst versioned = await fetch( 'https://api.promptlycms.com/prompts/JPxlUpstuhXB5OwOtKPpj?version=2.0.0', { headers: { Authorization: 'Bearer pk_live_...' }, },);import requests
headers = {"Authorization": "Bearer pk_live_..."}
# Fetch latest versionresponse = requests.get( "https://api.promptlycms.com/prompts/JPxlUpstuhXB5OwOtKPpj", headers=headers,)prompt = response.json()
# Fetch specific versionresponse = requests.get( "https://api.promptlycms.com/prompts/JPxlUpstuhXB5OwOtKPpj", headers=headers, params={"version": "2.0.0"},)Response
Section titled “Response”{ "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.5", "temperature": 0.7, "schema": [], "inputData": null, "inputDataRootName": null }}Response fields
Section titled “Response fields”| Field | Type | Description |
|---|---|---|
promptId | string | The prompt ID |
promptName | string | Human-readable prompt name |
version | string | The resolved version number |
systemMessage | string | System message content |
userMessage | string | User message template with ${variable} placeholders |
config.model | string | Model identifier from the CMS |
config.temperature | number | Temperature setting (0-2) |
config.schema | SchemaField[] | Structured output schema fields (empty if none configured) |
config.inputData | unknown | Input data configuration |
config.inputDataRootName | string | null | Root name for input data |
publishedVersions | PublishedVersion[] | Available published versions (present when include_versions is used on list endpoint) |
Full example with the Vercel AI SDK
Section titled “Full example with the Vercel AI SDK”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 stringsconst 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 versionconst 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 SDKconst { 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,});GET /prompts
Section titled “GET /prompts”Fetch all prompts for your account.
Query parameters
Section titled “Query parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
include_versions | boolean | No | Include publishedVersions array on each prompt |
Example requests
Section titled “Example requests”# List all promptscurl https://api.promptlycms.com/prompts \ -H "Authorization: Bearer pk_live_..."
# Include version historycurl "https://api.promptlycms.com/prompts?include_versions=true" \ -H "Authorization: Bearer pk_live_..."const response = await fetch('https://api.promptlycms.com/prompts', { headers: { Authorization: 'Bearer pk_live_...' },});const prompts = await response.json();import requests
response = requests.get( "https://api.promptlycms.com/prompts", headers={"Authorization": "Bearer pk_live_..."},)prompts = response.json()Response
Section titled “Response”[ { "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.5", "temperature": 0.7, "schema": [], "inputData": null, "inputDataRootName": null } }]Response with versions
Section titled “Response with versions”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.5", "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}" } ] }]Error responses
Section titled “Error responses”All endpoints return errors in a consistent format. See Errors for the full reference.
{ "error": "Missing or invalid API key", "code": "UNAUTHORIZED"}{ "error": "Prompt not found", "code": "NOT_FOUND"}{ "error": "Usage limit exceeded", "code": "USAGE_LIMIT_EXCEEDED", "usage": { "used": 5000, "limit": 5000 }, "upgradeUrl": "https://app.promptlycms.com/settings?upgrade"}