Skip to main content
No key, no signup. Caesar is free to use and the anonymous tier serves the full search, read, and feedback loop. Pick the rail that matches where your agent runs, verify one search, then ask the agent to search and read. A surreal retro-computing collage with a hand, glass orb, terminal, botanical forms, and celestial diagrams.
For agents: use /llms.txt to discover docs, append .md to any page for markdown, and start with /agents/install when you need client-specific setup.

Install console

1

Install

npx skills add caesar-data/skills --skill caesar-search
Best for coding agents that read SKILL.md. The skill teaches the agent to search, read, preserve handles, and use the CLI when available.
2

Verify

caesar-search search "hello world" \
  --max-results 1 \
  --format compact \
  --json
Success means exit code 0 and a JSON envelope containing search_id.
3

Ask your agent

Use Caesar to search, read the most relevant result, cite the source URL, and keep doc_id and search_id for follow-up.

Product loop

Search

Query returns ranked results with search_id and stable doc_id handles.

Read

Pass doc_id to read clean markdown plus capture metadata.

Cite

Preserve source_url, passage_id, capture_id, and capture_time.

Feedback

Send search_id and doc_id when a result helped.

Not sure which rail?

Use this railWhen
SkillYour agent supports Skills and can read SKILL.md.
MCPYour chat or IDE client supports remote MCP tools.
CLIYour agent has shell access or you are scripting from a terminal.
AI SDKYou are building an app with model tools.
RESTYou want the underlying HTTP contract directly.

Raw API loop

The underlying API is three HTTP calls. This works with only curl and jq.
1

Search

RESPONSE=$(curl -s https://search-api-staging-779189860552.europe-west1.run.app/v1/search \
  -H "Content-Type: application/json" \
  -d '{"query": "postgres 17 logical replication failover", "max_results": 3}')

printf '%s' "$RESPONSE" | jq '{search_id, tier: .access.tier, results: [.results[] | {rank, doc_id, title}]}'
Save the two handles the next steps need:
SEARCH_ID=$(printf '%s' "$RESPONSE" | jq -r '.search_id')
DOC_ID=$(printf '%s' "$RESPONSE" | jq -r '.results[0].doc_id')
2

Read

curl -s https://search-api-staging-779189860552.europe-west1.run.app/v1/document \
  -H "Content-Type: application/json" \
  -d "{\"doc_id\": \"$DOC_ID\", \"content\": {\"selection\": \"full_document\", \"max_chars\": 2000}}" \
  | jq -r '.content.text'
If content.truncated is true, continue with content.range.start_char set to the previous response’s content.start_char plus content.char_count. See documents.
3

Feedback

curl -s https://search-api-staging-779189860552.europe-west1.run.app/v1/feedback \
  -H "Content-Type: application/json" \
  -d "{\"event_type\": \"result_helpful\", \"search_id\": \"$SEARCH_ID\", \"doc_id\": \"$DOC_ID\", \"rank\": 1}" \
  | jq '{feedback_id, accepted}'
That is the whole contract: search, read, feedback. Every Caesar surface uses the same loop.

Build with Caesar

Python SDK

pip install caesar-search

TypeScript SDK

npm install caesar-search

AI SDK tools

caesarTools() exposes caesar_search and caesar_read.

Framework recipes

Wrap Caesar for framework tools, generic tool calling, and Agent Development Kit projects.

Where next