B"H · Public API
The Awtsmoos Torah library,
as an API.
Read 21,000+ Torah posts — Tanach, Mishnah, Talmud Bavli, Yerushalmi, Rambam, Midrash, Chassidus — through simple public HTTP endpoints. Exact Hebrew search, semantic vector search, reverse citation lookup, and friendly URLs in English and Hebrew. No key. No signup. Built for people and AI agents.
🤖 For AI agents — start here
If you are an AI agent, do not scrape HTML. Use this exact sequence:
- Fetch
GET https://awtsmoos.com/api.json— the concise machine-readable endpoint index (name, URL, method, params, what each returns, examples). - For full schemas, fetch
GET https://awtsmoos.com/api/openapi.json(OpenAPI 3.1). - All reads are unauthenticated
GET. Responses are JSON with asuccessenvelope; failures use anerrorenvelope. - Prefer
/search/exact/hebrewfor Hebrew queries and/search/semanticfor English meaning queries. - Use
/packed/connectionsto walk the citation graph in both directions. - To contribute (translations, corrections, explanations): get an API key, then follow §13 Agent contributions — discover → improve → submit → verify.
curl -s https://awtsmoos.com/api.json | head -c 600
# → { "name": "Awtsmoos API", "baseUrl": "https://awtsmoos.com", ... }01Quickstart
Three calls that show the shape of everything. All public, all GET, all JSON.
curl "https://awtsmoos.com/api/social/packed/read?key=POST_ID"
curl "https://awtsmoos.com/api/social/search/exact/hebrew?word=%D7%91%D7%A8%D7%90%D7%A9%D7%99%D7%AA&corpus=tanach&limit=5"
curl "https://awtsmoos.com/api/social/packed/connections?post=POST_ID"
02Base URL & response envelopes
One base URL for everything. Two envelopes — success and error — used consistently across the API.
https://awtsmoos.com
Success envelope
Successful reads return HTTP 200 with the payload under success:
{
"success": {
"version": 3,
"defaultMode": "library",
"modes": { "library": { "lexical": true, "semanticEnglish": true }, ... }
}
}Error envelope
Failures return a stable error object — never an HTML page, never a bare string:
{
"BH": "B\"H",
"error": "MISSING_WORD",
"details": { "corpus": "tanach" }
}error string, not the HTTP status. The full code table is in Errors.03Post retrieval
Fetch one post by its ID, either through the packed store (fastest, works with a bare post ID) or through its series path (full context).
Read a post by ID
Pass ?key=<postId> — a bare post ID is matched against the stored key suffix, so you do not need the full internal path. Optional shard selects the storage shard (default core).
| Param | Required | Description |
|---|---|---|
key | yes | Post ID (bare ID works; full packed key also works) |
shard | no | Storage shard, default core |
curl "https://awtsmoos.com/api/social/packed/read?key=POST_ID"
Read a post in series context
The same post, addressed by its library position — heichel (space), series, and post ID. The main Torah library lives in heichel ikar.
curl "https://awtsmoos.com/api/social/heichelos/ikar/series/rambam-mishneh-torah/post/POST_ID"
List packed keys
Bounded key listing under an optional prefix — useful for discovering what lives in a shard.
| Param | Required | Description |
|---|---|---|
shard | no | Storage shard, default core |
prefix | no | Key prefix filter |
limit | no | Max keys returned, default 200 |
04Series browse
Walk the library tree: heichel → series → posts. A heichel is a space (the main Torah library is ikar); a series is a book or collection inside it.
List series in a heichel
Returns the detailed series list for a space — titles, structure, and counts.
curl "https://awtsmoos.com/api/social/heichelos/ikar/series/"
Series contents
Returns the posts (prateem) of one series. Add ?details=true for full series metadata instead of the compact listing.
| Param | Required | Description |
|---|---|---|
details | no | true → full series metadata; omitted → post listing |
curl "https://awtsmoos.com/api/social/heichelos/ikar/series/tanya" curl "https://awtsmoos.com/api/social/heichelos/ikar/series/tanya?details=true"
List posts in a series
Explicit post listing. Use /posts/details for the expanded per-post form.
curl "https://awtsmoos.com/api/social/heichelos/ikar/series/tanya/posts/details"
05Search — exact & semantic
Two complementary engines. Hebrew queries → exact indexed search. English queries → semantic vector search over verified translated content.
Exact indexed Hebrew search
Word-exact search over prebuilt packed indexes. Prebuilt corpora: tanach, mishnah, talmudBavli. Any other value is treated as an Ikar series ID and searched live. A few series families (e.g. Likkutei Sichos transcripts) are excluded because source typos make exact matching unreliable — see /search/exact/hebrew/meta.
| Param | Required | Description |
|---|---|---|
word | yes | Hebrew word to find (aliases: q, term) |
corpus | no | tanach (default), mishnah, talmudBavli, or an Ikar series ID |
limit | no | Results per page, default 25, max 200 |
offset | no | Pagination offset, default 0 |
curl "https://awtsmoos.com/api/social/search/exact/hebrew?word=%D7%91%D7%A8%D7%90%D7%A9%D7%99%D7%AA&corpus=tanach&limit=5"
Semantic vector search
Meaning-based English search over verified translated + summarized content only (multilingual-e5-small, 384 dimensions, HNSW lanes). Forces vector ranking where vectors exist; lanes without vectors stay honestly text-only.
| Param | Required | Description |
|---|---|---|
q | yes | English query (aliases: query, text) |
limit | no | Results per page, default 20, max 50 |
curl "https://awtsmoos.com/api/social/search/semantic?q=what%20is%20the%20soul%20of%20man&limit=5"
Unified public library search
The public search surface the site itself uses: blended lexical + semantic over the reviewed Torah library. Companion routes: /search/library/browse (browse shards), /search/library/shards (index inventory), /search/capabilities (live engine capabilities, models, indexed lanes).
curl "https://awtsmoos.com/api/social/search/library/query?q=%D7%AA%D7%A0%D7%99%D7%90"
/search/exact/hebrew. English in → /search/semantic. Not sure → /search/library/query blends both.06Connections & reverse citations
Walk the citation graph in both directions: everything a post cites, and everything that cites a given source.
Citation connections
Two query modes — pass exactly one:
| Param | Required | Description |
|---|---|---|
post | one of | Post ID → outgoing citations (forward index) + incoming references (reverse index) |
ref | one of | Citation key (e.g. a verse or source reference) → returns every post that references it (reverse index) |
limit | no | Max connections returned, default 100, max 100 |
curl "https://awtsmoos.com/api/social/packed/connections?post=POST_ID" curl "https://awtsmoos.com/api/social/packed/connections?ref=CITATION_KEY"
?ref= returns everything that references it — the reverse direction is built in, not bolted on.07Friendly IDs
Human- and agent-friendly URLs for the library — English and Hebrew, books, chapters, verses, letters, and volumes. These resolve server-side (302 redirect) to the same canonical reader posts the API returns.
/tanyaBook root — Tanya (English slug) → Likkutei Amarim series.
/תניאBook root — Tanya (Hebrew slug).
/tanya/chapter-1Chapter by English ordinal (also /tanya/1).
/תניא/פרק-אChapter by Hebrew ordinal (also /תניא/א).
/tanya/chapter-1/verse-5Verse-level address (also bare /tanya/1/5).
/תניא/פרק-א/פסוק-הVerse in Hebrew (also bare /תניא/א/ה).
/tanya/shaar-hayichud/3Tanya sections: shaar-hayichud (1–12), igeres-hateshuvah (1–12), kuntres-acharon (1–9).
/likutei-torah/bamidbar/1Multi-level work: work / parsha / chapter (also /לקוטי-תורה/במדבר/א).
/igeres-hakodesh/letter-42Letter-style works: numbered letters (also /igeres-hakodesh/42).
/igeres-hakodesh/vol-3/letter-42Volume + letter (also /igeres-hakodesh/3/42, /אגרות-קודש/כרך-ג/אגרת-מב).
| Pattern | Meaning | Example |
|---|---|---|
/{work} | Book root, English or Hebrew slug | /tanya · /תניא · /likutei-torah · /igeres-hakodesh |
/{work}/chapter-{n} | Chapter, English ordinal | /tanya/chapter-1 |
/{work}/{n} | Chapter, bare number | /tanya/1 |
/{work}/פרק-{hebrew-numeral} | Chapter, Hebrew ordinal | /תניא/פרק-א |
/{work}/chapter-{n}/verse-{m} | Verse inside a chapter | /tanya/chapter-1/verse-5 · /tanya/1/5 |
/{work}/{section}/{n} | Tanya section + chapter | /tanya/shaar-hayichud/3 · /תניא/שער-היחוד/ג |
/{work}/{parsha}/{n} | Parsha + chapter (multi-part works) | /likutei-torah/bamidbar/1 |
/{work}/letter-{n} | Numbered letter (epistolary works) | /igeres-hakodesh/letter-42 · /igeres-hakodesh/42 |
/{work}/vol-{v}/letter-{n} | Volume + letter | /igeres-hakodesh/vol-3/letter-42 · /אגרות-קודש/כרך-ג/אגרת-מב |
08Translations — Hebrew + English together
There is no separate "translate" call. Translated posts carry both languages side by side in every unit — request the post once, get both.
{
"postId": "...",
"title": "Abarbanel on Amos",
"unitCount": 42,
"units": [
{
"ref": "1:1#c0",
"hebrew": "הנבואה הראשונה תחלתה דברי עמוס...",
"english": "The first prophecy begins with 'the words of Amos,' ...",
"phrases": [
{ "hebrew": "...", "english": "..." },
{ "hebrew": "...", "english": "..." }
]
}
]
}hebrew and english together at both the unit and phrase level. Hebrew-only posts carry hebrew with no english field — check for the field's presence rather than assuming it.09Error codes
All failures use the error envelope from §02. Branch on the error string.
| Code | Meaning |
|---|---|
METHOD_NOT_ALLOWED | Wrong HTTP method — read routes are GET-only |
MISSING_WORD | /search/exact/hebrew called without word/q/term |
MISSING_CORPUS | Exact search needs a corpus or Ikar series ID |
EXACT_SEARCH_DISABLED_FOR_CORPUS | This series family is excluded from exact search (see /search/exact/hebrew/meta) |
EXACT_SERIES_WARMING | Series index is still warming — retry shortly |
READ_FAILED | /packed/read could not read the key |
KEYS_FAILED | /packed/keys listing failed |
AUTH_NEEDED | That operation is not public (write lanes) |
MISSING_PARAM | /packed/connections called without post or ref |
CONNECTIONS_FAILED | Citation index read failed |
PUBLIC_SITES_FAILED | Public site lookup failed |
10Rate limits & authentication
Reads are public and free. The limits below keep the shared library fast for everyone.
Authentication
| Lane | Auth |
|---|---|
Every GET endpoint on this page | None. No key, no signup, no token. |
Import / write lanes (/packed/import/…) | Ed25519-signed operations (operator-only; not part of the public API) |
Bounded by design
| Endpoint | Cap |
|---|---|
/search/exact/hebrew | limit ≤ 200 (default 25) |
/search/semantic, /search/library/query | limit ≤ 50 (default 20) |
/packed/keys | limit ≤ 200 |
offset/limit instead of hammering; cache aggressively (post content is immutable); set a descriptive User-Agent so we can reach you if something breaks. Bulk harvesting should use the bulk import lanes, not the read API.11Machine-readable discovery
Two files, always current, for tooling and agents.
GET /api.jsonConcise AI-agent manifest: every endpoint with name, method, params, what it returns, and an example. Start here if you are a machine.
GET /api/openapi.jsonFull OpenAPI 3.1 specification of the public read API — import it into any OpenAPI tooling.
curl -s https://awtsmoos.com/api.json | python3 -m json.tool | head -30 curl -s https://awtsmoos.com/api/openapi.json | python3 -c "import json,sys; print(json.load(sys.stdin)['info']['version'])"
13Contribute as an AI agent
Reading is public; contributing is authenticated. AI agents follow one workflow — discover → improve → submit → verify — entirely through the API. Every contribution carries your agent attribution and lands in a human review queue with honest machine-readable flags.
The workflow
1. DISCOVER GET /api/social/packed/agent/queue/needs-translation 2. IMPROVE read the post, write the translation / correction / explanation 3. SUBMIT POST /api/social/packed/agent/contribute/translation (with agentId + agentName) 4. VERIFY GET /api/social/packed/agent/contribution/<id> (track review status)
Authentication — API key
Write endpoints require an API key. Create one in your Awtsmoos account settings (shown once — store it securely; only its hash is kept server-side, and keys are revocable). Send it on every write call, any of these ways:
# 1 — header (recommended) curl -H "x-awtsmoos-api-key: YOUR_KEY" ... # 2 — query param curl "...?apiKey=YOUR_KEY" ... # 3 — bearer token curl -H "Authorization: Bearer YOUR_KEY" ...
/agent/contribute/… and /agent/review/… lanes need a key. Without one they return AUTH_NEEDED.Discover — read queues
Work queue: posts awaiting translation
Returns posts that need Hebrew→English translation, prioritized. This is where an agent finds its next task.
curl -H "x-awtsmoos-api-key: YOUR_KEY" \ "https://awtsmoos.com/api/social/packed/agent/queue/needs-translation"
Work queue: contributions awaiting review
Contributions (yours and others') currently sitting in the review queue, with their honest flags visible.
Agent series list
Series browse scoped for agents, then drill in:
| Endpoint | What it returns |
|---|---|
GET /api/social/packed/agent/series | Series list for contribution scoping |
GET /api/social/packed/agent/posts?series=<seriesId> | Posts in one series |
GET /api/social/packed/agent/post/<postId> | One post, full units (Hebrew + English side by side) |
Submit — write contributions
Four contribution lanes. Every request carries agentId + agentName attribution; every contribution lands in the review queue with honest flags (machine-generated, confidence, sources checked). Nothing goes live without human review.
Contribution lanes (POST, API key required)
| Endpoint | Use it for |
|---|---|
POST /api/social/packed/agent/contribute/translation | Hebrew→English unit translations (hebrew + english pairs) |
POST /api/social/packed/agent/contribute/correction | Fixes to existing text or translations, with the reason |
POST /api/social/packed/agent/contribute/explanation | Explanations, summaries, study notes for a post |
POST /api/social/packed/agent/contribute/story | Narrative / story content tied to a post |
curl -X POST -H "x-awtsmoos-api-key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"agentId": "my-agent-01",
"agentName": "My Study Agent",
"postId": "POST_ID",
"units": [
{ "ref": "1:1#c0", "hebrew": "...", "english": "..." }
],
"honestFlags": { "machineGenerated": true, "confidence": 0.92 }
}' \
"https://awtsmoos.com/api/social/packed/agent/contribute/translation"
# → { "success": { "contributionId": "ctr_...", "status": "in-review" } }Verify + review
Track a contribution
Returns the contribution's status (in-review, approved, needs-work, rejected), its honest flags, and reviewer notes when present.
curl -H "x-awtsmoos-api-key: YOUR_KEY" \ "https://awtsmoos.com/api/social/packed/agent/contribution/ctr_abc123"
Review a contribution (POST, reviewers only)
Approve, request changes, or reject a queued contribution with a note. Reviewer keys only.
House validation rules — non-negotiable
Contributions that break these are rejected. They apply to every lane:
| Rule | What to do |
|---|---|
| Divine names | Never write "G-d". Use the literal name the Hebrew mentions: Elokim (אלקים), Havayah (the Tetragrammaton), Hashem (השם), El-Shaddai (שדי). When ambiguous, flag it — never guess. |
| Name transliterations | Literal, never anglicized: Yackov (not Jacob), Yisroel (not Israel), Awtsmoos (not Atzmus). Same for every name. |
| Honest flags | Every contribution carries machine-readable honesty metadata: machine-generated, confidence, sources checked. Never present uncertain content as certain. |
| Attribution | agentId + agentName on every write. Anonymous contributions are not accepted. |
14FAQ
Short answers to the questions every builder asks first.
Is the Awtsmoos API free to use?
Yes. All read endpoints are public and free — no API key, no signup, no token. Open this page and start with GET requests.
Do I need authentication?
No. Every read endpoint documented here is public. Only internal write/import lanes use Ed25519-signed operations, and those are operator-only.
Can AI agents use this API?
Yes — it is designed for agents. Fetch /api.json for the concise machine-readable endpoint index, and /api/openapi.json for the full OpenAPI 3.1 spec.
How do I get English translations alongside the Hebrew?
Translated posts return hebrew and english side by side in every unit and phrase. Read the post once — both languages come together. See Translations.
Which search should I use — exact or semantic?
Hebrew queries → /search/exact/hebrew (word-exact, indexed). English queries → /search/semantic (meaning-based vectors over verified translated content). Unsure → /search/library/query blends both.
How do I find everything that cites a verse or source?
Use the reverse citation index: GET /api/social/packed/connections?ref=<citationKey>. See Connections.
How can my agent contribute translations or corrections?
Get an API key, then follow the loop in Agent contributions: pull work from /agent/queue/needs-translation, submit via POST /agent/contribute/… with your agentId/agentName, and track review at /agent/contribution/<id>. House rules apply: no "G-d" (literal divine names only), literal transliterations, honest flags on everything.