AstroWay/api v2.325.2 · vi
tất cả hệ thống hoạt động bình thường

// product · release notes

Changelog what is new

Only changes that affect integrator code: new endpoints, SDK releases, /openapi.json schema changes, credit price changes, deprecations, breaking changes. Newest first.

Latest · v2.325.2 Endpoints · 865 CI tests · 888 API contract · v1 stable · 12-mo deprecation

2026-07-10 · POST /v1/aspects, standalone aspects endpoint

New endpoint for computing just the aspect matrix - without the full /chart payload (planets / houses / midpoints / etc). Tier 1: 10 credits per call.

Terminal window
curl -X POST https://api.astroway.info/v1/aspects \
-H "X-Api-Key: aw_live_..." \
-H "Content-Type: application/json" \
-d '{"date":"1926-06-01","time":"09:30:00","timezoneOffset":-8,"latitude":34.05,"longitude":-118.24}'

Returns count + aspects[] where each aspect carries planet1 / planet2 / type (object with name, angle, orb, symbol, isMajor, i18nKey, color) / exactAngle / orb / isApplying.

Per-pair orb matrix follows astro.com convention (MIN rule across the two planets). Same calcAspects() as /chart - numbers identical to the /chart.aspects subtree.

2026-07-03 · POST /v1/houses, standalone houses endpoint

New endpoint for computing just the house cusps - without the full /chart payload (planets / aspects / midpoints / etc). Tier 1: 10 credits per call.

Terminal window
curl -X POST https://api.astroway.info/v1/houses \
-H "X-Api-Key: aw_live_..." \
-H "Content-Type: application/json" \
-d '{"date":"1990-05-15","time":"14:30:00","timezoneOffset":3,"latitude":50.45,"longitude":30.52,"houseSystem":"P"}'

Returns houses.cusps (12 longitudes) + ascendant + mc + armc + vertex + equatorialAsc + optional coAscWK / coAscMunkasey / polarAsc + warning if the requested quadrant system falls back at extreme latitude (the cusps are silently substituted as Porphyry when |lat| > 66.5°).

houseSystem support: P (Placidus, default) / K (Koch) / R (Regiomontanus) / C (Campanus) / T (Topocentric) / M (Morinus) / W (Whole Sign) / E (Equal) / O (Porphyry) - plus the rest of the standard one-letter codes.

Previously callers needed to use POST /v1/chart (heavier payload) just to read cusps. This adds a lighter alternative for callers who want only houses without the full chart computed weight.

2026-06-26 · Onboarding wizard: AI endpoint discovery + sandbox first call

POST /v1/me/recommend-endpoints takes a free-text use-case description and returns the top-5 endpoints with curl/JS/Python code examples.

Terminal window
curl -X POST https://api.astroway.info/v1/me/recommend-endpoints \
-H "Authorization: Bearer <jwt>" \
-H "Content-Type: application/json" \
-d '{"description":"Dating app with compatibility scores"}'
# {
# "detected_use_case": "relationship-compatibility",
# "recommendations": [
# { "endpoint": "/v1/synastry", "title": "Couple synastry",
# "why": "Returns aspects between two charts", "credits_per_call": 50, ... },
# ...
# ]
# }

Powered by the LLM gateway. The use-case → endpoints routing lives as a prompt in ai.astroway.info - updated without redeploying the API.

Dashboard integration. Step 3 of the /dashboard/onboarding wizard triggers this endpoint. The same endpoint is available standalone as /dashboard/discover for existing users.

2026-06-23 · Content Localization API: /v1/translate/*

Astro-aware machine translation across 20 languages. Four endpoints:

  • POST /v1/translate/astro: single text (up to 3000 chars)
  • POST /v1/translate/batch: up to 25 strings sharing one target language
  • GET /v1/translate/languages: supported language list (free)
  • GET /v1/translate/glossary/{lang}: domain glossary download (free)

A domain glossary keeps specialist terms (Dasha, Nakshatra, Ascendant, …) intact rather than translating them literally. Numeric fields untouched. Source defaults to English; pass source_lang to override.

Credits: 15 + ⌈chars/40⌉ per call (batch = summed chars). Charged against your existing plan credits. Limits: astro ≤3000 chars; batch ≤25 items, ≤2000 chars/item, ≤20000 total.

2026-06-19 · POST /v1/moon-phase, current Moon phase at a moment

New endpoint: current Moon phase for an arbitrary date/time/location. Tier 1: 10 credits per call.

Terminal window
curl -X POST https://api.astroway.info/v1/moon-phase \
-H "X-Api-Key: aw_live_..." \
-H "Content-Type: application/json" \
-d '{"date":"2024-01-25","time":"12:00:00","latitude":0,"longitude":0,"timezoneOffset":0}'

Returns phase (0..1), phaseName (New Moon / Waxing Crescent / First Quarter / Waxing Gibbous / Full Moon / Waning Gibbous / Last Quarter / Waning Crescent), majorPhase (new_moon / quarter / full_moon / between), illuminationPercent, elongationDeg, ageDays (synodic age 0..29.53), waxing, moonSign, sunSign, moonLongitude, sunLongitude.

Geocentric Sun-Moon elongation per Meeus Ch.48 - algorithmically equivalent to RapidAPI Astrologer /moon-phase/context. The previous workaround POST /v1/render/moon-phase with format: json is still supported but returns the same calculation alongside an SVG payload; the new /moon-phase returns the math only (lighter, cheaper on the wire).

2026-06-17 · Fixed response schemas (/openapi.json) + nullable fields

A full schema audit found ~19 endpoints whose published 200 response schema did not match the real output - for example, /chart aspects[].type was described as a string but is returned as an object; likewise ACG coordinates, Human Design fields (/human-design, /hd/*), Vedic (/vedic-divisional, /vedic/lal-kitab/*), /almuten, /sabian-symbols, /midpoint-trees, and others. As a result, MCP clients rejected these tool calls with -32602 Output validation error, and strictly-typed SDKs could fail when parsing. All schemas now match the real output.

In addition, fields in the generated output schemas are now marked nullable. Real responses return null for conditional fields, which strict validation previously rejected - null is now accepted correctly.

Calculations did not change - only the schema descriptions were corrected. If you generated types from the old /openapi.json, regenerate them. MCP users (@astroway/mcp and hosted) get the fixes automatically.

2026-06-15 · Streaming and webhook credit cost

Clarified pricing for stream and webhook endpoints. /stream/* (10 endpoints) are priced as Tier 1: 10 credits per call (there’s no separate “cheaper” per-tick rate). /webhooks/* CRUD operations are Tier 1 too; the event delivery to your URL itself is not billed.

What to do: if you poll a stream endpoint in a loop, budget it as 10 credits × frequency, and use the tickSeconds / nextEventAt response fields so you don’t poll more often than the state changes. Details - Credits and limits.

2026-06-13 · API responses in 20 languages via Accept-Language

Every endpoint that returns text content now honours the Accept-Language header. Example: Accept-Language: hi on /v1/horoscope/daily returns the horoscope in Hindi; Accept-Language: de on /v1/interpret/planet-in-sign returns the interpretation in German.

Supported languages: uk · en · de · pl · es · pt · hi · fr · ko · it · ja · id · tr · nl · cs · ro · vi · ar · el · hu (20).

  • Alternative: ?lang=xx query param for clients that can’t set headers
  • Default: source language uk if no header sent or the language isn’t on the list
  • Numeric fields (longitude, latitude, speed, sign-id, house-id) are untouched - clients format locally
  • Specialist terms (Raj Yoga, Sade Sati, etc.) preserved in original form via the glossary

Documentation: the /languages page plus per-endpoint OpenAPI specifications.

SDK support (TS / Python / PHP) and the MCP server land in their next releases - see each package’s roadmap.

2026-06-11 · Free tier capped at Tier 1-3 (heavy endpoints → Indie+)

The Free plan now covers only Tier 1-3 endpoints (up to 50 credits). Any Tier 4+ endpoint on Free returns 402 PLAN_UPGRADE_REQUIRED with upgrade_to: 'indie'. Affected: heavy multi-day scans (transit-calendar, forecast-calendar, eclipses, ingresses, planetary-cycles, solar-acg, phase-return, aspect-timeline, etc.), rectification (rectification, rectification/trutine), multi-person HD (hd/penta, hd/group-overlay, human-design/compatibility), all PDF reports (reports/*), and AI narratives (reports/ai/*).

AI interpretation stays free: interpret/* and horoscope/yearly remain available on Free.

What to do: if your Free key calls a Tier 4+ endpoint, upgrade to Indie ($5/mo, 50K credits) at astroway.info/pricing, or check the public cost table at /credits/ (each row carries a Free-availability marker).

2026-06-09 · /iching deprecated → /iching/* namespace

The bare POST /v1/iching (legacy random hexagram throw) is deprecated. All I Ching work lives in the /v1/iching/* namespace: throw-coins (with seed), by-question, with-changing-lines, daily, lookup/{n} - on the Wilhelm-Baynes set. The old endpoint works until 2027-06-16 (sunset) and returns Deprecation / Sunset / Link: rel="successor-version".

What to do: instead of POST /v1/iching, use POST /v1/iching/throw-coins (supports a seed for reproducibility) or another /iching/* endpoint.

2026-06-08 · /vedic-divisional deprecated → /vedic/varga/{D1..D60}

The generic POST /v1/vedic-divisional (where the varga was passed in the body) is deprecated in favour of dedicated POST /v1/vedic/varga/{D1..D60} endpoints - a cleaner OpenAPI/SDK signature and richer output (varga name, lagna, ayanamsa). The old endpoint keeps working fully until 2027-06-15 (sunset, within the /v1 ≥12-month stability guarantee) and returns Deprecation: true, Sunset: Tue, 15 Jun 2027 00:00:00 GMT, Link: …; rel="successor-version" headers. It will be removed after that date.

What to do: move POST /v1/vedic-divisional calls with body { "varga": "D9", … } to POST /v1/vedic/varga/D9 (varga in the path, the rest of the body unchanged).

2026-06-06 · Public no-auth read endpoints (light widgets)

A set of GET /v1/public/* endpoints that work without an API key (IP-rate-limited 30/hr, every response carries the _footer watermark). Handy for copy-paste cURL in the docs and lightweight integrations without signup:

  • GET /v1/public/horoscope/daily?sign=aries&date=YYYY-MM-DD: sun-sign daily horoscope
  • GET /v1/public/horoscope/weekly?sign=…: weekly
  • GET /v1/public/horoscope/monthly?sign=…: monthly
  • GET /v1/public/tarot/daily?date=…: card of the day (RWS, deterministic per day)
  • GET /v1/public/moon-phase?date=…: moon phase (deterministic compute)
  • GET /v1/public/planet-of-day?date=…: traditional planetary ruler of the weekday

All 12 zodiac signs; date optional (defaults to today); invalid sign/date → 400. Horoscopes are AI-generated and cached per (sign, period, language); weekly/monthly anchor to Monday / the 1st. The rest are deterministic. Language via Accept-Language.

2026-06-05 · Self-service webhooks: /v1/me/webhooks CRUD + HMAC delivery worker

A subscriptions endpoint family for outgoing webhooks. Previously the webhook table (migration 017) existed only admin-side - now we open CRUD to users via the dashboard /webhooks page.

Terminal window
# Create
curl -X POST https://api.astroway.info/v1/me/webhooks \
-H "Authorization: Bearer <jwt>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://myapp.com/astroway-webhook",
"events": ["credits.threshold_crossed", "key.revoked", "request.failed"]
}'
# List
curl -H "Authorization: Bearer <jwt>" https://api.astroway.info/v1/me/webhooks
# Test ping (send sample event)
curl -X POST https://api.astroway.info/v1/me/webhooks/<id>/test \
-H "Authorization: Bearer <jwt>"

7 event types: credits.threshold_crossed, key.revoked, key.created, request.failed (5xx), billing.invoice_paid, billing.invoice_failed, plan.changed.

HMAC signature. Every delivery carries X-AstroWay-Signature: t=<unix>,v1=<hex> where v1 is HMAC-SHA256(secret, "t=<unix>.<body>"). The secret is issued once at create time and can be rotated (POST /me/webhooks/<id>/rotate-secret).

Delivery worker. A background process (the new astroway-webhook-worker in PM2) pulls the queue and applies exponential backoff on client 5xx responses: 1m / 5m / 30m / 2h / 12h. After 5 failures the webhook auto-suspends with an email alert.

Dashboard page. /dashboard/webhooks with list + create modal + test button + delivery history. Sidebar nav entry in the Account section.

2026-06-03 · GET /v1/reports/history: list your recent report exports

New endpoint returns your most recently generated PDF reports - type, size, page count, language, created/expiry timestamps, and a url. Use it to re-fetch a report link within its 24-hour validity window, or to surface recent exports in a dashboard. Free to call. ?limit= (1–50, default 10).

2026-06-02 · Cache MISS/HIT instrumentation: X-Cache response header

The server now logs the cache outcome of every request (X-Cache: MISS | HIT | BYPASS). This enables the cache-hit-% column in /dashboard/usage (currently showing –).

Terminal window
curl -I -X POST https://api.astroway.info/v1/chart \
-H "X-Api-Key: aw_live_..." \
-H "Content-Type: application/json" \
-d '{...}' | grep -i x-cache
# X-Cache: MISS

Tracking. api_request_log.cache_status column (migration 030, enum). GET /v1/me/usage/endpoints starts returning a real cache_hit_pct instead of null.

Pricing impact. Cached requests still deduct credits at the rendered tier - but surfacing the metric in the dashboard helps optimise the integration (on a cache HIT you can, for example, avoid re-sending a heavy chart payload).

2026-06-01 · GET /v1/version + Swagger/OpenAPI aliases + /v1/v1/* typo redirect

Convenience shims for SDKs and one-off integrators - no more “why does this routine request return 404” surprises.

New GET /v1/version: free, no auth. Returns the current API version + commit + uptime:

Terminal window
curl https://api.astroway.info/v1/version
# {
# "version": "2.71.0",
# "build_commit": "abc1234",
# "started_at": "2026-06-02T08:00:00Z",
# "uptime_seconds": 12345,
# "docs_url": "https://api.astroway.info/docs/api/"
# }

SDKs can call this on boot to diagnose “why is the behaviour suddenly different” - build_commit uniquely identifies the deploy.

OpenAPI aliases (301): so Postman / Insomnia / openapi-generator find the spec on the first try:

AliasWhere
/v1/swagger.json/v1/openapi.json
/v1/api-docs/swagger.json/v1/openapi.json
/v1/v3/api-docs/v1/openapi.json
/v1/v2/api-docs/v1/openapi.json
/v1/swagger/v1/swagger.json/v1/openapi.json
/v1/swagger, /v1/swagger-ui*/v1/docs (302)

/v1/v1/<endpoint> → /v1/<endpoint> (308): fixes the typical SDK bug where baseUrl already contains /v1 and the call adds /v1/X on top. Method and body are preserved; nothing breaks silently.

/api/health → /v1/health (301), other /api/<endpoint> → JSON 404 with code WRONG_PREFIX: for devs with wp-json muscle memory. Previously a generic nginx 404; now the response clearly points to the correct prefix.

Docs: new page URL conventions and free endpoints - full list of free system endpoints (/health, /health/deep, /version, /openapi.json, /docs, /reference/*, /i18n/*), free account-gated endpoints (/auth/*, /me, /keys, /admin/*, /embed/*, /books/*, /messages, /dev-assistant), and paid tier breakdown.

2026-05-30 · Embed widgets: optional ?disclaimer=1 parameter

Public embed widgets (GET /v1/embed/*) now accept an optional disclaimer=1 - it adds a short footer note that the content is for entertainment and informational purposes only (not medical, psychological, financial, or legal advice). Off by default - without the parameter the footer is unchanged. Turn it on if your compliance requires a visible disclaimer at the display side.

<iframe src="https://api.astroway.info/v1/embed/wheel?date=1990-05-15&theme=dark&disclaimer=1"
width="460" height="560" style="border:0"></iframe>

2026-05-29 · Four new embed widgets (key-free, iframe-ready)

The public HTML widget set GET /v1/embed/* grows to 14. The new ones need no API key, return a ready iframe fragment, and are IP-rate-limited (30 requests/hour).

  • GET /v1/embed/transit?date=: transiting planet positions (sign + degree, retrograde flag) for a date.
  • GET /v1/embed/numerology?name=&date=&system=: Life Path / Expression / Soul Urge / Personality numbers (system: pythagorean or chaldean).
  • GET /v1/embed/panchang?date=&lat=&lng=&tz=: tithi / nakshatra / yoga / karana / vara + sunrise/sunset + Rahu Kaal.
  • GET /v1/embed/synastry?date_a=&time_a=&lat_a=&lng_a=&tz_a=&date_b=…: compatibility score + key cross-aspects for two subjects.
<iframe src="https://api.astroway.info/v1/embed/transit?date=2026-05-29&theme=dark"
width="460" height="420" style="border:0"></iframe>

All widgets accept theme (dark/light/console) and lang. Cached public, max-age=300.

2026-05-28 · Error codes documentation corrected

The errors reference now matches what the API actually returns. Error codes are UPPER_SNAKE_CASE (e.g. INVALID_INPUT, INVALID_API_KEY, CREDITS_EXHAUSTED), the envelope is { ok: false, error: { code, message, details? } }, and validation failures (INVALID_INPUT, HTTP 400) carry details: [{ path, message }]. If you wrote switch (error.code) against the previously-documented lowercase names, update them to the real codes. The API responses themselves are unchanged.

2026-05-26 · New endpoint POST /v1/reports/generate, V2 unified dispatcher

Instead of 12 type-specific routes (/reports/natal, /reports/synastry, …), one endpoint with a report_type enum dispatcher routing to the matching renderer. SDK consumers get one method instead of twelve; the MCP tool catalogue gets one tool instead of twelve.

Terminal window
curl -X POST https://api.astroway.info/v1/reports/generate \
-H "X-Api-Key: aw_live_..." \
-H "Content-Type: application/json" \
-d '{
"report_type": "natal",
"chart": {"date":"1990-05-15","time":"14:30:00","timezoneOffset":3,"latitude":50.45,"longitude":30.52,"name":"Test"},
"language": "en",
"whitelabel": { "themeColor": "#ff5500", "reportName": "My Cosmic Map" }
}'

12 supported report_type values: natal, transit-yearly, synastry, business, career, love, money, child, lal-kitab, human-design, tarot, vedic-kundli.

Per-type required fields validated in the handler: natal/business/career/etc - chart; synastry - chart1 + chart2; tarot - seed (optional). Missing required fields → 400 with MISSING_CHART / MISSING_CHARTS error code.

Backwards compatible. All 12 type-specific endpoints remain - /v1/reports/generate is an additive surface, not a replacement. You can use either direct (client.reports.natal({...})) or generic (client.reports.generate({ report_type: 'natal', ... })).

Pricing. Forwarded per-renderer (natal → TIER_7, transit-yearly → TIER_8, tarot → TIER_4, etc). The dispatcher itself adds no extra cost.

OpenAPI 3.1. GenerateReport is a standalone component in /v1/openapi.json. SDK regen in the next release adds client.reports.generate().