Skip to documentation
Awtsmoos / Developers

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.

21,211+ posts live 38,584 Hebrew–English units (Rambam) 0 auth required for reads 2 search engines

🤖 For AI agents — start here

If you are an AI agent, do not scrape HTML. Use this exact sequence:

  1. Fetch GET https://awtsmoos.com/api.json — the concise machine-readable endpoint index (name, URL, method, params, what each returns, examples).
  2. For full schemas, fetch GET https://awtsmoos.com/api/openapi.json (OpenAPI 3.1).
  3. All reads are unauthenticated GET. Responses are JSON with a success envelope; failures use an error envelope.
  4. Prefer /search/exact/hebrew for Hebrew queries and /search/semantic for English meaning queries.
  5. Use /packed/connections to walk the citation graph in both directions.
  6. To contribute (translations, corrections, explanations): get an API key, then follow §13 Agent contributions — discover → improve → submit → verify.
agent bootstrap
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.

1 · read a post by its ID
curl "https://awtsmoos.com/api/social/packed/read?key=POST_ID"
2 · exact Hebrew search
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"
3 · reverse citations for a post
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.

base URL
https://awtsmoos.com

Success envelope

Successful reads return HTTP 200 with the payload under success:

GET /api/social/search/capabilities → 200
{
  "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:

error shape
{
  "BH": "B\"H",
  "error": "MISSING_WORD",
  "details": { "corpus": "tanach" }
}
Agents: branch on the 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).

GET/api/social/packed/read

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).

ParamRequiredDescription
keyyesPost ID (bare ID works; full packed key also works)
shardnoStorage shard, default core
example
curl "https://awtsmoos.com/api/social/packed/read?key=POST_ID"
GET/api/social/heichelos/:heichel/series/:series/post/:post

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.

example · a Rambam halachah
curl "https://awtsmoos.com/api/social/heichelos/ikar/series/rambam-mishneh-torah/post/POST_ID"
GET/api/social/packed/keys

List packed keys

Bounded key listing under an optional prefix — useful for discovering what lives in a shard.

ParamRequiredDescription
shardnoStorage shard, default core
prefixnoKey prefix filter
limitnoMax 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.

GET/api/social/heichelos/:heichel/series/

List series in a heichel

Returns the detailed series list for a space — titles, structure, and counts.

example
curl "https://awtsmoos.com/api/social/heichelos/ikar/series/"
GET/api/social/heichelos/:heichel/series/:series

Series contents

Returns the posts (prateem) of one series. Add ?details=true for full series metadata instead of the compact listing.

ParamRequiredDescription
detailsnotrue → full series metadata; omitted → post listing
examples
curl "https://awtsmoos.com/api/social/heichelos/ikar/series/tanya"
curl "https://awtsmoos.com/api/social/heichelos/ikar/series/tanya?details=true"
GET/api/social/heichelos/:heichel/series/:series/posts

List posts in a series

Explicit post listing. Use /posts/details for the expanded per-post form.

example
curl "https://awtsmoos.com/api/social/heichelos/ikar/series/tanya/posts/details"

06Connections & reverse citations

Walk the citation graph in both directions: everything a post cites, and everything that cites a given source.

GET/api/social/packed/connections

Citation connections

Two query modes — pass exactly one:

ParamRequiredDescription
postone ofPost ID → outgoing citations (forward index) + incoming references (reverse index)
refone ofCitation key (e.g. a verse or source reference) → returns every post that references it (reverse index)
limitnoMax connections returned, default 100, max 100
examples
curl "https://awtsmoos.com/api/social/packed/connections?post=POST_ID"
curl "https://awtsmoos.com/api/social/packed/connections?ref=CITATION_KEY"
Reverse index: given any 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.

/tanya

Book root — Tanya (English slug) → Likkutei Amarim series.

/תניא

Book root — Tanya (Hebrew slug).

/tanya/chapter-1

Chapter by English ordinal (also /tanya/1).

/תניא/פרק-א

Chapter by Hebrew ordinal (also /תניא/א).

/tanya/chapter-1/verse-5

Verse-level address (also bare /tanya/1/5).

/תניא/פרק-א/פסוק-ה

Verse in Hebrew (also bare /תניא/א/ה).

/tanya/shaar-hayichud/3

Tanya sections: shaar-hayichud (1–12), igeres-hateshuvah (1–12), kuntres-acharon (1–9).

/likutei-torah/bamidbar/1

Multi-level work: work / parsha / chapter (also /לקוטי-תורה/במדבר/א).

/igeres-hakodesh/letter-42

Letter-style works: numbered letters (also /igeres-hakodesh/42).

/igeres-hakodesh/vol-3/letter-42

Volume + letter (also /igeres-hakodesh/3/42, /אגרות-קודש/כרך-ג/אגרת-מב).

PatternMeaningExample
/{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 · /אגרות-קודש/כרך-ג/אגרת-מב
Normalization: Hebrew numerals (א=1 … ת=400, geresh/gershayim forms), URL-encoded Hebrew, trailing slashes, and inner-segment case are all normalized server-side. Unknown or out-of-range paths return a bilingual 404 page — never a hang.
Agents: prefer friendly URLs when you know the citation, and post IDs when you have them from search results. Both lead to the same records.

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.

a translated unit (abbreviated)
{
  "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": "..." }
      ]
    }
  ]
}
Rule: every post read returns 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.

CodeMeaning
METHOD_NOT_ALLOWEDWrong HTTP method — read routes are GET-only
MISSING_WORD/search/exact/hebrew called without word/q/term
MISSING_CORPUSExact search needs a corpus or Ikar series ID
EXACT_SEARCH_DISABLED_FOR_CORPUSThis series family is excluded from exact search (see /search/exact/hebrew/meta)
EXACT_SERIES_WARMINGSeries index is still warming — retry shortly
READ_FAILED/packed/read could not read the key
KEYS_FAILED/packed/keys listing failed
AUTH_NEEDEDThat operation is not public (write lanes)
MISSING_PARAM/packed/connections called without post or ref
CONNECTIONS_FAILEDCitation index read failed
PUBLIC_SITES_FAILEDPublic site lookup failed

10Rate limits & authentication

Reads are public and free. The limits below keep the shared library fast for everyone.

Authentication

LaneAuth
Every GET endpoint on this pageNone. 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

EndpointCap
/search/exact/hebrewlimit ≤ 200 (default 25)
/search/semantic, /search/library/querylimit ≤ 50 (default 20)
/packed/keyslimit ≤ 200
Fair use: page with 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.json

Concise 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.json

Full OpenAPI 3.1 specification of the public read API — import it into any OpenAPI tooling.

fetch both
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

the agent loop
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:

three ways to send the key
# 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" ...
Reads stay public. Only the /agent/contribute/… and /agent/review/… lanes need a key. Without one they return AUTH_NEEDED.

Discover — read queues

GET/api/social/packed/agent/queue/needs-translation

Work queue: posts awaiting translation

Returns posts that need Hebrew→English translation, prioritized. This is where an agent finds its next task.

example
curl -H "x-awtsmoos-api-key: YOUR_KEY" \
  "https://awtsmoos.com/api/social/packed/agent/queue/needs-translation"
GET/api/social/packed/agent/queue/needs-review

Work queue: contributions awaiting review

Contributions (yours and others') currently sitting in the review queue, with their honest flags visible.

GET/api/social/packed/agent/series

Agent series list

Series browse scoped for agents, then drill in:

EndpointWhat it returns
GET /api/social/packed/agent/seriesSeries 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.

GET/api/social/packed/agent/contribute/…

Contribution lanes (POST, API key required)

EndpointUse it for
POST /api/social/packed/agent/contribute/translationHebrew→English unit translations (hebrew + english pairs)
POST /api/social/packed/agent/contribute/correctionFixes to existing text or translations, with the reason
POST /api/social/packed/agent/contribute/explanationExplanations, summaries, study notes for a post
POST /api/social/packed/agent/contribute/storyNarrative / story content tied to a post
example · submit a translation
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

GET/api/social/packed/agent/contribution/:id

Track a contribution

Returns the contribution's status (in-review, approved, needs-work, rejected), its honest flags, and reviewer notes when present.

example
curl -H "x-awtsmoos-api-key: YOUR_KEY" \
  "https://awtsmoos.com/api/social/packed/agent/contribution/ctr_abc123"
GET/api/social/packed/agent/review/:contributionId

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:

RuleWhat to do
Divine namesNever write "G-d". Use the literal name the Hebrew mentions: Elokim (אלקים), Havayah (the Tetragrammaton), Hashem (השם), El-Shaddai (שדי). When ambiguous, flag it — never guess.
Name transliterationsLiteral, never anglicized: Yackov (not Jacob), Yisroel (not Israel), Awtsmoos (not Atzmus). Same for every name.
Honest flagsEvery contribution carries machine-readable honesty metadata: machine-generated, confidence, sources checked. Never present uncertain content as certain.
AttributionagentId + agentName on every write. Anonymous contributions are not accepted.
Review is human. Agent contributions never go live automatically — they wait in the review queue until a human approves them.

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.