Every change that affects integrator code: new endpoints, SDK updates, /openapi.json schema changes, credit-price revisions, deprecations, breaking changes. Most recent at the top. Internal site work is not listed here.
The API contract is stable inside /v1/* - any breaking change ships under /v2/*, and /v1/* keeps working for at least 12 months.
2026-11-08 · The white-label logo reaches the report, new config fields
Fixed. A logo uploaded through POST /v1/whitelabel/logo never reached reports sent with whitelabel: true, and a file over about 73 KB got 413 although the limit is 512 KB. Both work now.
New fields. PATCH /v1/whitelabel/config takes companyName, companyUrl, companyEmail, companyMobile, companyBio and reportName (null clears a field), and the response returns them and logo_url. The same can be set on the Report branding page of the dashboard, with a preview.
What to do with your code. Nothing if you send branding as an object on every call. If you uploaded a logo and did not see it in the PDF, it is there now.
2026-11-07 · Numerology: a name with no Latin letters is now a 400
Change. The letter tables are Latin, so a name written only in Cyrillic or another non-Latin script gave zeros for expression, soulUrge, personality, maturity and balance, in a response that looked normal. These endpoints and /numerology/{system}/chart now answer 400 NAME_NOT_LATIN, and the /embed/numerology widget shows a hint. Date-only calculations (life-path, birthday, challenge, pinnacles, personal-year) are unchanged.
What to do with your code. Send the name in Latin script, as in a passport. We do not transliterate for you: the same Cyrillic name is Maksym in Ukrainian and Maksim in Russian, and the numbers differ.
2026-11-07 · Webhook URL: public host and default port only
Behaviour change. POST /v1/webhooks/subscribe, POST /v1/me/webhooks and PATCH /v1/me/webhooks/{id} accept a url only with the http or https scheme, no user name or password in it, no explicit port other than 80 and 443, and a host that is not a private, local or reserved IP address. Anything else is a 400. Delivery checks the address again when it connects and does not follow a redirect: a 3xx answer counts as a failed delivery. When no connection was made for any reason (address not public, DNS, timeout, refused), POST /v1/webhooks/{id}/test returns status_code: null and error: "delivery failed"; when your server answered, status_code is the same as before.
What to do with your code. Nothing, if the webhook goes to an ordinary public address on 443 or 80 with no redirect. If your receiver listens on another port or answers with a redirect, give the final address on a default port. If you parsed the error text from /test, rely on delivered and status_code instead.
2026-11-07 · Sub-periods of the first mahadasha run from its full start
Fix. The antardashas (and every deeper level) of the mahadasha running at birth split only its remaining balance, so all nine were compressed into it. They now split the full period from its notional start before birth (BPHS 46): the ones that ended before birth are left out, the running one starts at birth, the rest have their full classical length. The same holds at pratyantar, sookshma and prana level. Affected: /v1/vedic/dashas/{vimshottari,yogini,ashtottari,tribhagi,shatabdika,shodashottari}/{antar,pratyantar,sookshma,prana} and dasha.antar in /v1/vedic/kundli, only when targetDate falls in the first mahadasha. Other mahadashas, Kalachakra, Chara, Sthira and Shoola are unchanged.
What to do with your code. If you stored sub-periods of the first mahadasha, recompute them. Such a list can now hold fewer than nine entries, and its first entry starts at birth; check code that expects exactly nine.
2026-11-07 · The djwhal-khul ayanamsa was computed as True Revati
Fix. The name "ayanamsa": "djwhal-khul" mapped to mode 28 (True Revati) instead of 6 (Djwhal Khul), so sidereal positions requested with it were about 8° off. It is mode 6 now. A numeric ayanamsaId was always right and is unchanged.
What to do with your code. If you sent djwhal-khul and stored the results, recompute them. If you really want True Revati, send "ayanamsaId": 28.
2026-11-07 · A sign compatibility widget
New endpoint. GET /v1/embed/sign-compatibility?sign_a=aries&sign_b=leo shows a pair of signs: the classical relation after Ptolemy (trine, sextile, square, opposition or aversion), whether the pair is harmonious, the elements, modalities and polarity, in 21 languages. No key, the same limit as the other widgets. There is no compatibility percentage: a pair of signs without charts has nothing to weigh.
What to do with your code. Nothing. The snippet is in the gallery on the widgets page; in the loader it is data-widget="sign-compatibility" data-sign_a="aries" data-sign_b="leo".
2026-11-07 · Location search: a place name to coordinates and a time zone
New endpoints. GET /v1/geo/search?q= returns places with coordinates, IANA time zone, region, country and population: by the beginning of the name, ignoring case and accents, with the GeoNames names in our 21 languages and older forms such as Kiev. An ambiguous name lists every town largest first; text after a comma narrows by region or country (Springfield, Illinois). GET /v1/geo/reverse?lat=&lon= gives the nearest place and the zone of the point itself, the nautical hour band at sea. GET /v1/geo/timezone?lat=&lon=&date= gives the zone and the UTC offset in force on that date. 5 credits each. GET /v1/public/geo/search is the same search without a key, within the public limit.
What to do with your code. Nothing, if you already have coordinates. If your form only asks for a birthplace, call /v1/geo/search and pass latitude, longitude and timezone from the result into the chart. The data is from GeoNames under CC BY 4.0: showing the names to your users carries the same credit, which comes in the response body. About 172,000 places of 1000 people or more are covered; a smaller village is absent. Details on the Location search page.
2026-11-06 · Best cities for an area of life
POST /v1/acg/best-places ranks real cities against the astrocartography lines of a chart for one of nineteen categories. 34,028 places from GeoNames. GET /v1/acg/countries says which countries are in the set at all and how many cities each has.
What to do with your code. Nothing, unless you built city shortlisting yourself. If you built it on /v1/acg-zones by looping over your own coordinate list, this is one call now, and the distance to a line is computed exactly rather than against a polyline.
Three things worth reading before you integrate. Attribution is mandatory: the city data is CC BY 4.0, and displaying it to your users carries the same credit, which is why it ships in the response body. This is not geocoding: the list is fixed and starts at 15,000 people, so a smaller town is absent rather than ranked poorly. Results are thinned to 300 km apart by default, because a line is a curve and without it the top of the list is one densely settled stretch; minSeparationKm: 0 turns it off.
2026-11-06 · SVG that your page can recolour
/v1/render/* accepts options.theme: "css": every colour in the SVG becomes a CSS variable with today’s colour as the fallback, for example var(--aw-ring, #222). Inline the SVG and set --aw-ring, --aw-fg, --aw-chart-bg and the rest (full list in the option description), and the wheel takes your site’s colours. With no variables it looks exactly like light. A page CSS rule wins over the variable.
In the same mode the Western wheels and the aspect grid carry stable classes and data attributes: aw-asc, aw-mc, aw-planet-sun, aw-aspect-trine and so on; each planet is a group with data-planet and data-label, each aspect line has data-a and data-b. Style the ascendant or highlight a planet’s aspects on hover without parsing coordinates. Class names are only ever added, never renamed.
/v1/render/bi-wheel also takes options.crossAspects: true: the aspects between the two charts, the same set POST /v1/synastry returns as crossAspects, drawn as dashed lines between the inner and the outer planets. Off by default, so existing images do not change.
The Western wheels (wheel-western, bi-wheel, tri-wheel, composite) take options.labels: your own words for the ASC, DSC, MC and IC labels, the <title> and <desc> screen readers announce, and the planet and sign names in each planet’s data-label. Absent keys stay in English.
wheel-western, aspect-grid and bi-wheel also accept the data of a POST /v1/chart response as chart in place of birth data, and then only draw it, for 1 credit instead of 10. The image is the same byte for byte.
What to do with your code. Nothing if our themes suit you. If the SVG is inlined into HTML and should match the site, pass theme: "css". Inside an <img> variables do not apply, so it stays light.
2026-11-05 · BaZi: new interaction type threeMeeting
New value. /v1/bazi/interactions, /v1/bazi/chart, /v1/bazi/yearly and /v1/bazi/monthly now return type: "threeMeeting" (code: "three_meeting", 三會) when the chart, or the chart with the year or month, holds the three branches of one season: 寅卯辰, 巳午未, 申酉戌, 亥子丑. The strength verdict and favourable elements do not change.
What to do with your code. If you have an exhaustive switch on type, add this case. Nothing otherwise.
2026-11-05 · Chinese sign: the reading of the day
New endpoint. GET /v1/public/chinese/zodiac/daily-reading?animal=&date=&lang= returns what /public/chinese/zodiac/daily does plus reading: overview, love, career and advice in the requested language. The text rests only on the facts of the day in the answer (day and year pillars, branch relations, Ben Ming Nian, energy and its factors), no lucky numbers or colours. Generated once per animal, date and language and cached for the day, so every site sees the same text. No key needed.
What to do with your code. Nothing. If you wrote the text of the day yourself, you can take reading.
2026-11-05 · Every endpoint now shows a real response
Response examples in /openapi.json were written by hand with { ... }
shorthand. That is not valid JSON, so 495 of 744 operations published no
example at all, /v1/chart among them, and the schema recovered only the
fields that appeared before the elision.
An example is now a capture of a real response. Arrays are capped at one element
so the example names every field without carrying a 37 KB body: /v1/chart is
1.9 KB against 37 KB whole. The element kept is the most populated one.
| before | after | |
|---|---|---|
| operations with a response example | 249 | 740 |
| operations with none | 495 | 4 |
| schema nodes naming no field | 326 | 2 |
Four are left out on purpose: /v1/rectification runs up to 120 seconds,
/v1/translate/batch is metered per character, and two MCP routes call a
language model. Fourteen /v1/embed/* answer text/html and have no JSON body
to describe.
What to do with your code. If you generate types from /openapi.json,
regenerate: fields that used to come through as an empty object are named now.
The responses themselves did not change, except /v1/hd/hologenetic, whose Gene
Keys descriptions carried an em-dash and now carry a hyphen.
Two published request examples were corrected in passing:
POST /v1/primary-directions showed "key": "placidus" where key is an arc
rate in degrees per year, so that request had never returned anything but 400.
2026-11-04 · Panchang: when each anga ends, moonrise and moonset
New fields. In POST /v1/vedic/panchang/full the tithi, karana, yoga and nakshatra carry endsAt, the moment they end in local time with the offset (2026-10-08T19:46:30+03:00); an anga that runs past midnight gives the next date. Also sunNakshatra, and moonrise and moonset, the first after sunrise, as a printed panchang counts them: the disc centre on the horizon, no refraction. Almanacs such as USNO take the upper limb with refraction, so their moonrise comes about five minutes earlier. Where the Moon does not rise or set within 30 hours the field is null.
What to do with your code. Nothing. To show “until 19:46”, read endsAt instead of searching for it yourself.
2026-11-03 · Widgets: their own limit, tarot in the page’s language
The /v1/embed/* widgets now have a limit of their own, 120 requests an hour per visitor IP, separate from /v1/public/*. Before, a page with four widgets showed the limit card after seven views an hour. The limit card now wears the widget’s theme (?theme=light), and /v1/embed/daily-tarot prints the reading and keywords in the lang language for all 78 cards, not only the majors.
What to do with your code. Nothing. If you hid widgets because of the limit, look at the page again.
2026-11-02 · Chinese sign of the day
New endpoint. GET /v1/public/chinese/zodiac/daily?animal=horse&date= without a key: the day and year pillars, how their branches stand to the animal (same, secretFriend, trine, clash, harm, neutral), benMingNian and energy from 1 to 10 with its factors listed. Computed, no model; animal and element names follow ?lang=.
What to do with your code. Nothing, unless you want it.
2026-11-01 · Chinese sign: characters, pinyin, hours and branch relations
New fields. POST /v1/chinese/zodiac/animal and POST /v1/public/chinese/zodiac/animal return animalHanzi (simplified), animalHanziTraditional, animalPinyin with tone marks, the same for the stem and branch, hours (the double hour of the branch in local clock time, Rat 23:00-01:00), trine (三合), secretFriend (六合), clash (六冲) and harm (六害), with localised animal names.
What to do with your code. Nothing. If you kept your own table of characters or animal relations, you can drop it.
2026-10-31 · Chinese sign with no key
POST /v1/public/chinese/zodiac/animal answers what POST /v1/chinese/zodiac/animal answers: the animal, stem, branch and element of the birth year, with no API key. The year turns at Li Chun (around 4 February), so pass time and timezoneOffset for a birth near that boundary. One call costs 1 unit of the public limit.
What to do with your code. Nothing if you call with a key. If a page needs the sign without one, use the public route together with GET /v1/public/chinese/zodiac/texts.
2026-10-30 · Star-planet parans, and a paran is a latitude
POST /v1/parans/star returns the latitudes at which a fixed star and a planet are angular at the same moment. Latitudes, not points: whether a paran can happen at all depends on latitude alone, and that is how Bernadette Brady tabulates it. 953 stars are available, 36 in the default set, against 47 at the nearest competitor. GET /v1/fixed-stars/catalog ships alongside it and lists the star names the API accepts.
What to do with your code. Nothing, if you use the existing POST /v1/parans: it is unchanged and still returns planet-to-planet line crossings with coordinates. The new route answers a different question and has a different response shape.
Note the horizon parameter. geometric (default) is altitude 0; apparent is minus 34 arcmin, where refraction lifts a body into view first. The two differ by about two degrees of paran latitude, so if you are reconciling against someone else’s tables, find out which horizon they used first.
2026-10-29 · Incarnation cross names corrected
Fix. POST /v1/hd/incarnation-cross and cross.name in POST /v1/human-design named the cross wrongly in 14 cases: a Personality Sun in gate 2, 7, 32, 42, 44, 51, 57, 60 or 61 at a given angle. Gate 60 at a right angle, for one, gave Right Angle Cross of The Maya instead of Right Angle Cross of Laws. The table was checked against the published list of 192 crosses and now matches it in all 64 gates and three angles.
What to do with your code. If you stored the cross name for these gates, recompute it. Three names are new: Left Angle Cross of Limitation, Left Angle Cross of The Clarion and Juxtaposition Cross of Conservation; Left Angle Cross of The Sphinx, Left Angle Cross of Obscuring, Left Angle Cross of The Limited Plan and Juxtaposition Cross of Continuity are gone.
Profile 4/6. Charts with profile 4/6 got a juxtaposition cross, and 4/6 is a right angle. POST /v1/human-design now returns Right Angle Cross of ... for them. POST /v1/hd/incarnation-cross with gate numbers takes an optional designSunLine: send the Design Sun line along with personalitySunLine: 4 and 4/6 gives the right angle. Without it, line 4 reads as 4/1.
2026-10-29 · AI endpoints now cost what they actually call
Seven endpoints reach the same language model /v1/interpret/* reaches, and
were charging 10 credits against its 100. They now cost what their twin costs.
100 credits a call: POST /v1/ai/chat, /v1/ai/explain-aspect,
/v1/ai/explain-transit, /v1/ai/comparison-coach, /v1/mcp/streaming.
Two of the seven make several model calls per request, and are now billed per call rather than at a flat rate that is wrong at both ends:
POST /v1/mcp/agent-debateisrounds x 2calls, so 200 to 800 credits.roundsdefaults to 2.POST /v1/mcp/multi-agent-coordinateis one call per agent plus a synthesis, so 300 to 500 credits. A repeated agent id is no longer paid for twice: the list is deduplicated.
The amount actually charged arrives as a credits field in the response body,
as it does for /v1/translate/*. For those two the X-Credits-Used header
carries the admission gate rather than the bill: it is set before the number of
calls is known.
On the free plan. The standing rule that Tier 4 and above is paid-only
applies automatically, but five of the seven are exempted from it and stay
available on free: /v1/ai/chat, /v1/ai/explain-aspect,
/v1/ai/explain-transit, /v1/ai/comparison-coach and /v1/mcp/streaming.
Four of those are published as tools by our MCP server, and leaving them out of
reach of a free key would have meant four dead tools. The price still applies:
100 credits against a 10,000-credit free cap is up to a hundred model answers a
month, the same bound /v1/interpret/* has always had.
/v1/mcp/agent-debate and /v1/mcp/multi-agent-coordinate remain paid-only,
because one request there is up to eight and five model calls and that bound
does not hold for them.
If you bring your own provider key (X-Provider), a call costs 5 credits
whatever the endpoint’s tier.
The rest of the group is local computation with no model call
(/v1/mcp/rag-search, /v1/mcp/tool-call-stream,
/v1/mcp/multi-chart-context) and stays at 10.