REST API Reference
Base URL: http://localhost:8000/api
Start the server:
promptctl serve --http --port 8000
Interactive Swagger docs at: http://localhost:8000/docs
Prompts
POST /api/prompts
Create a new prompt with initial version.
curl -X POST http://localhost:8000/api/prompts \
-H "Content-Type: application/json" \
-d '{
"name": "summarizer",
"content": "Summarize this in {tone} style:\n\n{article}",
"description": "Summarizes articles",
"variables": {"tone": "formal|casual", "article": "string"},
"model_config": {"provider": "openai", "model": "gpt-4o-mini"},
"commit_message": "Initial version",
"tags": ["nlp", "summarization"]
}'
Response:
{
"id": "uuid",
"name": "summarizer",
"description": "Summarizes articles",
"tags": ["nlp", "summarization"],
"current_version_id": "uuid",
"created_at": "2026-08-20T12:00:00",
"updated_at": "2026-08-20T12:00:00"
}
GET /api/prompts
List all prompts.
# List all
curl http://localhost:8000/api/prompts
# Filter by tags
curl "http://localhost:8000/api/prompts?tags=nlp,summarization"
# Paginate
curl "http://localhost:8000/api/prompts?limit=10&offset=20"
GET /api/prompts/{name}
Get prompt with latest version content.
curl http://localhost:8000/api/prompts/summarizer
Response:
{
"id": "uuid",
"name": "summarizer",
"current_version": {
"version": 1,
"content": "Summarize this in {tone} style:\n\n{article}",
"variables": {"tone": "formal|casual", "article": "string"},
"model_config": {"provider": "openai", "model": "gpt-4o-mini"}
}
}
GET /api/prompts/{name}/versions
List all versions of a prompt.
curl http://localhost:8000/api/prompts/summarizer/versions
POST /api/prompts/{name}/versions
Create the next immutable prompt version.
curl -X POST http://localhost:8000/api/prompts/summarizer/versions \
-H "Content-Type: application/json" \
-d '{"content": "Updated prompt", "commit_message": "Improve instructions"}'
GET /api/prompts/{name}/versions/{version}
Get specific version.
curl http://localhost:8000/api/prompts/summarizer/versions/2
POST /api/prompts/{name}/rollback
Rollback to a previous version. Creates a new version with the old content.
curl -X POST http://localhost:8000/api/prompts/summarizer/rollback \
-H "Content-Type: application/json" \
-d '{"version": 1, "commit_message": "Reverting to v1"}'
Datasets
POST /api/datasets
Create a new dataset.
curl -X POST http://localhost:8000/api/datasets \
-H "Content-Type: application/json" \
-d '{
"name": "qa-test",
"description": "Q&A test cases",
"items": [
{"input": {"question": "What is 2+2?"}, "expected_output": "4"},
{"input": {"question": "Capital of France?"}, "expected_output": "Paris"}
]
}'
GET /api/datasets
List datasets.
curl http://localhost:8000/api/datasets
GET /api/datasets/{name}
Get dataset with all items.
curl http://localhost:8000/api/datasets/qa-test
Evaluations
POST /api/evaluations
Run evaluation of a prompt version against a dataset.
curl -X POST http://localhost:8000/api/evaluations \
-H "Content-Type: application/json" \
-d '{
"prompt_name": "summarizer",
"dataset_name": "qa-test",
"version": 1,
"llm_config": {
"provider": "gemini",
"model": "gemini-3.7-flash"
}
}'
Response:
{
"id": "uuid",
"status": "completed",
"model_config": {
"provider": "gemini",
"model": "gemini-3.7-flash",
"temperature": 0.0,
"max_tokens": 512
}
}
GET /api/evaluations/{id}
Get evaluation status.
curl http://localhost:8000/api/evaluations/<id>
GET /api/evaluations/{id}/report
Get full evaluation report with all results and metrics.
curl http://localhost:8000/api/evaluations/<id>/report
Response:
{
"evaluation_id": "uuid",
"status": "completed",
"metrics": {
"avg_latency_ms": 3542,
"avg_cost": 0.000015,
"total_tokens": {"prompt_tokens": 26, "completion_tokens": 3, "total_tokens": 29},
"exact_match_rate": 0.5,
"total_items": 2,
"successful_items": 2,
"failed_items": 0
},
"results": [
{
"input": {"question": "What is 2+2?"},
"expected_output": "4",
"actual_output": "4",
"latency_ms": 1673,
"token_usage": {"prompt_tokens": 13, "completion_tokens": 1, "total_tokens": 14},
"cost": 0.000013,
"scores": {"exact_match": 1.0},
"error": null
}
]
}