Skip to main content

API Reference

Comprehensive documentation for the Chaos Tarot REST API. All endpoints use JSON request/response bodies unless otherwise noted. The base URL is https://chaos-tarot.com

Authentication

Chaos Tarot uses a passwordless access code system. When a user registers with their email, they receive a unique access code (format: XXXX-XXXX-XXXX) that acts as both their identifier and authentication credential.

For GET requests, pass the access code as a code query parameter. For POST requests, include it in the JSON body as accessCode.

Access Tiers

  • Free — 1 draw per system per day, basic stats, no AI interpretation
  • Initiate ($7.77 one-time) — All spreads, full collection tracker, all divination items
  • Oracle ($5.55/mo) — AI interpretation, Memory Core, follow-up questions, journal, AI summarize

Admin endpoints require an access code with admin privileges. Cron endpoints require a Bearer token matching the CRON_SECRET environment variable.

Rate Limits

All API endpoints are rate-limited per IP address using a sliding window. When a rate limit is exceeded, the API returns 429 Too Many Requests with a Retry-After header.

Endpoint GroupLimitWindow
Registration5 requests1 minute
Auth validation20 requests1 minute
AI interpretation / follow-up / summarize10 requests1 minute
Daily draws (all systems)20 requests1 minute
Readings (save/list/export)30 requests1 minute
Error telemetry30 requests1 minute

Authentication

Register for access codes and validate credentials. Chaos Tarot uses a passwordless access-code system rather than traditional username/password.

POST/api/auth/register-freePublic5 per minute per IP

Register a new free-tier account. Returns a unique access code.

Parameters

NameTypeRequiredDescription
emailstringrequiredUser email address

Response

{ "accessCode": "XXXX-XXXX-XXXX", "tier": "free" }

Example

curl -X POST https://chaos-tarot.com/api/auth/register-free \
  -H "Content-Type: application/json" \
  -d '{"email": "user@example.com"}'
POST/api/auth/validatePublic20 per minute per IP

Validate an access code and return the user's tier information.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredThe user's access code

Response

{ "valid": true, "tier": "oracle", "isAdmin": false }

Example

curl -X POST https://chaos-tarot.com/api/auth/validate \
  -H "Content-Type: application/json" \
  -d '{"accessCode": "XXXX-XXXX-XXXX"}'
GET/api/auth/statusAccess Code

Check authentication status for the current access code.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "authenticated": true, "tier": "initiate", "email": "user@example.com" }

Readings

Save, list, export, and manage divination readings across all eight systems.

POST/api/readings/saveAccess Code30 per minute per IP

Save a completed reading (cards drawn, positions, interpretation) to the user's history.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredUser access code
systemIdstringrequiredDivination system ID (e.g. "chaos-tarot", "elder-futhark")
spreadTypestringrequiredSpread type slug
cardsCard[]requiredArray of drawn cards with position data
interpretationstringoptionalAI or manual interpretation text
questionstringoptionalThe question the user asked

Response

{ "id": "uuid", "createdAt": "2026-03-01T12:00:00Z" }
GET/api/readings/listAccess Code

List saved readings for a user, with pagination and optional system filter.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code
pagenumber (query)optionalPage number (default: 1)
limitnumber (query)optionalResults per page (default: 20, max: 50)
systemstring (query)optionalFilter by system ID

Response

{ "readings": [...], "total": 42, "page": 1, "totalPages": 3 }
GET/api/readings/exportAccess Code

Export all readings as JSON for data portability.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "readings": [...], "exportedAt": "2026-03-01T12:00:00Z" }
POST/api/readings/favoriteAccess Code

Toggle the favorite status of a reading.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
readingIdstringrequiredReading UUID

Response

{ "favorited": true }
POST/api/readings/reflectAccess Code

Add a personal reflection/journal note to a saved reading.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
readingIdstringrequiredReading UUID
reflectionstringrequiredReflection text

Response

{ "success": true }
GET/api/readings/check-limitAccess Code

Check whether the user has remaining free reads for a system today.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code
systemstring (query)requiredSystem ID

Response

{ "allowed": true, "remaining": 1 }
GET/api/readings/sharedPublic

Retrieve a publicly shared reading by its share token.

Parameters

NameTypeRequiredDescription
tokenstring (query)requiredShare token

Response

{ "reading": { ... }, "sharedBy": "Anonymous" }

AI Interpretation

AI-powered reading interpretation, follow-up questions, and summarization. Requires Oracle tier or reading tokens.

POST/api/ai/interpretAccess Code10 per minute per IP

Generate an AI interpretation for a reading. Streams the response as text. Supports style, depth, cultural context, and second-opinion modes.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code (Oracle tier or token balance required)
systemIdstringrequiredDivination system ID
spreadTypestringrequiredSpread type slug
cardsCard[]requiredDrawn cards with positions, meanings, and reversal state
questionstringoptionalThe querent's question
stylestringoptional"mystical" | "practical" | "psychological" | "poetic"
depthstringoptional"standard" | "glance" | "deep"
secondOpinionbooleanoptionalRequest an alternative perspective
culturalContextstringoptional"western" | "eastern" | "celtic" | "norse"
readingContextstringoptional"general" | "relationship" | "career" | "health" | "spiritual"
plainLanguagebooleanoptionalSimplify language for beginners

Response

Streamed text/plain (Transfer-Encoding: chunked)

Example

curl -X POST https://chaos-tarot.com/api/ai/interpret \
  -H "Content-Type: application/json" \
  -d '{
    "accessCode": "XXXX-XXXX-XXXX",
    "systemId": "chaos-tarot",
    "spreadType": "single-card",
    "cards": [{"name": "The Zero Point", "positionName": "Present", ...}]
  }'
POST/api/ai/followupAccess Code10 per minute per IP

Ask a follow-up question about a previous AI interpretation.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
questionstringrequiredFollow-up question
contextstringrequiredPrevious interpretation text
systemIdstringrequiredSystem ID

Response

Streamed text/plain
POST/api/ai/summarizeAccess Code10 per minute per IP

Generate a concise summary/title for a reading interpretation. Controlled by the AI_SUMMARIZE feature flag.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
interpretationstringrequiredFull interpretation text
systemIdstringrequiredSystem ID

Response

{ "summary": "Brief reading summary...", "title": "The Zero Point Speaks" }

Daily Draws

Daily card/rune/hexagram/figure draws. One free draw per system per day for all tiers. Supports streak tracking and bonus draws.

GET/api/daily-drawAccess Code20 per minute per IP

Get today's tarot daily draw status and streak info.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code
tzstring (query)optionalIANA timezone (e.g. America/New_York)

Response

{
  "todayDraw": { "card_id": "chaos-tarot:major:00-the-zero-point", ... } | null,
  "streak": { "current_streak": 7, "longest_streak": 30 },
  "hasDrawnToday": false,
  "hasBonusDraw": false
}

Example

curl "https://chaos-tarot.com/api/daily-draw?code=XXXX-XXXX-XXXX&tz=America/New_York"
POST/api/daily-drawAccess Code20 per minute per IP

Draw today's tarot card. Returns card data and updated streak.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
timezonestringoptionalIANA timezone

Response

{ "draw": {...}, "card": { "id": "...", "name": "...", ... }, "streak": {...} }
GET/api/daily-draw/historyAccess Code

Retrieve daily draw history with pagination.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code
limitnumber (query)optionalMax results (default: 30)

Response

{ "draws": [...], "total": 90 }
GET/api/daily-runeAccess Code20 per minute per IP

Get/draw today's Elder Futhark rune.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code
tzstring (query)optionalIANA timezone

Response

{ "todayDraw": {...}, "streak": {...}, "hasDrawnToday": false }
GET/api/daily-hexagramAccess Code20 per minute per IP

Get/draw today's I Ching hexagram.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "todayDraw": {...}, "streak": {...}, "hasDrawnToday": false }
GET/api/daily-oghamAccess Code20 per minute per IP

Get/draw today's Ogham feda.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "todayDraw": {...}, "streak": {...}, "hasDrawnToday": false }
GET/api/daily-lenormandAccess Code20 per minute per IP

Get/draw today's Lenormand card.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "todayDraw": {...}, "streak": {...}, "hasDrawnToday": false }
GET/api/daily-geomancyAccess Code20 per minute per IP

Get/draw today's Geomancy figure.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "todayDraw": {...}, "streak": {...}, "hasDrawnToday": false }

Stats & Progress

User statistics, collection progress, streak calendars, and public platform stats.

GET/api/stats/cardsAccess Code

Get card draw statistics and collection progress for the user.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "totalDraws": 156, "uniqueCards": 45, "collections": {...} }
GET/api/stats/seen-cardsAccess Code

Get the set of cards/runes/items the user has encountered.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code
systemstring (query)optionalFilter by system ID

Response

{ "seenCards": ["chaos-tarot:major:00-the-zero-point", ...] }
GET/api/stats/streak-calendarAccess Code

Get a calendar of daily draw activity for streak visualization.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code
yearnumber (query)optionalYear (default: current)
monthnumber (query)optionalMonth 1-12 (default: current)

Response

{ "days": { "2026-03-01": true, "2026-03-02": true, ... } }
GET/api/stats/publicPublic

Public platform-wide statistics (no auth required).

Response

{ "totalUsers": 1200, "totalReadings": 15000, "totalDailyDraws": 8000 }

Example

curl https://chaos-tarot.com/api/stats/public

Community

Community feed for sharing readings, boosting posts, and collective divination events.

GET/api/community/feedAccess Code

Get the community feed with shared readings.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code
pagenumber (query)optionalPage number
tagstring (query)optionalFilter by tag

Response

{ "posts": [...], "total": 200, "page": 1 }
POST/api/community/boostAccess Code

Boost (upvote) a community post.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
postIdstringrequiredCommunity post ID

Response

{ "boosted": true, "totalBoosts": 12 }
POST/api/community/reportAccess Code

Report a community post for moderation.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
postIdstringrequiredPost ID
reasonstringrequiredReport reason

Response

{ "reported": true }
GET/api/community/statsAccess Code

Get the user's community participation stats.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "postsShared": 5, "totalBoosts": 23, "karmaScore": 42 }
GET/api/community/trendingAccess Code

Get trending tags and popular posts.

Response

{ "tags": [...], "topPosts": [...] }
GET/api/collective/questionsAccess Code

Get active collective divination questions.

Response

{ "questions": [...] }
POST/api/collective/voteAccess Code

Submit a vote/reading response for a collective question.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
questionIdstringrequiredQuestion ID
cardIdstringrequiredSelected card/item ID

Response

{ "voted": true }

Astrology

Natal charts, transit tracking, synastry comparisons, and daily horoscopes.

POST/api/astrology/natalAccess Code

Calculate a natal chart from birth data.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
birthDatestringrequiredISO date string
birthTimestringoptionalHH:MM format
latitudenumberrequiredBirth location latitude
longitudenumberrequiredBirth location longitude

Response

{ "planets": [...], "houses": [...], "aspects": [...] }
GET/api/astrology/transitsAccess Code

Get current planetary transits for a user's natal chart.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "transits": [...], "significantAspects": [...] }
POST/api/astrology/synastryAccess Code

Compare two natal charts for relationship compatibility.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
partnerBirthDatestringrequiredPartner's ISO birth date
partnerLatitudenumberrequiredPartner's birth latitude
partnerLongitudenumberrequiredPartner's birth longitude

Response

{ "aspects": [...], "compatibility": {...} }
GET/api/astrology/horoscopeAccess Code

Get a daily horoscope based on the user's sun sign.

Parameters

NameTypeRequiredDescription
codestring (query)requiredAccess code

Response

{ "sign": "Aries", "horoscope": "...", "date": "2026-03-02" }
POST/api/astrology/birth-profileAccess Code

Save or update the user's birth data for recurring transit calculations.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
birthDatestringrequiredISO date
birthTimestringoptionalHH:MM
locationstringrequiredLocation name
latitudenumberrequiredLatitude
longitudenumberrequiredLongitude

Response

{ "saved": true }
GET/api/astrology/geocodeAccess Code

Geocode a location name to lat/lng for birth chart entry.

Parameters

NameTypeRequiredDescription
qstring (query)requiredLocation search query

Response

{ "results": [{ "name": "...", "lat": 40.7, "lng": -74.0 }] }

System & Health

Health checks, telemetry, and infrastructure endpoints.

GET/api/healthPublic

Comprehensive health check. Returns overall status (healthy/degraded/unhealthy) with per-service check results and feature flag states.

Response

{
  "status": "healthy",
  "timestamp": "2026-03-02T12:00:00Z",
  "uptime": 86400,
  "version": "abc1234",
  "checks": {
    "database": { "status": "pass", "latencyMs": 45 },
    "ai": { "status": "pass", "message": "..." },
    "stripe": { "status": "pass", "message": "..." },
    "email": { "status": "pass" },
    "environment": { "status": "pass" },
    "social": { "discord": true, ... }
  },
  "featureFlags": { ... }
}

Example

curl https://chaos-tarot.com/api/health
POST/api/telemetry/errorPublic30 per minute per IP

Report a client-side error for telemetry.

Parameters

NameTypeRequiredDescription
messagestringrequiredError message
stackstringoptionalStack trace
urlstringoptionalPage URL where error occurred
userAgentstringoptionalBrowser user agent

Response

{ "logged": true }
POST/api/bug-reportAccess Code

Submit a user-generated bug report.

Parameters

NameTypeRequiredDescription
accessCodestringrequiredAccess code
titlestringrequiredBug title
descriptionstringrequiredDetailed description
categorystringoptionalBug category

Response

{ "id": "uuid", "status": "open" }

Error Codes

StatusMeaningCommon Causes
400Bad RequestMissing/invalid parameters, malformed JSON
401UnauthorizedMissing or invalid access code
403ForbiddenInsufficient tier (e.g., AI requires Oracle), no tokens
409ConflictAlready drawn today, duplicate entry
429Too Many RequestsRate limit exceeded
500Internal Server ErrorUnexpected server error (logged automatically)
503Service UnavailableFeature disabled via flag, database down

All error responses include a JSON body with an error field containing a human-readable message.

Divination Systems

The following system IDs are used across all API endpoints that accept a systemId parameter.

System IDNameItemsReversals
chaos-tarotChaos Tarot79 cardsYes
elder-futharkElder Futhark24 runesYes (merkstave)
i-chingI Ching64 hexagramsNo (changing lines)
oghamOgham25 fedaYes (contra)
lenormandLenormand36 cardsNo
geomancyGeomancy16 figuresNo
cross-systemCross-SystemVirtualVaries

Start Building

Create a free account to get your access code and start making API requests.