Electional logo
3 free timing scans a week, memberships from $9/30 days, API plans from $49/30 days

☿ ELECTIONAL — GRIMOIRE

API DOCS

Calculate transit windows and ranked timing results programmatically. ♄ GET API KEY

♄ AUTHENTICATION & BILLING

/api/v1/ai-guidance, /api/v1/aspect-interpretations/expand, /api/v1/electional-spellcasting, /api/v1/month/full, /api/v1/solar-return, /api/v1/solar-return/elect-location, /api/v1/synastry, /api/v1/timeline/full, /api/v1/transits, /api/v1/vedic-chart/full, and /api/v1/natal-reading/full require a Bearer token (a signed-in browser session also works); their costs are in the route index below. Get your key from the API Keys page.

Base URL: https://electional.io. Free routes cap anonymous callers per IP and answer 429 with code: "free_tier_limit" over the cap; a valid Bearer key or signed-in session is not capped (limits are in the route index).

Developer plan checkout returns through verified checkout to /api-keys. Key creation remains explicit: checkout never creates a key or runs a chargeable API request automatically.

Authorization: Bearer sk_tr_your_key_here

/api/v1/transits: 1 credit per billable calendar month (×3 when a secondChart adds the secondary and composite scans), plus a flat 1 credit when transitToTransit: true. Predictive overlays add +1 credit each, at most +3 credits per run. Credits exposed via x-credits-remaining.

/api/v1/electional-spellcasting: 1 credit per intent per billable calendar month, multiplied by 3 when a secondChart adds the secondary and composite scans. Transit-to-transit data is always calculated, but its scoring contribution can be disabled per request or via saved account settings.

Transit and Electional ranges may extend through the same calendar date next year. Paid work is durably queued first; jobs estimated at five minutes or more always return 202. Reuse one Idempotency-Key for network retries, then poll the returned Bearer-scoped statusUrl and fetch resultUrl when complete (see Report jobs).

/api/v1/synastry: 1 credit per successful compatibility report (two charts → domain-scored synastry, house overlays, and composite evidence).

/api/v1/daily-elections: Free: 3 runs per IP per week, no auth needed. Then 1 credit per run with a Bearer key or signed-in session; memberships with unlimited Daily Elections run free. Predictive overlays add +1 credit each, at most +3 credits per run, even for members, and need auth. secondChart (joint mode) costs 2 credits and needs auth; members run it free.

/api/v1/timeline: free Timeline teaser, no Bearer token required. It accepts up to 5 optional dated events and returns proof moments, hinge years, and date-only age-cycle/profection signatures without persistence or credit billing.

/api/v1/timeline/full: paid full Timeline report, Bearer token required, 3 credits after a successful exact-time scan. It auto-saves the report for the API-key owner and keeps the free teaser separate.

/api/v1/month: free Month Ahead teaser, no Bearer token required. It returns deterministic daily intensity, peak windows, domains, and timing spine without persistence or credit billing.

/api/v1/month/full: paid full Month Ahead report, Bearer token required, 3 credits after a successful exact-time forecast. It adds the generated narrative, auto-saves the report for the API-key owner, and returns raw JSON only.

/api/v1/vedic-chart: free exact-birth Vedic Chart scored reading, no Bearer token required. It returns tropical Vedic confidence-weighted domain claims, Vimshottari timing, nakshatra, vargas, and a technical comparison drawer without persistence or credit billing.

/api/v1/vedic-chart/full: paid full Vedic Chart report, Bearer token required, 3 credits after a successful exact-time scan. It auto-saves the report for the API-key owner and returns raw JSON only.

/api/v1/natal-reading: free exact-birth Natal Reading teaser, no Bearer token required. It returns the hero answer, placements, the top three tensions, one growth lever, and the parenting block in child mode, without persistence or credit billing (anonymous callers: 20 per day).

/api/v1/natal-reading/full: paid full Natal Reading, Bearer token required, 3 creditsafter a successful exact-time reading. It adds every tension's pair-specific reading, the full aspect inventory, the full growth plan, the Vedic lens, the three-frame house table, midpoints, and a grounded narrative, auto-saves the reading for the API-key owner, and returns raw JSON only.

/api/v1/ai-guidance: a flat 3 credits per request, whether the request contains one item or many.

/api/v1/aspect-interpretations/expand: 1 credit only when a new exact aspect/sign/house/dignity blend is saved. Existing blends are returned without another charge.

COMPLETE PUBLIC ROUTE INDEX

Every public POST /api/v1 route is listed here with its auth model, credit behavior, and matching MCP tool name, followed by the two GET routes that redeem a report-job receipt. The generated endpoint reference below gives a request example, response shape, and consumer notes for every POST route.

ROUTEAUTHCREDITSMCP TOOLUSE
/api/v1/ai-guidancebearer3 credits per successful guidance request.generate_ai_guidancePaid grounded guidance over transit, election, solar-return, or timeline payloads.
/api/v1/aspect-interpretations/expandbearer1 credit per new blend; existing blends are free.expand_aspect_interpretationCreates or returns a permanent exact aspect/sign/house/dignity interpretation blend.
/api/v1/daily-electionsip_or_session_or_bearerFree: 3 runs per IP per week, no auth needed. Then 1 credit per run with a Bearer key or signed-in session; memberships with unlimited Daily Elections run free. Predictive overlays add +1 credit each, at most +3 credits per run, even for members, and need auth. secondChart (joint mode) costs 2 credits and needs auth; members run it free.calculate_daily_electionsScans all electional intents for the next 24 hours or scores one exact now chart.
/api/v1/electional-spellcastingbearer1 credit per intent per billable calendar month, times chart count; predictive overlays add +1 credit each, at most +3 credits per run.calculate_electional_spellcastingFinds ranked election windows for one or many intents from one shared scan.
/api/v1/eclipse-hitsfreeFree; public scans are capped at 10 years; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.calculate_eclipse_hitsFree exact-time natal eclipse contact checker over a capped public scan range.
/api/v1/intent-matchsession_or_ipFree; anonymous callers: 40 per day per IP. A valid API key or signed-in session is not capped.match_goal_to_intentsRoutes a plain-language goal sentence to the best 1–3 of the 72 electional intents.
/api/v1/monthfreeFree; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.calculate_month_forecast_teaserFree exact-birth Month Ahead forecast shell without persistence.
/api/v1/month/fullbearer3 credits per successful report.calculate_month_forecastPaid Month Ahead report with generated narrative and auto-save.
/api/v1/personality-interpretationfreeFree; cache-miss generation is IP-rate-limited.generate_personality_interpretationsBatch cache endpoint for big-three, pair, and stack personality interpretation text.
/api/v1/placement-interpretationfreeFree; generated once per unique placement when configured.generate_placement_interpretationCache endpoint for one planet/sign/house placement interpretation.
/api/v1/retrograde-hitsfreeFree; public scans are capped at 10 years; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.calculate_personalized_retrograde_hitsFree exact-time Mercury, Venus, and Mars retrograde contact checker.
/api/v1/solar-returnbearer1 credit per successful report.calculate_solar_returnComputes annual profection, solar-return chart context, and SR transit windows.
/api/v1/solar-return/elect-locationbearer3 credits per successful location election.calculate_solar_return_location_electionRanks birthday cities for a solar-return intent category using the curated city set.
/api/v1/synastrybearer1 credit per successful compatibility report.calculate_synastry_compatibilityDomain-scored relationship compatibility (marriage, business, and more) from synastry inter-aspects, house overlays, and the composite chart.
/api/v1/timelinefreeFree; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.calculate_timeline_teaserFree date-only or partial timeline teaser with proof moments and hinge years.
/api/v1/timeline/fullbearer3 credits per successful report.calculate_timeline_full_reportPaid exact-time full timeline with dated-event retrodiction and auto-save.
/api/v1/transit-interpretationfreeFree; generated once per unique transit pattern when configured.generate_transit_interpretationsBatch cache endpoint for generic transit-to-natal interpretation text.
/api/v1/transitsbearer1 credit per billable calendar month, times chart count; transit-to-transit adds +1 credit and predictive overlays add +1 credit each, at most +3 credits per run.calculate_transitsCalculates natal-to-transit and optional transit-to-transit aspect hits.
/api/v1/vedic-chartfreeFree; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.calculate_vedic_chart_teaserFree exact-birth Vedic scored reading with frame comparison and predictive timing.
/api/v1/vedic-chart/fullbearer3 credits per successful report.calculate_vedic_chartPaid full Vedic Chart report with saved scored reading and deep technical sections.
/api/v1/vedic-chart/predictionsfreeFree; anonymous callers: 5 per day per IP. A valid API key or signed-in session is not capped.calculate_vedic_chart_predictionsFree Vedic predictive report (includes an AI synthesis step) used by the predictions route and overlays.
/api/v1/natal-readingfreeFree; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.calculate_natal_reading_teaserFree exact-birth natal reading teaser: placements, top tensions, one growth lever, and a child/parenting mode.
/api/v1/natal-reading/fullbearer3 credits per successful report.calculate_natal_readingPaid full natal reading with every tension's pair-specific reading, full aspect inventory, growth plan, Vedic lens, house-frame comparison, midpoints, grounded AI narrative, and auto-save.
/api/v1/proof-synthesisfreeFree; anonymous callers get 5 full reads per week per network, then the deterministic checks only. Signed-in users are not capped.calculate_proof_synthesisFree cross-system life-guess synthesis: combines Timeline dated cycles with Vedic domain scores into concrete, window-level, falsifiable life guesses.
/api/v1/window-synthesissession_or_ipFree; per domain, anonymous callers get 10 per week per IP, signed-in accounts 25 per week, and members are unlimited.generate_window_synthesisFree grounded synthesis over rendered election, transit, Vedic, synastry, or natal reading result items.
GET/api/v1/report-jobs/{jobId}bearerFree.get_report_jobReturns { job } with status, progress, billing and, once completed, result.resultUrl. 404 when the job is not yours or does not exist.
GET/api/v1/report-jobs/{jobId}/resultbearerFree.get_report_job200 with the finished report once completed; 202 with status and progress while active, plus retryAt while retry_wait; 409 with status, billing and failure for a failed or rejected job; 410 REPORT_ARTIFACT_UNAVAILABLE if the stored report is gone.

COMPLETE ENDPOINT REFERENCE

This section is generated from the shared public API catalog used by the MCP server docs. Treat each response as a representative shape; production responses can include additional evidence fields.

POST

AI Guidance

/api/v1/ai-guidance

Paid grounded guidance over transit, election, solar-return, or timeline payloads.

AUTH
bearer
CREDITS
3 credits per successful guidance request.
MCP TOOL
generate_ai_guidance

/api/v1/ai-guidance request example

{
  "domain": "election",
  "orientation": "pragmatic",
  "scope": "many",
  "items": [
    {
      "peakAtIso": "2026-07-01T16:30:00.000Z",
      "score": {
        "total": 18.4
      }
    },
    {
      "peakAtIso": "2026-07-02T18:00:00.000Z",
      "score": {
        "total": 16.9
      }
    }
  ],
  "context": {
    "intent": {
      "name": "Networking"
    }
  },
  "question": "Which window is strongest for a public launch?"
}

/api/v1/ai-guidance response example

{
  "guidance": "Use the first window for the launch announcement; reserve the second for follow-up outreach.",
  "metadata": {
    "domain": "election",
    "orientation": "pragmatic",
    "scope": "many",
    "itemCount": 2,
    "creditsCharged": 3,
    "creditsRemaining": 7,
    "model": "glm-5.2",
    "promptTemplate": "election-pragmatic-many.md"
  }
}

CONSUMER NOTES

  • Send either item for single scope or items for many scope; the schema rejects mixing them.
  • LLM guidance is grounded against supplied route output and costs a flat 3 credits per successful request.
  • Bearer-token API clients receive raw JSON only; no saved HTML report is returned.

POST

Aspect Interpretation Expansion

/api/v1/aspect-interpretations/expand

Creates or returns a permanent exact aspect/sign/house/dignity interpretation blend.

AUTH
bearer
CREDITS
1 credit per new blend; existing blends are free.
MCP TOOL
expand_aspect_interpretation

/api/v1/aspect-interpretations/expand request example

{
  "context": {
    "surface": "transits",
    "relationshipType": "natal_to_transit",
    "aspect": "square",
    "aspectDomain": "zodiac",
    "exactOrb": 0.42,
    "isApplying": true,
    "subject": {
      "point": "mars",
      "role": "transiting",
      "sign": "Leo",
      "house": 11,
      "dignity": "peregrine"
    },
    "object": {
      "point": "moon",
      "role": "natal",
      "sign": "Scorpio",
      "house": 3,
      "dignity": "fall"
    }
  }
}

/api/v1/aspect-interpretations/expand response example

{
  "expansionKey": "expand|v1|transits|natal_to_transit|zodiac|transiting|mars|Leo|11|peregrine|square|natal|moon|Scorpio|3|fall",
  "created": true,
  "creditsCharged": 1,
  "creditsRemaining": 6,
  "interpretation": {
    "key": "mars-square-moon-transit",
    "title": "Mars square Moon",
    "contextLabel": "Mars in Leo H11 square natal Moon in Scorpio H3",
    "summary": "A sharp emotional activation around speech, groups, and loyalty.",
    "general": "...",
    "pairMeaning": "...",
    "chartFlavor": "...",
    "timing": "...",
    "practical": "...",
    "sourceNotes": []
  }
}

CONSUMER NOTES

  • The permanent cache key includes surface, relationship type, aspect domain, aspect, roles, points, signs, houses, and dignity.
  • Orb and applying or separating state are intentionally excluded from the permanent expansion key.
  • Existing blends return without another credit charge.

POST

Daily Elections

/api/v1/daily-elections

Scans all electional intents for the next 24 hours or scores one exact now chart.

AUTH
ip_or_session_or_bearer
CREDITS
Free: 3 runs per IP per week, no auth needed. Then 1 credit per run with a Bearer key or signed-in session; memberships with unlimited Daily Elections run free. Predictive overlays add +1 credit each, at most +3 credits per run, even for members, and need auth. secondChart (joint mode) costs 2 credits and needs auth; members run it free.
MCP TOOL
calculate_daily_elections

/api/v1/daily-elections request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "scanMode": "day",
  "browserNowIso": "2026-10-01T07:15:00.000Z",
  "browserTimezone": "Europe/London",
  "startTime": "09:00",
  "endTime": "17:00",
  "scoring": {
    "useNatalHouseFrameOnly": false
  }
}

/api/v1/daily-elections response example

{
  "metadata": {
    "scanMode": "day",
    "scanStartIso": "2026-07-01T13:00:00.000Z",
    "scanEndIso": "2026-07-01T21:00:59.999Z",
    "intentCount": 72,
    "creditsRemaining": null,
    "isFreeUse": true,
    "freeUsage": {
      "used": 1,
      "limit": 3,
      "remaining": 2
    }
  },
  "windows": [
    {
      "intentId": "career-advancement-promotion",
      "intentName": "Career Advancement and Promotion",
      "peakAtIso": "2026-07-01T15:20:00.000Z",
      "score": {
        "total": 18.24,
        "pass1Baseline": 3.6,
        "pass2HouseAlignment": 4.55
      },
      "moonVoidOfCourse": {
        "isVoid": false,
        "nextMoonHitAtIso": "2026-07-01T18:45:00.000Z"
      }
    }
  ]
}

CONSUMER NOTES

  • Free: 3 runs per IP per week, no auth needed. Then 1 credit per run with a Bearer key or signed-in session; memberships with unlimited Daily Elections run free. Predictive overlays add +1 credit each, at most +3 credits per run, even for members, and need auth. secondChart (joint mode) costs 2 credits and needs auth; members run it free.
  • Returns 402 JOINT_DAILY_AUTH_REQUIRED for an anonymous secondChart request and 402 PREDICTIVE_OVERLAY_AUTH_REQUIRED for anonymous overlays.
  • startTime and endTime narrow the scan window before scoring and cannot be used with scanMode now.
  • Results are flat and score-sorted by default; intent grouping is a UI/client concern.

POST

Electional Spellcasting

/api/v1/electional-spellcasting

Finds ranked election windows for one or many intents from one shared scan.

AUTH
bearer
CREDITS
1 credit per intent per billable calendar month, times chart count; predictive overlays add +1 credit each, at most +3 credits per run.
MCP TOOL
calculate_electional_spellcasting

/api/v1/electional-spellcasting request example

{
  "intentId": "career-advancement-promotion",
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "startDate": "2026-10-01",
  "rangeDays": 7,
  "strictness": "standard",
  "maxWindows": 3,
  "scoring": {
    "enabledPasses": [
      "pass1Baseline",
      "pass3IntentFit",
      "pass4NatalCompatibility"
    ],
    "useNatalHouseFrameOnly": false
  }
}

/api/v1/electional-spellcasting response example

{
  "metadata": {
    "scanStartDate": "2026-10-01",
    "scanEndDate": "2026-10-08",
    "transitToTransitUsed": true,
    "strictness": "standard",
    "creditsRemaining": 12
  },
  "intent": {
    "id": "career-advancement-promotion",
    "house": 10,
    "polarity": "constructive"
  },
  "windows": [
    {
      "startAtIso": "2026-10-04T12:00:00.000Z",
      "peakAtIso": "2026-10-04T15:00:00.000Z",
      "endAtIso": "2026-10-04T18:00:00.000Z",
      "score": {
        "total": 18.24,
        "pass1Baseline": 3.6,
        "pass3IntentFit": 4.12
      },
      "planetConditions": [
        {
          "point": "sun",
          "score": 3.6,
          "band": "commanding",
          "house": 10
        }
      ]
    }
  ]
}

CONSUMER NOTES

  • Credits are charged by scan length; selected paid overlays can add credits.
  • Transit-to-natal hits dominate plain transit-to-transit refinement in scoring.
  • Every window carries pass-level receipts and diagnostic context for consumer-side explanation.

POST

Eclipse Hits

/api/v1/eclipse-hits

Free exact-time natal eclipse contact checker over a capped public scan range.

AUTH
free
CREDITS
Free; public scans are capped at 10 years; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.
MCP TOOL
calculate_eclipse_hits

/api/v1/eclipse-hits request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "startDate": "2026-01-01",
  "endDate": "2030-12-31",
  "orbDegrees": 3
}

/api/v1/eclipse-hits response example

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 0,
    "locationLabel": "London, United Kingdom",
    "startDate": "2026-01-01",
    "endDate": "2030-12-31",
    "eclipseCount": 8,
    "hitCount": 2,
    "caveats": [
      "Exact birth time and birthplace are required because ASC/MC eclipse contacts are birth-time sensitive."
    ]
  },
  "eclipses": [
    {
      "id": "solar-2026-08-12",
      "kind": "solar",
      "longitude": 140,
      "typeLabel": "Solar eclipse candidate"
    }
  ],
  "hits": [
    {
      "eclipseId": "solar-2026-08-12",
      "natalPoint": "sun",
      "aspect": "conjunction",
      "orbDegrees": 0.8
    }
  ]
}

CONSUMER NOTES

  • This v1 route reuses the free eclipse checker contract behind /api/free/eclipse-hits.
  • Exact birth data is required because natal angles are part of the contact set.
  • Public scan windows are capped at 10 years and charge no credits.

POST

Goal to Intent Match

/api/v1/intent-match

Routes a plain-language goal sentence to the best 1–3 of the 72 electional intents.

AUTH
session_or_ip
CREDITS
Free; anonymous callers: 40 per day per IP. A valid API key or signed-in session is not capped.
MCP TOOL
match_goal_to_intents

/api/v1/intent-match request example

{
  "goal": "sign a lease on a new apartment"
}

/api/v1/intent-match response example

{
  "mode": "match",
  "intentIds": [
    "contract-legal-advantage"
  ],
  "confidence": 0.89,
  "available": true
}

CONSUMER NOTES

  • Send only the goal sentence; names, contact details, dates, times and birth details are redacted and the text is capped at 300 characters.
  • mode is match (confidence ≥ 0.5), suggest (up to 3 lower-confidence options) or none; available is false when the classifier is off or degraded.
  • Routing never runs a scan; pass the returned intentIds to /api/v1/electional-spellcasting yourself.

POST

Month Ahead Teaser

/api/v1/month

Free exact-birth Month Ahead forecast shell without persistence.

AUTH
free
CREDITS
Free; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.
MCP TOOL
calculate_month_forecast_teaser

/api/v1/month request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "startDate": "2026-10-01"
}

/api/v1/month response example

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 0,
    "fullReportAvailable": false,
    "narrativeIncluded": false
  },
  "forecast": {
    "verdict": {
      "headline": "Mixed but workable month",
      "score": 63
    },
    "dailyIntensity": [
      {
        "date": "2026-07-01",
        "score": 42,
        "eventCount": 2
      }
    ],
    "peakWindows": [],
    "domains": [],
    "timingSpine": []
  },
  "aiNarrative": null
}

CONSUMER NOTES

  • Free teaser route; no Bearer token and no persistence.
  • Requires exact birth data plus startDate; defaults to a 30-day forecast when days is omitted.
  • Use the full route when the generated narrative and saved report id are required.

POST

Month Ahead Full Report

/api/v1/month/full

Paid Month Ahead report with generated narrative and auto-save.

AUTH
bearer
CREDITS
3 credits per successful report.
MCP TOOL
calculate_month_forecast

/api/v1/month/full request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "startDate": "2026-10-01",
  "days": 30
}

/api/v1/month/full response example

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 3,
    "creditsRemaining": 12,
    "savedItemId": "calc_abc123",
    "fullReportAvailable": true,
    "narrativeIncluded": true
  },
  "forecast": {
    "verdict": {},
    "dailyIntensity": [],
    "peakWindows": [],
    "domains": [],
    "timingSpine": []
  },
  "aiNarrative": {
    "model": "glm-5.2",
    "provider": "zai",
    "text": "..."
  }
}

CONSUMER NOTES

  • Bearer token required; the report is auto-saved to the API-key owner.
  • Credits are refunded on post-reservation generation or save failure.
  • The response is raw JSON; clients render their own report view.

POST

Personality Interpretation

/api/v1/personality-interpretation

Batch cache endpoint for big-three, pair, and stack personality interpretation text.

AUTH
free
CREDITS
Free; cache-miss generation is IP-rate-limited.
MCP TOOL
generate_personality_interpretations

/api/v1/personality-interpretation request example

{
  "items": [
    {
      "tier": "bigthree",
      "sunSign": "Capricorn",
      "moonSign": "Leo",
      "ascSign": "Libra"
    }
  ]
}

/api/v1/personality-interpretation response example

{
  "interpretations": [
    {
      "tier": "bigthree",
      "key": "v1|bigthree|capricorn|leo|libra",
      "text": "A concise grounded interpretation for this Big Three stack."
    }
  ],
  "rateLimited": false
}

CONSUMER NOTES

  • Accepts up to 40 items and silently drops malformed items after normalization.
  • Cache hits are unlimited; cache-miss generation is IP-rate-limited.
  • The endpoint returns generic reusable text and does not consume credits.

POST

Placement Interpretation

/api/v1/placement-interpretation

Cache endpoint for one planet/sign/house placement interpretation.

AUTH
free
CREDITS
Free; generated once per unique placement when configured.
MCP TOOL
generate_placement_interpretation

/api/v1/placement-interpretation request example

{
  "point": "venus",
  "sign": "Capricorn",
  "house": 8
}

/api/v1/placement-interpretation response example

{
  "cached": false,
  "interpretation": {
    "point": "venus",
    "sign": "capricorn",
    "house": 8,
    "text": "Grounded placement interpretation text."
  }
}

CONSUMER NOTES

  • One placement is generated and cached forever per point/sign/house combination.
  • No credits are charged; a missing AI configuration returns 503 on cache miss.
  • Use lowercase or display-case point/sign inputs; the route normalizes them before caching.

POST

Personalized Retrograde Hits

/api/v1/retrograde-hits

Free exact-time Mercury, Venus, and Mars retrograde contact checker.

AUTH
free
CREDITS
Free; public scans are capped at 10 years; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.
MCP TOOL
calculate_personalized_retrograde_hits

/api/v1/retrograde-hits request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "startDate": "2026-01-01",
  "endDate": "2030-12-31",
  "orbDegrees": 3
}

/api/v1/retrograde-hits response example

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 0,
    "locationLabel": "London, United Kingdom",
    "startDate": "2026-01-01",
    "endDate": "2030-12-31",
    "scannedTransitCount": 42,
    "hitCount": 1,
    "caveats": [
      "Only Mercury, Venus, and Mars retrograde or station-grade contacts are personalized here."
    ]
  },
  "hits": [
    {
      "transitingPoint": "mercury",
      "natalPoint": "sun",
      "exactAtIso": "2026-02-03T00:00:00.000Z",
      "motion": {
        "isRetrograde": true,
        "relevance": "retrograde_contact"
      }
    }
  ]
}

CONSUMER NOTES

  • This v1 route reuses the free personalized retrograde checker behind /api/free/retrograde-hits.
  • Exact birth data is required because house and angle contacts are birth-time sensitive.
  • It filters to Mercury, Venus, and Mars retrograde or station-grade contacts and charges no credits.

POST

Solar Return

/api/v1/solar-return

Computes annual profection, solar-return chart context, and SR transit windows.

AUTH
bearer
CREDITS
1 credit per successful report.
MCP TOOL
calculate_solar_return

/api/v1/solar-return request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "referenceDate": "2026-10-01",
  "solarReturn": {
    "enabled": true,
    "returnMode": "tropical_non_precessed",
    "locationBasis": "natal"
  }
}

/api/v1/solar-return response example

{
  "metadata": {
    "locationLabel": "London, United Kingdom",
    "returnMode": "tropical_non_precessed",
    "locationBasis": "natal",
    "creditsRemaining": 8
  },
  "annualContext": {
    "profection": {
      "ageYears": 36,
      "profectionHouse": 1,
      "lordOfYear": "mercury"
    },
    "solarReturn": {
      "ascendantSignName": "Gemini",
      "ascendantRuler": "mercury"
    }
  },
  "categoryScores": [
    {
      "id": "CAREER",
      "score": {
        "total": 21.4,
        "band": "STRONG"
      }
    }
  ],
  "srTransitWindows": []
}

CONSUMER NOTES

  • Bearer token required; costs 1 credit after validation and successful computation.
  • The endpoint always computes annual context even though the shared solarReturn option can disable scoring side effects elsewhere.
  • The natal chart remains birth-based; return-location options only frame the solar-return chart.

POST

Solar Return Location Election

/api/v1/solar-return/elect-location

Ranks birthday cities for a solar-return intent category using the curated city set.

AUTH
bearer
CREDITS
3 credits per successful location election.
MCP TOOL
calculate_solar_return_location_election

/api/v1/solar-return/elect-location request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "referenceDate": "2026-10-01",
  "intentCategory": "CAREER",
  "returnMode": "tropical_non_precessed",
  "topN": 10
}

/api/v1/solar-return/elect-location response example

{
  "metadata": {
    "intentCategory": "CAREER",
    "candidatesEvaluated": 4400,
    "theoreticalMax": 37,
    "creditsRemaining": 7
  },
  "profection": {
    "ageYears": 36,
    "profectionHouse": 1,
    "profectedSignName": "Gemini",
    "lordOfYear": "mercury"
  },
  "candidates": [
    {
      "city": {
        "name": "Dublin",
        "country": "IE",
        "label": "Dublin, IE"
      },
      "total": 27.5,
      "percent": 74,
      "band": "PRIME",
      "components": [],
      "topCategories": [],
      "vetoed": false,
      "caveats": []
    }
  ]
}

CONSUMER NOTES

  • Bearer token required; costs 3 credits per successful location election.
  • The curated city universe is population-filtered; topN may be 1 through 50.
  • Only the solar-return frame moves per candidate; the natal chart is never relocated.

POST

Synastry Compatibility

/api/v1/synastry

Domain-scored relationship compatibility (marriage, business, and more) from synastry inter-aspects, house overlays, and the composite chart.

AUTH
bearer
CREDITS
1 credit per successful compatibility report.
MCP TOOL
calculate_synastry_compatibility

/api/v1/synastry request example

{
  "chartA": {
    "label": "Jordan",
    "birthDate": "1990-01-01",
    "birthTime": "12:00",
    "locationQuery": "London, UK"
  },
  "chartB": {
    "label": "Riley",
    "birthDate": "1992-03-20",
    "birthTime": "08:15",
    "locationQuery": "Paris, France"
  }
}

/api/v1/synastry response example

{
  "metadata": {
    "chartALabel": "Jordan",
    "chartBLabel": "Riley",
    "chartALocationLabel": "London, United Kingdom",
    "chartBLocationLabel": "Paris, France",
    "ephemerisMode": "SWIEPH",
    "creditsRemaining": 9,
    "houseSystem": "P",
    "orbModel": "planet_class",
    "chartATimeKnown": true,
    "chartBTimeKnown": true
  },
  "relationship": {
    "chartALabel": "Jordan",
    "chartBLabel": "Riley",
    "overall": {
      "percentile": 71,
      "band": "promising",
      "headline": "Stronger than most pairings for Marriage & romance; High friction is the growth edge.",
      "strongestDomainId": "marriage_romance",
      "growthEdgeDomainId": "friction_challenges",
      "confidence": "high",
      "confidenceReasons": [
        "Exact birth times and stable bands across ±30 minutes."
      ]
    },
    "domains": [
      {
        "id": "marriage_romance",
        "label": "Marriage & romance",
        "score": 8.75,
        "maxScore": 14,
        "percent": 63,
        "percentile": 84,
        "rawScore": 9.4,
        "band": "strong",
        "evidence": [
          {
            "kind": "synastry_aspect",
            "label": "Jordan Sun trine Riley Moon (orb 1.2°)",
            "points": 4,
            "detail": "Core identity meets emotional nature — the classic marriage signature."
          }
        ],
        "caveats": [],
        "timeStability": {
          "status": "stable",
          "bandsSeen": [
            "strong"
          ],
          "windowMinutes": 30,
          "percentileRange": [
            80,
            88
          ]
        }
      }
    ],
    "topAspects": [],
    "aspectCounts": {
      "supportive": 6,
      "challenging": 3,
      "charged": 2
    }
  },
  "charts": {
    "a": {
      "points": {}
    },
    "b": {
      "points": {}
    },
    "composite": {
      "points": {}
    }
  }
}

CONSUMER NOTES

  • Both charts may be people or exactly-timed events; each needs a date and a location. birthTime is optional: omit it when unknown and the chart is cast at noon with houses and angles skipped.
  • orbDegrees is optional. Omit it to use the calibrated per-planet orbs the bands are built on; sending it switches to a flat override (metadata.orbModel "flat_override").
  • Bands come from percentile (the rank of rawScore against the calibration table), not from percent. overall carries the verdict and its confidence.
  • Every domain score ships its contributing contacts as receipts; treat bands without evidence as neutral.
  • The friction domain is inverted: a high percentile means more friction, and its band reads accordingly.
  • The response is raw JSON and is not auto-saved.

POST

Timeline Teaser

/api/v1/timeline

Free date-only or partial timeline teaser with proof moments and hinge years.

AUTH
free
CREDITS
Free; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.
MCP TOOL
calculate_timeline_teaser

/api/v1/timeline request example

{
  "birthDate": "1990-01-01",
  "events": [
    {
      "id": "event-1",
      "label": "Moved cities",
      "date": "2019-07-01"
    },
    {
      "id": "event-2",
      "label": "Changed jobs",
      "date": "2021-03-10"
    },
    {
      "id": "event-3",
      "label": "Launched project",
      "date": "2024-11-20"
    }
  ]
}

/api/v1/timeline response example

{
  "metadata": {
    "eventCount": 2,
    "birthTimeMode": "date_only",
    "creditsCharged": 0,
    "fullReportAvailable": false
  },
  "analysis": {
    "events": [
      {
        "label": "Moved cities",
        "ageDecimal": 29.567,
        "universalAgeCycles": [
          {
            "cycleId": "saturn-return-1"
          }
        ],
        "dateOnlyPlanetaryHits": [
          {
            "transitingPoint": "saturn",
            "aspect": "square",
            "natalPoint": "sun"
          }
        ]
      }
    ],
    "caveats": [
      "Date-only planetary hits use noon UTC samples."
    ]
  },
  "teaser": {
    "proofMoments": [],
    "hingeYears": []
  }
}

CONSUMER NOTES

  • Free and unauthenticated; accepts birthDate plus up to 5 optional dated events.
  • Date-only analysis omits angles, houses, lots, and exact-time transit windows.
  • Use the full route for exact-birth lifetime scanning and auto-save behavior.

POST

Timeline Full Report

/api/v1/timeline/full

Paid exact-time full timeline with dated-event retrodiction and auto-save.

AUTH
bearer
CREDITS
3 credits per successful report.
MCP TOOL
calculate_timeline_full_report

/api/v1/timeline/full request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "events": [
    {
      "id": "event-1",
      "label": "Moved cities",
      "date": "2019-07-01"
    },
    {
      "id": "event-2",
      "label": "Changed jobs",
      "date": "2021-03-10"
    },
    {
      "id": "event-3",
      "label": "Launched project",
      "date": "2024-11-20"
    }
  ],
  "eventTransitWindowDays": 30,
  "lifetimeEndDate": "2026-12-31"
}

/api/v1/timeline/full response example

{
  "metadata": {
    "birthTimeMode": "exact",
    "eventCount": 2,
    "creditsCharged": 3,
    "creditsRemaining": 9,
    "savedItemId": "calc_timeline_123"
  },
  "analysis": {
    "natalLots": {
      "fortune": {
        "longitude": 112.4
      },
      "spirit": {
        "longitude": 288.1
      }
    },
    "eclipseHits": [],
    "eventWindows": [],
    "lifetimeTransits": []
  },
  "aiNarrative": {
    "model": "glm-5.2",
    "templateName": "timeline-narrative.md",
    "text": "..."
  }
}

CONSUMER NOTES

  • Bearer token and exact birth data are required; successful reports cost 3 credits.
  • The full report auto-saves as a timeline item for the API-key owner.
  • Event and lifetime scans may be CPU-heavy; consumers should keep event counts and date ranges intentional.

POST

Transit Interpretation

/api/v1/transit-interpretation

Batch cache endpoint for generic transit-to-natal interpretation text.

AUTH
free
CREDITS
Free; generated once per unique transit pattern when configured.
MCP TOOL
generate_transit_interpretations

/api/v1/transit-interpretation request example

{
  "items": [
    {
      "transitingPoint": "jupiter",
      "aspect": "trine",
      "natalPoint": "sun",
      "natalHouse": 10,
      "transitingSign": "Cancer",
      "natalSign": "Pisces"
    }
  ]
}

/api/v1/transit-interpretation response example

{
  "interpretations": [
    {
      "transitingPoint": "jupiter",
      "aspect": "trine",
      "natalPoint": "sun",
      "natalHouse": 10,
      "key": "v1|jupiter|trine|sun|10",
      "text": "A grounded generic interpretation for this transit pattern."
    }
  ]
}

CONSUMER NOTES

  • Accepts up to 40 items and dedupes by the normalized transit interpretation key.
  • Malformed items are skipped; an empty normalized set returns an empty interpretations array.
  • This generic cache endpoint is free and separate from paid aspect-tooltip expansions.

POST

Transits

/api/v1/transits

Calculates natal-to-transit and optional transit-to-transit aspect hits.

AUTH
bearer
CREDITS
1 credit per billable calendar month, times chart count; transit-to-transit adds +1 credit and predictive overlays add +1 credit each, at most +3 credits per run.
MCP TOOL
calculate_transits

/api/v1/transits request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "startDate": "2026-10-01",
  "rangeDays": 14,
  "transitToTransit": true,
  "transitingPoints": [
    "jupiter",
    "saturn",
    "chiron"
  ],
  "aspects": [
    "conjunction",
    "trine",
    "opposition"
  ]
}

/api/v1/transits response example

{
  "metadata": {
    "locationLabel": "London, United Kingdom",
    "timezone": "Europe/London",
    "ephemerisMode": "SWIEPH",
    "creditsRemaining": 4
  },
  "natal": {
    "points": {
      "sun": 280.46,
      "moon": 12.45
    }
  },
  "transits": [
    {
      "transitingPoint": "jupiter",
      "natalPoint": "sun",
      "aspect": "trine",
      "enterAtIso": "2026-10-03T00:00:00.000Z",
      "exactAtIso": "2026-10-08T14:23:00.000Z",
      "exitAtIso": "2026-10-12T00:00:00.000Z",
      "exactOrb": 0.12
    }
  ],
  "annualContext": null
}

CONSUMER NOTES

  • Bearer token required; charges 1 credit per billable calendar month, times chart count; transit-to-transit adds +1 credit and predictive overlays add +1 credit each, at most +3 credits per run.
  • Provide either locationQuery or latitude plus longitude; relocation settings affect transit frame only.
  • Each transit hit includes enter/exact/exit ISO timestamps when a span can be resolved.
  • Optional secondChart (person or event) scans the second and composite charts too (monthly base credits ×3) and returns chartResults plus a synastry relationship compatibility report.

POST

Vedic Chart Teaser

/api/v1/vedic-chart

Free exact-birth Vedic scored reading with frame comparison and predictive timing.

AUTH
free
CREDITS
Free; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.
MCP TOOL
calculate_vedic_chart_teaser

/api/v1/vedic-chart request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "referenceDate": "2026-10-01",
  "relocationQuery": "Paris, France",
  "reportMode": "scored_reading"
}

/api/v1/vedic-chart response example

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 0,
    "fullReportAvailable": true,
    "locationLabel": "London, United Kingdom",
    "timezone": "Europe/London",
    "reportMode": "scored_reading",
    "relocationLabel": "Paris, France"
  },
  "report": {
    "metadata": {
      "version": "v1",
      "referenceDateIso": "2026-10-01T00:00:00.000Z",
      "frames": [
        "western_tropical",
        "tropical_vedic",
        "sidereal_vedic"
      ]
    },
    "summary": {
      "topSigns": {
        "tropicalBirth": [],
        "tropicalRelocated": [],
        "siderealBirth": [],
        "siderealRelocated": []
      },
      "activeDasha": {
        "label": "Venus-Saturn",
        "lords": [
          "venus",
          "saturn"
        ],
        "periods": []
      },
      "moonNakshatra": {
        "name": "Rohini",
        "pada": 2,
        "lord": "moon"
      },
      "frameStableHighlights": []
    },
    "scoredReading": {
      "domains": [],
      "timingSpine": {}
    },
    "domains": [
      {
        "id": "career",
        "label": "Career",
        "score": 78,
        "band": "active",
        "statement": "Visible public-role emphasis.",
        "evidence": []
      }
    ],
    "dasha": {
      "referenceDateIso": "2026-10-01T00:00:00.000Z"
    },
    "nakshatras": {},
    "vargas": {},
    "yogaAnalysis": {},
    "comparison": {}
  }
}

CONSUMER NOTES

  • Free exact-birth scored reading; no Bearer token or persistence.
  • The response is { metadata, report }: domains, dasha, nakshatras and vargas live under report.
  • Public copy should call this Vedic Chart, not True Signs.
  • The contract distinguishes Western tropical, Tropical Vedic, and Lahiri sidereal comparison frames.

POST

Vedic Chart Full Report

/api/v1/vedic-chart/full

Paid full Vedic Chart report with saved scored reading and deep technical sections.

AUTH
bearer
CREDITS
3 credits per successful report.
MCP TOOL
calculate_vedic_chart

/api/v1/vedic-chart/full request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "referenceDate": "2026-10-01",
  "relocationQuery": "Paris, France",
  "includeVargaDeepDive": true,
  "reportMode": "scored_reading"
}

/api/v1/vedic-chart/full response example

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 3,
    "creditsRemaining": 9,
    "savedItemId": "calc_vedic_123",
    "fullReportAvailable": true,
    "locationLabel": "London, United Kingdom",
    "timezone": "Europe/London",
    "reportMode": "scored_reading",
    "relocationLabel": "Paris, France"
  },
  "report": {
    "metadata": {
      "version": "v1",
      "referenceDateIso": "2026-10-01T00:00:00.000Z",
      "frames": [
        "western_tropical",
        "tropical_vedic",
        "sidereal_vedic"
      ]
    },
    "summary": {
      "topSigns": {
        "tropicalBirth": [],
        "tropicalRelocated": [],
        "siderealBirth": [],
        "siderealRelocated": []
      },
      "activeDasha": {
        "label": "Venus-Saturn",
        "lords": [
          "venus",
          "saturn"
        ],
        "periods": []
      },
      "moonNakshatra": {
        "name": "Rohini",
        "pada": 2,
        "lord": "moon"
      },
      "frameStableHighlights": []
    },
    "scoredReading": {
      "domains": [],
      "timingSpine": {}
    },
    "domains": [
      {
        "id": "career",
        "label": "Career",
        "score": 78,
        "band": "active",
        "statement": "Visible public-role emphasis.",
        "evidence": []
      }
    ],
    "dasha": {
      "referenceDateIso": "2026-10-01T00:00:00.000Z"
    },
    "nakshatras": {},
    "vargas": {},
    "yogaAnalysis": {},
    "comparison": {}
  },
  "vargaDeepDives": [
    {
      "code": "D9",
      "title": "D9 · Navamsa — the inner self, spouse, dharma",
      "sections": [
        "In the tropical navamsa the lagna lord holds its own sign, traditionally read as a steady core rather than a promise.",
        "The D9 lagna lord sits in the 1st in its own sign (D9 lagna Leo · Sun Leo 1st (own))"
      ]
    }
  ]
}

CONSUMER NOTES

  • Bearer token required; successful full reports cost 3 credits and auto-save to the user account.
  • The response is { metadata, report, vargaDeepDives }; vargaDeepDives carries all sixteen evaluated Shodashavarga readings with receipted findings.
  • Use includeVargaDeepDive when the consumer needs technical varga sections.
  • The response is raw JSON and preserves the frame-comparison evidence rather than returning HTML.

POST

Vedic Chart Predictions

/api/v1/vedic-chart/predictions

Free Vedic predictive report (includes an AI synthesis step) used by the predictions route and overlays.

AUTH
free
CREDITS
Free; anonymous callers: 5 per day per IP. A valid API key or signed-in session is not capped.
MCP TOOL
calculate_vedic_chart_predictions

/api/v1/vedic-chart/predictions request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "referenceDate": "2026-10-01",
  "pastEvents": [
    {
      "date": "2021-03-10",
      "label": "Changed jobs"
    }
  ],
  "includePredictive": true
}

/api/v1/vedic-chart/predictions response example

{
  "metadata": {
    "version": "v1",
    "sourceRoute": "/api/v1/vedic-chart/predictions",
    "locationLabel": "London, United Kingdom"
  },
  "domains": [
    {
      "id": "career",
      "score": 81,
      "evidence": [
        "Dasha and gochara confirmations overlap."
      ]
    }
  ],
  "predictiveWindows": [
    {
      "id": "career-2026-q3",
      "label": "Career opening",
      "score": 76
    }
  ],
  "confirmations": []
}

CONSUMER NOTES

  • Free predictive endpoint using the same Vedic request schema; each report includes an AI synthesis step, so anonymous use has a tighter daily cap.
  • Past events are optional and capped at 5; they are used as retrodictive calibration evidence.
  • This endpoint is for JSON consumers and overlays, not the public Vedic Chart landing copy.

POST

Natal Reading Teaser

/api/v1/natal-reading

Free exact-birth natal reading teaser: placements, top tensions, one growth lever, and a child/parenting mode.

AUTH
free
CREDITS
Free; anonymous callers: 20 per day per IP. A valid API key or signed-in session is not capped.
MCP TOOL
calculate_natal_reading_teaser

/api/v1/natal-reading request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "referenceDate": "2026-10-01",
  "houseSystem": "P",
  "subject": "self",
  "includeLilith": true
}

/api/v1/natal-reading response example

{
  "metadata": {
    "creditsCharged": 0,
    "fullReportAvailable": true,
    "reportMode": "teaser",
    "locationLabel": "London, United Kingdom",
    "houseSystem": "P",
    "subject": "self",
    "generatedAtIso": "2026-08-23T12:00:00.000Z"
  },
  "report": {
    "version": "natal-reading-v1",
    "mode": "self",
    "subjectLabel": "you",
    "teaser": true,
    "hero": {
      "eyebrow": "Natal reading",
      "title": "Saturn-led chart with a Sun square Saturn tension to work",
      "summary": "Structure is the strength; self-permission is the practice.",
      "signals": [
        "Saturn angular in the 10th",
        "Sun square Saturn, 1.8 degrees"
      ],
      "receipt": "Saturn ♑ 10th"
    },
    "placements": [],
    "signatures": [],
    "tensions": [],
    "gifts": [],
    "growth": [],
    "caveats": [
      "Dates and positions are astronomy; meanings are traditional astrology, not certainties."
    ]
  }
}

CONSUMER NOTES

  • Free, no bearer token: requires exact birth date, time, and place (city query or latitude/longitude).
  • subject "child" switches to parenting mode: tendencies, what helps, what backfires; romance, sexuality, and career-legacy domains are never named for minors.
  • Teaser responses are trimmed (top 3 tensions, one growth lever, empty aspect inventory, no house-frame table or midpoints); use /api/v1/natal-reading/full for the complete reading.
  • Every interpretive item carries a receipt such as "Venus ♋ 4th □ Saturn ♈ 1st, 1.8°"; tensions surface only within 6 degrees in exact/tight/moderate tiers.

POST

Natal Reading Full Report

/api/v1/natal-reading/full

Paid full natal reading with every tension's pair-specific reading, full aspect inventory, growth plan, Vedic lens, house-frame comparison, midpoints, grounded AI narrative, and auto-save.

AUTH
bearer
CREDITS
3 credits per successful report.
MCP TOOL
calculate_natal_reading

/api/v1/natal-reading/full request example

{
  "birthDate": "2019-03-14",
  "birthTime": "06:42",
  "locationQuery": "London, UK",
  "subjectName": "Sam",
  "referenceDate": "2026-10-01",
  "houseSystem": "P",
  "subject": "child"
}

/api/v1/natal-reading/full response example

{
  "metadata": {
    "creditsCharged": 3,
    "creditsRemaining": 7,
    "fullReportAvailable": true,
    "reportMode": "deep",
    "locationLabel": "London, United Kingdom",
    "houseSystem": "P",
    "subject": "child",
    "savedItemId": "calc_natal_123",
    "generatedAtIso": "2026-08-23T12:00:00.000Z"
  },
  "report": {
    "version": "natal-reading-v1",
    "mode": "child",
    "subjectLabel": "Sam",
    "ageBand": "7-12",
    "teaser": false,
    "hero": {
      "eyebrow": "Natal reading",
      "title": "Moon-led chart with a Moon opposition Saturn tension to support",
      "summary": "Feelings run deep and want proof of safety; steady routines help.",
      "signals": [
        "Moon angular in the 4th",
        "Moon opposition Saturn, 2.4 degrees"
      ],
      "receipt": "Moon ♋ 4th"
    },
    "placements": [],
    "signatures": [],
    "tensions": [],
    "gifts": [],
    "growth": [],
    "parenting": {
      "ageBand": "7-12",
      "voice": "Written for the adult raising this child.",
      "cautions": []
    },
    "houseFrames": {
      "table": [],
      "divergences": []
    },
    "caveats": []
  },
  "aiNarrative": {
    "text": "A grounded natal portrait anchored to the receipts above.",
    "model": "glm-5.2",
    "receipts": [
      "Moon ♋ 4th"
    ]
  }
}

CONSUMER NOTES

  • Bearer token required; successful full reports cost 3 credits, auto-save as a natal_reading item, and refund on failure.
  • aiNarrative is nullable: the deterministic report always ships and the grounded narrative degrades to null when the provider is down or the output stays ungrounded.
  • The session equivalent is POST /api/calculations/natal-reading (durable report job); this route returns the finished JSON synchronously.

POST

Proof Synthesis

/api/v1/proof-synthesis

Free cross-system life-guess synthesis: combines Timeline dated cycles with Vedic domain scores into concrete, window-level, falsifiable life guesses.

AUTH
free
CREDITS
Free; anonymous callers get 5 full reads per week per network, then the deterministic checks only. Signed-in users are not capped.
MCP TOOL
calculate_proof_synthesis

/api/v1/proof-synthesis request example

{
  "birthDate": "1990-01-01",
  "birthTime": "12:00",
  "locationQuery": "London, UK",
  "houseSystem": "P"
}

/api/v1/proof-synthesis response example

{
  "metadata": {
    "creditsCharged": 0,
    "birthTimeMode": "exact",
    "locationLabel": "London, United Kingdom",
    "referenceDateIso": "2026-07-01"
  },
  "guesses": [
    {
      "kind": "past_event",
      "lifeArea": "marriage",
      "claim": "You likely formed or ended a major committed partnership around 2018.",
      "window": "2018",
      "confidence": "strong",
      "falsifiableCheck": "Did a marriage, engagement, or serious breakup happen around then?",
      "evidenceRefs": [
        "Pluto conjunction natal Venus",
        "Marriage & spouse (score 78)"
      ]
    }
  ],
  "evidence": {
    "pastWindows": [],
    "lifeDomains": [],
    "hingeYears": []
  },
  "synthesisError": null
}

CONSUMER NOTES

  • Free, no bearer token: requires exact birth date, time, and place; reuses the Vedic chart request schema.
  • Combines Timeline dated cycles and Vedic domain scores into concrete, window-level, falsifiable life guesses.
  • Guesses are window-level only; the deterministic evidence bundle always ships and the AI guess layer degrades to an empty list when the provider is down.
  • Optional streaming: send `Accept: application/x-ndjson` to receive two NDJSON events — `{type:"evidence"}` (deterministic report, fast) then `{type:"complete"}` (full report with AI guesses). Default JSON behavior is unchanged.

POST

Window Synthesis

/api/v1/window-synthesis

Free grounded synthesis over rendered election, transit, Vedic, synastry, or natal reading result items.

AUTH
session_or_ip
CREDITS
Free; per domain, anonymous callers get 10 per week per IP, signed-in accounts 25 per week, and members are unlimited.
MCP TOOL
generate_window_synthesis

/api/v1/window-synthesis request example

{
  "domain": "election",
  "orientation": "pragmatic",
  "items": [
    {
      "intentName": "Networking",
      "peakAtIso": "2026-07-01T15:20:00.000Z",
      "score": {
        "total": 18.24
      }
    }
  ],
  "context": {
    "route": "/today"
  }
}

/api/v1/window-synthesis response example

{
  "synthesis": {
    "headline": "Best used for outreach with a clear ask.",
    "bullets": [
      "Lead with the strongest contact window.",
      "Keep the follow-up within the same afternoon."
    ]
  }
}

CONSUMER NOTES

  • Accepts election, transits, vedic, synastry, or natal domains and up to 96 items after truncation.
  • Anonymous usage is IP-rate-limited; signed-in users bypass the weekly anonymous cap.
  • Failures degrade to synthesis null so clients should keep deterministic fallback copy.

POST/api/v1/month

Free Month Ahead teaser for exact birth data. No Bearer token required. It returns the deterministic forecast shell: verdict, daily intensity, peak windows, confidence-ranked domains, timing spine, flat evidence events, and provenance.

REQUEST BODY - JSON

FIELDTYPEDEFAULTDESCRIPTION
birthDate*stringREQBirth date YYYY-MM-DD.
birthTime*stringREQExact birth time HH:MM.
locationQuerystring?—City search, e.g. "Denver, CO"; required unless latitude and longitude are supplied.
latitudenumber?—Birth latitude. Must be supplied with longitude when no locationQuery is used.
longitudenumber?—Birth longitude. Must be supplied with latitude when no locationQuery is used.
timezonestring?—Optional IANA timezone override.
startDate*stringREQForecast start date YYYY-MM-DD.
daysinteger30Forecast length. Range 1-62.
houseSystemstringPHouse system for exact-time chart framing.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/month \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "1990-01-01",
    "birthTime": "12:00",
    "locationQuery": "London, UK",
    "startDate": "2026-10-01"
  }'

RESPONSE

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 0,
    "fullReportAvailable": false,
    "narrativeIncluded": false
  },
  "forecast": {
    "verdict": {
      "headline": "Mixed but workable month",
      "summary": "Peak support clusters around mid-month.",
      "score": 63
    },
    "dailyIntensity": [
      { "date": "2026-07-01", "score": 42, "eventCount": 2 }
    ],
    "peakWindows": [],
    "domains": [],
    "timingSpine": [],
    "provenance": { "rulesetVersion": "scored-reading-v2" }
  },
  "aiNarrative": null
}

POST/api/v1/month/full

Paid full Month Ahead report for exact birth data. Bearer token required. Costs 3 credits only after payload validation and sufficient-credit checks succeed.

This route returns raw JSON only: the deterministic forecast plus the generated narrative, credit metadata, and the saved Month Ahead item id. Web-session customers use the same engine through /api/calculations/month.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/month/full \
  -H "Authorization: Bearer sk_tr_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "1990-01-01",
    "birthTime": "12:00",
    "locationQuery": "London, UK",
    "startDate": "2026-10-01",
    "days": 30
  }'

RESPONSE

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 3,
    "creditsRemaining": 12,
    "savedItemId": "calc_...",
    "fullReportAvailable": true,
    "narrativeIncluded": true
  },
  "forecast": {
    "verdict": {},
    "dailyIntensity": [],
    "peakWindows": [],
    "domains": [],
    "timingSpine": []
  },
  "aiNarrative": {
    "model": "glm-5.2",
    "provider": "zai",
    "text": "..."
  }
}

POST/api/v1/vedic-chart

Free Vedic Chart scored reading for exact birth data. No Bearer token required. The default reportMode is scored_reading: tropical Vedic domain claims with deterministic confidence weights, frame-proof flags, the current Vimshottari dasha spine, Moon nakshatra, vargas, and a secondary tropical/sidereal comparison.

REQUEST BODY - JSON

FIELDTYPEDEFAULTDESCRIPTION
birthDate*stringREQBirth date YYYY-MM-DD.
birthTime*stringREQExact birth time HH:MM.
locationQuerystring?—City search, e.g. "Denver, CO"; required unless latitude and longitude are supplied.
latitudenumber?—Birth latitude. Must be supplied with longitude when no locationQuery is used.
longitudenumber?—Birth longitude. Must be supplied with latitude when no locationQuery is used.
timezonestring?—Optional IANA timezone override.
houseSystemstringPHouse system for lagna, houses, and comparison frames.
relocationQuerystring?—Optional current or relocated city, e.g. "Paris, France".
framesarray?allwestern_tropical, tropical_vedic, sidereal_vedic.
reportModestringscored_readingscored_reading for the default domain tables; compare keeps the legacy comparison-first contract reachable.
includePredictivebooleantrueInclude dasha and life-domain timing sections.
includeVargaDeepDivebooleanfalseInclude technical varga grids when true.
referenceDatestring?—YYYY-MM-DD date used for the active dasha clock.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/vedic-chart \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "1990-01-01",
    "birthTime": "12:00",
    "locationQuery": "London, UK",
    "relocationQuery": "Paris, France",
    "referenceDate": "2026-10-01"
  }'

RESPONSE

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 0,
    "fullReportAvailable": true,
    "reportMode": "scored_reading",
    "locationLabel": "London, United Kingdom"
  },
  "report": {
    "scoredReading": {
      "domains": [],
      "timingSpine": {},
      "provenance": { "rulesetVersion": "scored-reading-v2" }
    },
    "summary": {
      "topSigns": {
        "tropicalRelocated": ["Capricorn", "Leo", "Libra"],
        "siderealRelocated": ["Sagittarius", "Cancer", "Virgo"]
      },
      "activeDasha": { "label": "Venus-Saturn" },
      "moonNakshatra": { "name": "Rohini", "pada": 2 }
    },
    "comparison": {
      "stable": [],
      "changed": [],
      "relocationSensitive": []
    },
    "domains": []
  }
}

POST/api/v1/vedic-chart/full

Paid full Vedic Chart report for exact birth data. Bearer token required. Costs 3 credits only after payload validation and sufficient-credit checks succeed.

This route returns raw JSON only: the full scored reading plus Western tropical, Tropical Vedic, and sidereal Vedic technical comparison, Vimshottari dasha, nakshatra stack, varga summaries, and predictive domain cards. No HTML is returned.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/vedic-chart/full \
  -H "Authorization: Bearer sk_tr_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "1990-01-01",
    "birthTime": "12:00",
    "locationQuery": "London, UK",
    "relocationQuery": "Paris, France",
    "includeVargaDeepDive": true,
    "referenceDate": "2026-10-01"
  }'

RESPONSE

{
  "metadata": {
    "birthTimeMode": "exact",
    "creditsCharged": 3,
    "creditsRemaining": 12,
    "savedItemId": "calc_...",
    "fullReportAvailable": true,
    "reportMode": "scored_reading",
    "locationLabel": "London, United Kingdom"
  },
  "report": {
    "scoredReading": {},
    "westernBaseline": {},
    "tropicalVedic": {},
    "siderealVedic": {},
    "dasha": {},
    "nakshatras": {},
    "vargas": {},
    "domains": []
  }
}

POST/api/v1/natal-reading

Free Natal Reading teaser for exact birth data. No Bearer token required. It casts the chart once and returns a deterministic, receipt-backed reading: a hero answer, placements with dignity, four signatures (rising, Sun, Moon, Saturn), the top three ranked tensions, one gift, one growth lever, and, with subject: "child", a trimmed parenting block written for the adult raising the child. The MCP tool is calculate_natal_reading_teaser.

REQUEST BODY - JSON

FIELDTYPEDEFAULTDESCRIPTION
birthDate*stringREQBirth date YYYY-MM-DD (1900 through next year).
birthTime*stringREQExact birth time HH:MM. Rising sign and houses need it; there is no date-only mode.
locationQuerystring?—City search, e.g. "Denver, CO"; required unless latitude and longitude are supplied.
latitudenumber?—Birth latitude. Must be supplied with longitude when no locationQuery is used.
longitudenumber?—Birth longitude. Must be supplied with latitude when no locationQuery is used.
timezonestring?—Optional IANA timezone override; otherwise resolved from the coordinates.
houseSystemstringPPrimary house frame. Placidus, Koch, and whole-sign are always also cast for the comparison table.
subjectstringselfself or child. child switches the framing layer: parent-addressed copy, no Lilith, no adult themes.
subjectNamestring?—Optional name (letters, spaces, apostrophes, hyphens; max 40) used to address a child reading.
includeLilithbooleantruefalse drops Black Moon Lilith from signatures, tensions, and growth levers.
referenceDatestring?—YYYY-MM-DD used only for the child age band; defaults to the generation date.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/natal-reading \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "2019-03-14",
    "birthTime": "06:42",
    "locationQuery": "London, UK",
    "subjectName": "Sam",
    "subject": "child"
  }'

RESPONSE

{
  "metadata": {
    "creditsCharged": 0,
    "fullReportAvailable": true,
    "reportMode": "teaser",
    "locationLabel": "London, United Kingdom",
    "houseSystem": "P",
    "subject": "child",
    "generatedAtIso": "2026-08-23T00:00:00.000Z"
  },
  "report": {
    "version": "natal-reading-v1",
    "mode": "child",
    "subjectLabel": "Sam",
    "ageBand": "7-12",
    "teaser": true,
    "hero": { "eyebrow": "Natal reading · for the parent", "title": "...", "summary": "...", "signals": [], "receipt": "..." },
    "chart": { "points": [], "cusps": [], "houseSystem": "P", "asc": 0, "mc": 0, "isDiurnal": true },
    "placements": [],
    "personality": {},
    "dominant": [],
    "signatures": [],
    "tensions": [],
    "gifts": [],
    "configurations": [],
    "growth": [],
    "parenting": { "temperament": [], "needs": [], "helps": [], "backfires": [], "support": [], "cautions": [] },
    "caveats": []
  }
}

POST/api/v1/natal-reading/full

Paid full Natal Reading for exact birth data. Bearer token required. Costs 3 credits only after payload validation and sufficient-credit checks succeed; a failure after the reservation refunds the credits.

This route returns raw JSON only: the untrimmed reading with every tension and its pair-specific reading, the full aspect inventory, up to four gifts, the full growth plan, the Vedic lens, the Placidus/Koch/whole-sign house-frame table, display-only midpoints, and a grounded narrative that is null when no AI provider is available. The reading auto-saves as a natal_reading item for the API-key owner. The MCP tool is calculate_natal_reading.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/natal-reading/full \
  -H "Authorization: Bearer sk_tr_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "2019-03-14",
    "birthTime": "06:42",
    "locationQuery": "London, UK",
    "subjectName": "Sam",
    "houseSystem": "W",
    "subject": "child"
  }'

RESPONSE

{
  "metadata": {
    "creditsCharged": 3,
    "creditsRemaining": 12,
    "savedItemId": "calc_...",
    "fullReportAvailable": false,
    "reportMode": "deep",
    "locationLabel": "London, United Kingdom",
    "houseSystem": "W",
    "subject": "child",
    "generatedAtIso": "2026-08-23T00:00:00.000Z"
  },
  "report": {
    "version": "natal-reading-v1",
    "mode": "child",
    "teaser": false,
    "hero": {},
    "chart": {},
    "placements": [],
    "signatures": [],
    "tensions": [],
    "gifts": [],
    "growth": [],
    "parenting": {},
    "houseFrames": { "table": [], "divergences": [] },
    "midpoints": {},
    "caveats": []
  },
  "aiNarrative": { "text": "...", "model": "glm-5.2", "receipts": [] }
}

POST/api/v1/timeline

Free Timeline teaser: past-only proof moments and hinge years from your birth date alone, plus optional retrodiction of up to 5 dated past events against universal age cycles, approximate noon UTC planetary hits, and profection basics. No Bearer token required.

REQUEST BODY - JSON

FIELDTYPEDEFAULTDESCRIPTION
birthDate*stringREQBirth date YYYY-MM-DD.
natalAscLongitudenumber?—Optional natal Ascendant longitude, 0 <= longitude < 360, used to name profected sign and Lord of Year.
eventsarray?[]Up to 5 optional dated events shaped as { id, label, date }.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/timeline \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "1990-01-01",
    "events": [
      {
        "id": "event-1",
        "label": "Moved cities",
        "date": "2019-07-01"
      },
      {
        "id": "event-2",
        "label": "Changed jobs",
        "date": "2021-03-10"
      },
      {
        "id": "event-3",
        "label": "Launched project",
        "date": "2024-11-20"
      }
    ]
  }'

RESPONSE

{
  "metadata": {
    "eventCount": 3,
    "birthTimeMode": "date_only",
    "creditsCharged": 0,
    "fullReportAvailable": false
  },
  "analysis": {
    "events": [
      {
        "label": "Moved cities",
        "ageDecimal": 29.567,
        "universalAgeCycles": [{ "cycleId": "saturn-return-1" }],
        "dateOnlyPlanetaryHits": [
          { "transitingPoint": "saturn", "aspect": "square", "natalPoint": "sun", "orbDegrees": 0.2 }
        ],
        "profection": { "mode": "date_only", "profectionHouse": 6 }
      }
    ],
    "caveats": [
      "Birth time not supplied; house cusps, angles, and Lord of Year are omitted.",
      "Date-only planetary hits use noon UTC birth/event planetary positions; Moon, angles, houses, and exact timing require the full report."
    ]
  }
}

POST/api/v1/timeline/full

Paid full Timeline report for exact birth data. Bearer token required. Costs 3 credits only after payload validation and sufficient-credit checks succeed.

This route runs exact-time natal angles, Fortune and Spirit lots, generated eclipse contacts, event transit windows, annual profections, and optional lifetime transit scanning, then saves the finished report to the authenticated user account.

REQUEST BODY - JSON

FIELDTYPEDEFAULTDESCRIPTION
birthDate*stringREQBirth date YYYY-MM-DD.
birthTime*stringREQExact birth time HH:MM.
locationQuerystring?—City search, e.g. "Denver, CO"; required unless latitude and longitude are supplied.
latitudenumber?—Birth latitude. Must be supplied with longitude when no locationQuery is used.
longitudenumber?—Birth longitude. Must be supplied with latitude when no locationQuery is used.
timezonestring?—Optional IANA timezone override for the birth location.
houseSystemstringPHouse system for natal angles and profected house labels.
eventsarray?[]Up to 5 optional dated events shaped as { id, label, date }.
eventTransitWindowDaysinteger30Days to scan around each dated event. Range 1-90.
lifetimeEndDatestring?—Optional YYYY-MM-DD end date for a lifetime transit scan; must be after birthDate.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/timeline/full \
  -H "Authorization: Bearer sk_tr_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "1990-01-01",
    "birthTime": "12:00",
    "locationQuery": "London, UK",
    "events": [
      {
        "id": "event-1",
        "label": "Moved cities",
        "date": "2019-07-01"
      },
      {
        "id": "event-2",
        "label": "Changed jobs",
        "date": "2021-03-10"
      },
      {
        "id": "event-3",
        "label": "Launched project",
        "date": "2024-11-20"
      }
    ],
    "eventTransitWindowDays": 30,
    "lifetimeEndDate": "2026-12-31"
  }'

RESPONSE

{
  "metadata": {
    "eventCount": 3,
    "birthTimeMode": "ascendant",
    "creditsCharged": 3,
    "creditsRemaining": 12,
    "savedItemId": "calc_...",
    "fullReportAvailable": true,
    "locationLabel": "London, United Kingdom"
  },
  "analysis": {
    "natalLots": {
      "status": "computed",
      "isDiurnal": true,
      "lotOfFortune": { "point": "lot_of_fortune", "signName": "Taurus", "house": 2 },
      "lotOfSpirit": { "point": "lot_of_spirit", "signName": "Pisces", "house": 12 }
    },
    "events": [
      {
        "label": "Moved cities",
        "personalizedTransitHits": [],
        "profection": { "mode": "ascendant", "profectionHouse": 6 }
      }
    ],
    "eclipseHits": [
      {
        "eclipseId": "solar-2026-08-12",
        "natalPoint": "sun",
        "aspect": "conjunction",
        "orbDegrees": 0.8
      }
    ],
    "eclipseContactTimeline": {
      "status": "computed",
      "orbDegrees": 3,
      "eclipseCount": 12
    },
    "transitScan": { "status": "scanned", "windowDays": 30 },
    "lifetimeTransitScan": { "status": "scanned" }
  }
}

POST/api/v1/transits

Calculate all transit aspects for a natal chart over a configurable date range.

☿ REQUEST BODY — JSON

FIELDTYPEDEFAULTDESCRIPTION
birthDate*stringREQBirth date YYYY-MM-DD.
birthTime*stringREQBirth time HH:MM (24h).
locationQuerystring?—City search, e.g. "Paris, France".
latitudenumber?—Birth latitude (-90..90).
longitudenumber?—Birth longitude (-180..180).
timezonestring?—IANA tz override.
startDatestring?todayScan start YYYY-MM-DD.
endDatestring?+7dScan end YYYY-MM-DD.
rangeDaysinteger?7Compatibility duration; normalized to an absolute end date. Maximum one calendar year.
deliverystring?auto"auto" briefly waits for short jobs; "async" always returns 202. Five-minute estimates are forced async.
transitingPointsstring[]Magi 11 + true_nodeTransiting bodies.
natalPointsstring[]Magi 11 + true_nodeNatal points.
aspectsstring[]Magi 9Aspect types.
orbDegreesnumber3Longitude orb (0.01-6).
declinationOrbDegreesnumber1.2Declination orb (0.01-3).
houseSystemstringPHouse system for angles.
transitToTransitbooleanfalseOptional transit-to-transit sky-pattern hits (one flat additional credit).
asteroidFinderbooleantrueFind top discoverable asteroid contacts at 1 degree conjunction/opposition only.
fixedStarFinderbooleanfalseFind top-ten fixed-star plus galactic-point contacts at 1 degree conjunction/opposition only.
midpointsbooleanfalseInclude the natal Ebertin midpoint layer (Sun/Moon + ASC/MC midpoints, midpoint pictures) plus transit-to-midpoint activation windows over the scanned range. No extra credits.
secondChartobject?—Optional second chart (person or exactly-timed event; same fields as the electional secondChart). The scan also runs for this chart and the composite (midpoint) chart — monthly base credits ×3 — and the response adds chartResults plus a synastry compatibility report.

✦ AVAILABLE VALUES

TRANSITING / NATAL (PLANETS)

sunmoonmercuryvenusmarsjupitersaturnuranusneptuneplutotrue_nodemean_nodechironlilith

ASTEROIDS

cerespallasjunovestahygieaerospsychesapphoastraeapholus

FIXED STARS

spicaregulusaldebaranantaresalgolsiriusfomalhautvegadeneb_algedialcyone

GALACTIC POINTS

galactic_centergreat_attractor

NATAL (ANGLES)

ascmc

ASPECTS

conjunctionsemi_sextilesemi_squaresextilequintilesquaretrinesesquisquarebiquintilequincunxoppositionparallelcontraparallel

HOUSE SYSTEM

PKORCEVW

☉ DEFAULTS

Points (Magi 11 + true_node): sun, moon, mercury, venus, mars, jupiter, saturn, uranus, neptune, pluto, chiron, true_node

Aspects: conjunction, semi_sextile, sextile, square, trine, quincunx, opposition, parallel, contraparallel

✦ EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/transits \
  -H "Authorization: Bearer sk_tr_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "1990-01-01",
    "birthTime": "12:00",
    "locationQuery": "London, UK",
    "startDate": "2026-10-01",
    "rangeDays": 7,
    "transitToTransit": true,
    "transitingPoints": [
      "jupiter",
      "saturn",
      "chiron"
    ],
    "aspects": [
      "conjunction",
      "trine",
      "opposition"
    ]
  }'

☉ RESPONSE

Each hit includes enterAtIso, exactAtIso, and exitAtIso — ISO 8601 UTC.

{
  "metadata": {
    "locationLabel": "London, United Kingdom",
    "latitude": 51.5074,
    "longitude": -0.1278,
    "timezone": "Europe/London",
    "ephemerisMode": "SWIEPH",
    "creditsRemaining": 4
  },
  "natal": {
    "julianDayUt": 2448057.927,
    "points": { "sun": 84.23, "moon": 212.45, ... },
    "declinations": { "sun": 23.31, "moon": -5.12, ... }
  },
  "transits": [
    {
      "transitingPoint": "jupiter",
      "natalPoint": "sun",
      "aspect": "trine",
      "aspectDomain": "zodiac",
      "enterAtIso": "2026-03-10T00:00:00.000Z",
      "exactAtIso": "2026-03-18T14:23:00.000Z",
      "exitAtIso": "2026-03-26T00:00:00.000Z",
      "exactOrb": 0.12,
      "exactDifference": 0.12,
      "transitingLongitude": 204.35,
      "natalLongitude": 84.23,
      "isApplying": false
    }
  ]
}

The report above is the 200 body you get when the job finishes inside the short delivery: "auto" wait. Longer scans, and every delivery: "async" call, return a 202 job receipt instead; see Report jobs.

REPORT JOBS: 202, 402 AND POLLING

/api/v1/transits and /api/v1/electional-spellcasting queue a durable job first. The POST answers 200 with the finished report only when it completes within the short auto wait; otherwise it answers 202 with the receipt below, plus Location, Idempotency-Key and x-credits-remaining headers. Credits are reserved when the job is queued and refunded if it fails.

Send an Idempotency-Key header (a new UUID per request, up to 200 characters; a longer or missing key is replaced by a fresh server key) and reuse it when you retry that request. A retry with the same Idempotency-Key and body returns the original receipt without reserving credits again; the same key with a different body returns 409 IDEMPOTENCY_KEY_REUSED.

202 ACCEPTED — JOB RECEIPT

{
  "jobId": "6650f1c2a9e4b3d2c1f0e9a8",
  "idempotencyKey": "client-retry-key-001",
  "kind": "transits",
  "status": "queued",
  "statusUrl": "/api/v1/report-jobs/6650f1c2a9e4b3d2c1f0e9a8",
  "resultUrl": "/api/v1/report-jobs/6650f1c2a9e4b3d2c1f0e9a8/result",
  "forcedAsync": false,
  "billing": {
    "billingVersion": 2,
    "billableMonths": 1,
    "intentCount": 0,
    "chartCount": 1,
    "baseCredits": 1,
    "addonCredits": 0,
    "totalCredits": 1
  },
  "remainingCredits": 24
}

402 — INSUFFICIENT CREDITS (REPORT ROUTES)

The same receipt with status: "rejected". It has no top-level error or code; read failure.code. Replaying its key returns the same rejected receipt, so after adding credits, resubmit with a new Idempotency-Key.

{
  "jobId": "6650f1c2a9e4b3d2c1f0e9a8",
  "idempotencyKey": "client-retry-key-001",
  "kind": "transits",
  "status": "rejected",
  "statusUrl": "/api/v1/report-jobs/6650f1c2a9e4b3d2c1f0e9a8",
  "resultUrl": "/api/v1/report-jobs/6650f1c2a9e4b3d2c1f0e9a8/result",
  "forcedAsync": false,
  "billing": {
    "billingVersion": 2,
    "billableMonths": 1,
    "intentCount": 0,
    "chartCount": 1,
    "baseCredits": 1,
    "addonCredits": 0,
    "totalCredits": 1
  },
  "failure": {
    "code": "INSUFFICIENT_API_CREDITS",
    "message": "Insufficient API credits for this report."
  }
}

402 — INSUFFICIENT CREDITS (SINGLE-CALL ROUTES)

Every other paid route (timeline, month, Vedic and natal full reports, synastry, solar return, AI guidance) answers in one call and returns:

{
  "error": "Insufficient API credits.",
  "code": "INSUFFICIENT_API_CREDITS",
  "remainingCredits": 0
}

POLLING

GET statusUrl until job.status is completed, then GET resultUrl. Statuses: created, queued, running, retry_wait, completed, rejected, failed. Send the same Bearer key. MCP clients use the get_report_job tool.

ROUTEAUTHCREDITSMCP TOOLUSE
GET/api/v1/report-jobs/{jobId}bearerFree.get_report_jobReturns { job } with status, progress, billing and, once completed, result.resultUrl. 404 when the job is not yours or does not exist.
GET/api/v1/report-jobs/{jobId}/resultbearerFree.get_report_job200 with the finished report once completed; 202 with status and progress while active, plus retryAt while retry_wait; 409 with status, billing and failure for a failed or rejected job; 410 REPORT_ARTIFACT_UNAVAILABLE if the stored report is gone.

GET /api/v1/report-jobs/{jobId} RESPONSE

{
  "job": {
    "id": "6650f1c2a9e4b3d2c1f0e9a8",
    "kind": "transits",
    "sourceRoute": "/api/v1/transits",
    "status": "running",
    "progress": {
      "phase": "transit_scan",
      "completedUnits": 0,
      "totalUnits": 1,
      "percent": 0,
      "message": "Scanning transits"
    },
    "summary": {
      "startDate": "2026-10-01",
      "endDate": "2026-11-01",
      "durationDays": 31,
      "intentCount": 0,
      "chartCount": 1
    },
    "execution": {
      "estimatedDurationMs": 45000,
      "forcedAsync": false,
      "queueReason": "wait_budget_elapsed",
      "attempt": 1,
      "maxAttempts": 4,
      "availableAt": "2026-10-01T12:00:00.000Z",
      "startedAt": "2026-10-01T12:00:01.000Z"
    },
    "billing": {
      "version": 2,
      "credits": 1,
      "status": "reserved",
      "remainingCreditsAfterReservation": 24,
      "quote": {
        "billingVersion": 2,
        "billableMonths": 1,
        "intentCount": 0,
        "chartCount": 1,
        "baseCredits": 1,
        "addonCredits": 0,
        "totalCredits": 1
      }
    },
    "createdAt": "2026-10-01T12:00:00.000Z",
    "updatedAt": "2026-10-01T12:00:14.000Z"
  }
}

GET /api/v1/report-jobs/{jobId}/result WHILE ACTIVE (202)

{
  "status": "running",
  "progress": {
    "phase": "transit_scan",
    "completedUnits": 0,
    "totalUnits": 1,
    "percent": 0,
    "message": "Scanning transits"
  }
}

✦ ERROR CODES

STATUSCODEMEANING
400(none)Invalid request body. The body carries details.fieldErrors from the schema.
400INVALID_REPORT_DELIVERYdelivery must be "auto" or "async".
400INVALID_DATE_RANGEstartDate or endDate is not a valid YYYY-MM-DD date.
400END_DATE_NOT_AFTER_STARTendDate must be after startDate.
400RANGE_EXCEEDS_ONE_YEARThe range runs past the same calendar date next year.
401AUTHENTICATION_REQUIREDNo Bearer key and no signed-in session. An invalid or revoked key returns 401 without a code.
402INSUFFICIENT_API_CREDITSNot enough credits. The body is the job receipt with status "rejected"; read failure.code.
409IDEMPOTENCY_KEY_REUSEDThis Idempotency-Key was already used for a different request.
500REPORT_QUEUE_ERRORThe report could not be queued. Retry with the same Idempotency-Key.
503REPORT_QUEUE_UNAVAILABLEReport processing is temporarily unavailable. No credits were reserved; safe to retry.

POST/api/v1/electional-spellcasting

Generate ranked timing windows for a selected goal using house-first scoring.

Credit model: 1 CREDIT PER INTENT PER BILLABLE CALENDAR MONTH. Transit-to-transit data is still calculated for every electional request, while its scoring contribution can now be disabled through request scoring settings.

Engine: Layered Electional Scoring. 40 live rule layers across 7 ordered passes, with transit-to-natal weighting kept above transit-to-transit refinement.

☽ REQUIRED FIELDS

FIELDTYPEDEFAULTDESCRIPTION
intentIdstring?—Singular timing goal; provide exactly one of intentId or intentIds.
intentIdsstring[]?—One to 72 unique timing goals, scored from one shared scan.
birthDate*stringREQBirth date YYYY-MM-DD.
birthTime*stringREQBirth time HH:MM (24h).
locationQuerystring?—City search text.
latitudenumber?—Latitude coordinate.
longitudenumber?—Longitude coordinate.
timezonestring?—Birth timezone override for natal conversion.
startDatestring?todayScan start.
endDatestring?+7dScan end.
rangeDaysinteger?7Compatibility duration; normalized to an absolute end date. Maximum one calendar year.
deliverystring?auto"auto" briefly waits for short jobs; "async" always returns 202. Five-minute estimates are forced async.
transitingPointsstring[]Magi 11Transiting bodies included in scoring and chart output.
aspectsstring[]All 13Transit aspect types to calculate. Session-based UI requests fall back to saved account defaults.
orbDegreesnumber3Longitude orb (0.01-6).
declinationOrbDegreesnumber1.2Declination orb (0.01-3).
houseSystemstringPHouse system for angles and cusps.
strictnessstringstandard"relaxed" | "standard" | "strict".
natalWeightnumber1Natal weight (0-2).
maxWindowsinteger2Max windows (1-20).
asteroidFinderbooleantrueFind asteroid discovery contacts at 1 degree conjunction/opposition only; curated ones add a small hard-capped Pass 7 contribution and never create a window.
fixedStarFinderbooleantrueFind top-ten fixed-star plus galactic-point discovery contacts at 1 degree conjunction/opposition only; curated ones add a small hard-capped Pass 7 contribution and never create a window.
scoring.enabledPassesstring[]?All 7Optional pass ids to keep active in the returned score.
scoring.enabledRulesstring[]?All rule groupsOptional scoring-rule ids to keep active in the returned score.
scoring.aspectPotenciesobject?Production defaultsOptional per-aspect strength multipliers, e.g. make sextile weaker or stronger for this request.
scoring.useNatalHouseFrameOnlyboolean?falseThe elected chart is the default frame. Set true to ignore temporary election Asc/MC, election-frame sect/hayz, lots, and node-to-angle scoring while retaining natal-house transit placement.
relocationQuerystring?—Optional current-location search text for relocated angles/houses.
relocationLatitudenumber?—Manual relocation latitude.
relocationLongitudenumber?—Manual relocation longitude.
secondChartobject?—Optional second chart (another person or an exactly-timed event). When set, the scan runs across the primary chart, this chart, and their composite (midpoint) chart; extra results return in chartResults and the credit cost is multiplied by 3.
secondChart.kindstring?person"person" | "event".
secondChart.labelstring?—Display label echoed back on chartResults.
secondChart.birthDate*stringREQSecond chart date YYYY-MM-DD (birth or event).
secondChart.birthTime*stringREQSecond chart time HH:MM (24h).
secondChart.locationQuerystring?—City search text, or supply latitude+longitude.
secondChart.latitudenumber?—Second chart latitude.
secondChart.longitudenumber?—Second chart longitude.
secondChart.timezonestring?—Timezone override for the second chart's local time.

✦ EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/electional-spellcasting \
  -H "Authorization: Bearer sk_tr_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "intentId": "career-advancement-promotion",
    "birthDate": "1990-01-01",
    "birthTime": "12:00",
    "locationQuery": "London, UK",
    "startDate": "2026-10-01",
    "rangeDays": 7,
    "strictness": "standard",
    "scoring": {
      "enabledPasses": [
        "pass1Baseline",
        "pass3IntentFit",
        "pass4NatalCompatibility"
      ],
      "enabledRules": [
        "moon_phase",
        "primary_significator_hits",
        "natal_anchor_hits"
      ],
      "useNatalHouseFrameOnly": false,
      "aspectPotencies": {
        "sextile": 0.35,
        "biquintile": 0.06
      }
    }
  }'

☉ RESPONSE

{
  "metadata": {
    "scanStartDate": "2026-01-01",
    "scanEndDate": "2026-01-31",
    "transitToTransitUsed": true,
    "strictness": "standard",
    "creditsRemaining": 3
  },
  "intent": {
    "id": "career-advancement-promotion",
    "house": 10,
    "polarity": "constructive"
  },
  "windows": [
    {
      "startAtIso": "2026-01-18T00:00:00.000Z",
      "peakAtIso": "2026-01-19T12:00:00.000Z",
      "endAtIso": "2026-01-21T00:00:00.000Z",
      "score": {
        "total": 18.24,
        "pass1Baseline": 3.6,
        "pass2HouseAlignment": 4.55,
        "pass3IntentFit": 4.12,
        "pass4NatalCompatibility": 3.97,
        "pass5Finalization": 2.0
      },
      "planetConditions": [
        {
          "point": "sun",
          "score": 3.6,
          "band": "commanding",
          "house": 10,
          "roles": ["house_ruler"],
          "lineItems": [
            { "label": "DOMICILE", "points": 2.4, "detail": "sun is in domicile in Leo" },
            { "label": "HOUSE STRENGTH", "points": 1.2, "detail": "sun is placed in natal house 10" }
          ]
        }
      ],
      "moonVoidOfCourse": {
        "isVoid": false,
        "nextMoonHitAtIso": "2026-01-19T16:20:00.000Z"
      },
      "integrityDiagnostics": {
        "nearestSyzygy": {
          "kind": "new",
          "exactAtIso": "2026-01-18T19:52:00.000Z",
          "relation": "previous",
          "distanceHours": 16.13,
          "withinFourDaysOfNewMoon": true
        },
        "nextMoonPerfection": {
          "status": "found",
          "exactAtIso": "2026-01-19T16:20:00.000Z",
          "targetPoint": "mars",
          "aspect": "trine",
          "influence": "support",
          "hoursAfterPeak": 4.33
        }
      }
    }
  ],
  "scanDiagnostics": {
    "candidateAudit": { "candidatePeakCount": 14, "minimumVacantSpanHours": 3, "totalVacantSpanCount": 2, "truncatedCount": 0, "spans": [] },
    "maleficAngleAudit": { "status": "complete", "sampleCadenceMinutes": 30, "maxOrbDegrees": 5, "sampledMomentCount": 1489, "failedSampleCount": 0, "totalUnrepresentedIntervalCount": 3, "truncatedCount": 0, "intervals": [] }
  }
}

Like transits, this route returns the report above only when the job finishes inside the auto wait; otherwise it returns the 202 job receipt (or a 402 rejected receipt) described under Report jobs.

Window rationale may include advanced diagnostics already active in production, including natal target condition, return windows, true void-of-course with exact sign-exit time in moonVoidOfCourse.endsAtIso, Via Combusta, besiegement, lots, antiscia, and nodal or translation/perfection notes when present. Asteroid, fixed-star, and galactic discovery contacts are returned in discoveryHits/discoveryHitInsights. Curated catalog members score as bounded minor testimonies in score.pass7DiscoveryContacts (cap 3/-3); matches outside the catalog stay display-only. They never create a candidate window and never define a window's span.

Integrity receipts are observational only. Each window's integrityDiagnostics identifies the nearest exact syzygy and the Moon's next major perfected aspect (or its void/unavailable state). Top-level scanDiagnostics records gaps longer than three hours between candidate exactitudes plus Mars/Saturn-on-ASC/MC intervals that contain no candidate peak. These fields do not alter nomination, scoring, gates, or rank. Multi-chart responses place additional timing-frame audits in chartScanDiagnostics.

With secondChart set, the top-level windows stay the primary chart's results and an additional chartResults array carries one entry per extra chart (chartKey of secondary or composite, its label, per-chart natal geometry, and its own windows). The composite chart uses shortest-arc midpoints, skips declination contacts and annual (solar-return) context, and anchors planetary day/hour timing at the primary chart's location. A relationship field also rides along with the same domain-scored synastry compatibility report returned by /api/v1/synastry, at no extra credit cost.

POST/api/v1/synastry

Domain-scored relationship compatibility for two charts (people or exactly-timed events): marriage & romance, business & partnership, communication, chemistry, stability, and friction — derived from synastry inter-aspects, bidirectional house overlays, and the composite (midpoint) chart's internal aspects. Every domain ships its contributing contacts as receipts.

Credit model: 1 CREDIT per successful report. Raw JSON only; not auto-saved.

☽ REQUEST FIELDS

FIELDTYPEDEFAULTDESCRIPTION
chartA / chartB*objectREQTwo charts; each needs birthDate (YYYY-MM-DD) and locationQuery OR latitude+longitude, plus optional birthTime (HH:MM), label and timezone. Omit birthTime when unknown: the chart is cast at noon and houses and angles are skipped.
houseSystemstringPHouse system used for overlay cusps.
orbDegreesnumber?planet-class orbsOptional flat orb override (0.5-6). Omit it to use the calibrated per-planet orbs the bands are built on. Composite internal aspects use a fixed 4-degree orb.

☉ RESPONSE

{
  "metadata": {
    "chartALabel": "Jordan",
    "chartBLabel": "Riley",
    "chartALocationLabel": "London, United Kingdom",
    "chartBLocationLabel": "Paris, France",
    "ephemerisMode": "SWIEPH",
    "creditsRemaining": 9,
    "houseSystem": "P",
    "orbModel": "planet_class",
    "chartATimeKnown": true,
    "chartBTimeKnown": true
  },
  "relationship": {
    "chartALabel": "Jordan",
    "chartBLabel": "Riley",
    "overall": {
      "percentile": 71,
      "band": "promising",
      "headline": "Stronger than most pairings for Marriage & romance; High friction is the growth edge.",
      "strongestDomainId": "marriage_romance",
      "growthEdgeDomainId": "friction_challenges",
      "confidence": "high",
      "confidenceReasons": [
        "Exact birth times and stable bands across ±30 minutes."
      ]
    },
    "domains": [
      {
        "id": "marriage_romance",
        "label": "Marriage & romance",
        "score": 8.75,
        "maxScore": 14,
        "percent": 63,
        "percentile": 84,
        "rawScore": 9.4,
        "band": "strong",
        "evidence": [
          {
            "kind": "synastry_aspect",
            "label": "Jordan Sun trine Riley Moon (orb 1.2°)",
            "points": 4,
            "detail": "Core identity meets emotional nature — the classic marriage signature."
          }
        ],
        "caveats": [],
        "timeStability": {
          "status": "stable",
          "bandsSeen": [
            "strong"
          ],
          "windowMinutes": 30,
          "percentileRange": [
            80,
            88
          ]
        }
      }
    ],
    "topAspects": [],
    "aspectCounts": {
      "supportive": 6,
      "challenging": 3,
      "charged": 2
    }
  },
  "charts": {
    "a": {
      "points": {}
    },
    "b": {
      "points": {}
    },
    "composite": {
      "points": {}
    }
  }
}

Bands come from percentile (the rank of rawScore against the calibration table), not from percent. relationship.overall carries the verdict and its confidence; timeStability flags a domain as time-sensitive only when shifting either birth time by up to 30 minutes both changes its band and moves its percentile by at least 25 points; smaller band-edge wobbles stay stable.

The friction_challenges domain is inverted: a high percentile means more friction and its band reads accordingly. Domains without qualifying contacts carry an explicit neutral caveat instead of implying a negative verdict; house-overlay evidence requires both exact birth times.

POST/api/v1/daily-elections

Scan all 72 intents across the next 24 hours from the user's browser-time moment and return the strongest window for each intent in one flattened, score-sorted list. Use now mode to score one exact election at browser time.

Auth model: Free: 3 runs per IP per week, no auth needed. Then 1 credit per run with a Bearer key or signed-in session; memberships with unlimited Daily Elections run free. Predictive overlays add +1 credit each, at most +3 credits per run, even for members, and need auth. secondChart (joint mode) costs 2 credits and needs auth; members run it free. Anonymous joint or overlay requests return 402 JOINT_DAILY_AUTH_REQUIRED or 402 PREDICTIVE_OVERLAY_AUTH_REQUIRED; an anonymous caller past the free runs gets 402 FREE_LIMIT_REACHED.

Advanced windowing: optional startTime and endTime narrow the actual scan window inside that rolling 24-hour range. They do not filter a full-range result set after the fact, and they cannot be combined with scanMode: "now".

☿ REQUEST BODY — JSON

FIELDTYPEDEFAULTDESCRIPTION
birthDate*stringREQBirth date YYYY-MM-DD.
birthTime*stringREQBirth time HH:MM (24h).
scanMode"day" | "now""day"Use day for the rolling 24-hour scan, or now to score exactly browserNowIso.
startTimestring?—Optional local scan start HH:MM, clipped to the rolling 24-hour range. Must be paired with endTime.
endTimestring?—Optional local scan end HH:MM, clipped to the rolling 24-hour range. Must be later than startTime.
locationQuerystring?—Birthplace search, e.g. "Paris, France".
latitudenumber?—Birth latitude (-90..90).
longitudenumber?—Birth longitude (-180..180).
timezonestring?—Birth timezone override for natal conversion.
browserNowIsostring?—Optional browser timestamp that anchors the rolling 24-hour scan.
browserTimezonestring?—Optional browser IANA timezone used to resolve scan labels and clock windows.
aspectsstring[]?All 13Optional transit aspects to calculate for the daily scan.
asteroidFinderbooleantrueFind asteroid discovery contacts at 1 degree conjunction/opposition only; curated ones add a small hard-capped Pass 7 contribution and never create a window.
fixedStarFinderbooleantrueFind fixed-star and galactic-point discovery contacts at 1 degree conjunction/opposition only; curated ones add a small hard-capped Pass 7 contribution and never create a window.
scoring.enabledPassesstring[]?All 7Optional pass ids to keep active in daily-election scoring.
scoring.enabledRulesstring[]?All rule groupsOptional scoring-rule ids to keep active in daily-election scoring.
scoring.aspectPotenciesobject?Production defaultsOptional per-aspect strength multipliers for daily-election scoring.
scoring.useNatalHouseFrameOnlyboolean?falseThe elected chart is the default frame. Set true to suppress temporary election Asc/MC and related election-frame evidence while retaining natal-house transit placement.
relocationQuerystring?—Optional current-location search text for relocated angles and houses.
relocationLatitudenumber?—Manual relocation latitude.
relocationLongitudenumber?—Manual relocation longitude.
secondChartobject?—Optional second chart (person or exactly-timed event; same fields as the electional secondChart) for joint "best for both" windows. Costs 2 credits (members free) and needs a Bearer key or signed-in session.
predictiveOverlayobject?—Optional paid predictive Vedic overlay selection; adds credits and needs a Bearer key or signed-in session.

✦ EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/daily-elections \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "birthDate": "1990-01-01",
    "birthTime": "12:00",
    "locationQuery": "London, UK",
    "scanMode": "day",
    "browserNowIso": "2026-10-01T07:15:00.000Z",
    "browserTimezone": "Europe/London",
    "startTime": "09:00",
    "endTime": "17:00",
    "scoring": {
      "useNatalHouseFrameOnly": false
    }
  }'

☉ RESPONSE

{
  "metadata": {
    "locationLabel": "London, United Kingdom",
    "latitude": 51.5074,
    "longitude": -0.1278,
    "timezone": "Europe/London",
    "timingTimezone": "Europe/London",
    "ephemerisMode": "SWIEPH",
    "warning": null,
    "relocationLabel": null,
    "relocationLatitude": null,
    "relocationLongitude": null,
    "scanStartDate": "2026-04-08",
    "scanEndDate": "2026-04-08",
    "scanStartIso": "2026-04-08T13:00:00.000Z",
    "scanEndIso": "2026-04-08T21:00:59.999Z",
    "scanMode": "day",
    "startTime": "09:00",
    "endTime": "17:00",
    "scanTimezone": "Europe/London",
    "intentCount": 72,
    "creditsRemaining": null,
    "isFreeUse": true,
    "freeUsage": { "used": 1, "limit": 3, "remaining": 2 }
  },
  "windows": [
    {
      "intentId": "career-advancement-promotion",
      "intentName": "Career Advancement and Promotion",
      "peakAtIso": "2026-04-08T15:20:00.000Z",
      "score": {
        "total": 18.24,
        "pass1Baseline": 3.6,
        "pass2HouseAlignment": 4.55,
        "pass3IntentFit": 4.12,
        "pass4NatalCompatibility": 3.97,
        "pass5Finalization": 2.0
      },
      "planetConditions": [
        {
          "point": "moon",
          "score": 3.1,
          "band": "commanding",
          "house": 11,
          "roles": ["moon"],
          "lineItems": [
            { "label": "EXALTATION", "points": 1.9, "detail": "moon is in exaltation in Taurus" },
            { "label": "HOUSE STRENGTH", "points": 1.2, "detail": "moon is placed in natal house 11" }
          ]
        }
      ],
      "moonVoidOfCourse": {
        "isVoid": true,
        "endsAtIso": "2026-04-08T18:45:00.000Z"
      },
      "integrityDiagnostics": {
        "nearestSyzygy": {
          "kind": "new",
          "exactAtIso": "2026-04-07T11:18:00.000Z",
          "relation": "previous",
          "distanceHours": 28.03,
          "withinFourDaysOfNewMoon": true
        },
        "nextMoonPerfection": { "status": "void", "signExitAtIso": "2026-04-08T18:45:00.000Z" }
      }
    }
  ],
  "scanDiagnostics": {
    "candidateAudit": { "candidatePeakCount": 8, "minimumVacantSpanHours": 3, "totalVacantSpanCount": 1, "truncatedCount": 0, "spans": [] },
    "maleficAngleAudit": { "status": "complete", "sampleCadenceMinutes": 30, "maxOrbDegrees": 5, "sampledMomentCount": 17, "failedSampleCount": 0, "totalUnrepresentedIntervalCount": 2, "truncatedCount": 0, "intervals": [] }
  }
}

Day-mode responses include the same observational integrity receipts as the full electional endpoint: per-window syzygy/next-Moon-perfection context and a shared candidate-gap plus malefic-angle scan audit. They do not affect window selection or ordering. Exact-now mode has no scan interval, so it returns only the per-window receipt.

POST/api/v1/aspect-interpretations/expand

Save an exact aspect interpretation blend for reuse across the app. The permanent key includes chart surface, relationship type, aspect domain, aspect, both points, roles, signs, houses, and dignity; orb and applying/separating state are excluded.

Credit model: 1 CREDIT when the exact blend does not already exist. Existing saved blends return with creditsCharged: 0.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/aspect-interpretations/expand \
  -H "Authorization: Bearer sk_tr_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "context": {
      "surface": "transits",
      "relationshipType": "natal_to_transit",
      "aspect": "square",
      "aspectDomain": "zodiac",
      "exactOrb": 0.42,
      "isApplying": true,
      "subject": {
        "point": "sun",
        "role": "transiting",
        "sign": "Leo",
        "house": 11
      },
      "object": {
        "point": "moon",
        "role": "natal",
        "sign": "Scorpio",
        "house": 3
      }
    }
  }'

RESPONSE

{
  "expansionKey": "expand|v1|transits|natal_to_transit|zodiac|transiting|sun|Leo|11|domicile|square|natal|moon|Scorpio|3|fall",
  "created": true,
  "creditsCharged": 1,
  "creditsRemaining": 6,
  "interpretation": {
    "title": "Sun square Moon",
    "summary": "Sun (Leo, H11) square Moon (Scorpio, H3): ...",
    "chartFlavor": "Leo injects expressive visibility into Sun... Sun is in domicile in Leo...",
    "practical": "..."
  }
}

POST/api/v1/ai-guidance

Generate grounded guidance from transit hits, election windows, solar-return dossiers, or Timeline reports. Z.ai GLM is primary; the Gemini Developer API is the automatic fallback.

Credit model: FLAT 3 CREDITS PER REQUEST. The route reserves credits before provider generation, saves successful guidance before returning it, and refunds credits if both providers fail or auto-save fails. Invalid requests, missing provider configuration, and insufficient-credit responses do not call a provider or consume credits.

Guidance is written from a fixed prompt for each domain, orientation and scope; metadata.promptTemplate names the one used. The accepted domain values are sourced from the request schema below; orientation is pragmatic or esoteric, and scope is single or many.

REQUEST BODY - JSON

FIELDTYPEDEFAULTDESCRIPTION
domain*"transits" | "election" | "solarReturn" | "timeline"REQChooses the transit, election, solar-return, or Timeline prompt family.
orientation*"pragmatic" | "esoteric"REQChooses practical action guidance or magical/ritual guidance.
scope*"single" | "many"REQChooses single-item or multi-item prompt structure.
itemobject—Required when scope is single. The request keeps the same flat cost.
itemsobject[]—Required when scope is many. Direct prompt input is compacted and capped at 96 items; the request keeps the same flat cost.
contextobject?—Optional non-item metadata such as natal data, intent, scan metadata, or user settings.
questionstring?—Optional user-specific question to steer the guidance.
modelstring?—Optional provider-family model override. glm-* applies to Z.ai generation; gemini-* applies if Gemini fallback is used. It does not force provider selection.
temperaturenumber0.4Provider sampling temperature from 0 to 2.

EXAMPLE REQUEST

# Idempotency-Key: one new UUID per request; reuse the same key when retrying it.
curl -X POST https://electional.io/api/v1/ai-guidance \
  -H "Authorization: Bearer sk_tr_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: <uuid>" \
  -d '{
    "domain": "election",
    "orientation": "esoteric",
    "scope": "many",
    "items": [
      {
        "peakAtIso": "2026-10-01T10:00:00.000Z",
        "score": {
          "total": 18.4
        }
      },
      {
        "peakAtIso": "2026-10-02T12:00:00.000Z",
        "score": {
          "total": 16.9
        }
      }
    ],
    "context": {
      "intent": {
        "name": "Networking"
      }
    },
    "question": "Which window is best for a consecration?"
  }'

RESPONSE

{
  "guidance": "Use the first window for the core rite...",
  "metadata": {
    "domain": "election",
    "orientation": "esoteric",
    "scope": "many",
    "itemCount": 2,
    "creditsCharged": 3,
    "creditsRemaining": 7,
    "model": "glm-5.2",
    "provider": "zai",
    "promptTemplate": "election-esoteric-many.md"
  }
}

⚷ MCP SERVER

A local stdio MCP server for Claude Desktop, Claude Code and other local MCP clients. It exposes every public POST /api/v1 route as a tool against the same live REST API, plus get_report_job for long report jobs.

✦ SETUP

MCP access is in private beta. The server runs locally and is not yet a public package, so email sales@electional.io for the package. The REST API is the supported path today.

# claude_desktop_config.json:
{
  "mcpServers": {
    "electional": {
      "command": "npx",
      "args": [
        "tsx",
        "/ABSOLUTE/PATH/TO/electional-mcp/src/mcp/index.ts"
      ],
      "env": {
        "TRANSITS_API_URL": "https://electional.io",
        "TRANSITS_API_KEY": "sk_tr_your_key_here"
      }
    }
  }
}

INSTALL

  1. 1. Email sales@electional.io for the MCP package (private beta), then run npm install in its folder.
  2. 2. Download the Claude Desktop template above and open your local MCP config file.
  3. 3. Replace /ABSOLUTE/PATH/TO/electional-mcp/src/mcp/index.ts with the full absolute path to the package's src/mcp/index.ts.
  4. 4. Keep TRANSITS_API_URL as https://electional.io and set TRANSITS_API_KEY to a live API key from /api-keys.
  5. 5. Save the config and fully restart Claude Desktop so the MCP server is reloaded.

Important: desktop MCP clients generally need an absolute file path here. A relative path like src/mcp/index.ts is not reliable outside the package folder.

WHAT YOU GET

The MCP server currently exposes generate_ai_guidance, expand_aspect_interpretation, calculate_daily_elections, calculate_electional_spellcasting, calculate_eclipse_hits, match_goal_to_intents, calculate_month_forecast_teaser, calculate_month_forecast, generate_personality_interpretations, generate_placement_interpretation, calculate_personalized_retrograde_hits, calculate_solar_return, calculate_solar_return_location_election, calculate_synastry_compatibility, calculate_timeline_teaser, calculate_timeline_full_report, generate_transit_interpretations, calculate_transits, calculate_vedic_chart_teaser, calculate_vedic_chart, calculate_vedic_chart_predictions, calculate_natal_reading_teaser, calculate_natal_reading, calculate_proof_synthesis, generate_window_synthesis, get_report_job. All tools call the same live REST API documented on this page. Credit costs match direct API calls; calculate_timeline_full_report uses /api/v1/timeline/full and follows its 3 credits successful-report charge, calculate_month_forecast uses /api/v1/month/full and follows its 3 credits successful-report charge, calculate_vedic_chart uses /api/v1/vedic-chart/full and follows its 3 credits successful-report charge, and calculate_natal_reading uses /api/v1/natal-reading/full and follows its 3 credits successful-report charge (calculate_natal_reading_teaser stays free).

☿ ELECTIONAL — GRIMOIRE REV 4.2