freeastroapi 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4455 @@
1
+ # Generated by scripts/generate.py from spec/freeastro.json. Do not edit.
2
+
3
+ """Resource classes for every public operation. See scripts/generate.py."""
4
+
5
+ # ruff: noqa: E501
6
+ from __future__ import annotations
7
+
8
+ from dataclasses import dataclass
9
+ from typing import TYPE_CHECKING, Any, Literal, cast
10
+ from urllib.parse import quote
11
+
12
+ from . import schemas
13
+
14
+ if TYPE_CHECKING:
15
+ from .client import AsyncFreeAstro, FreeAstro, RequestOptions
16
+
17
+
18
+ def _query(values: dict[str, Any]) -> dict[str, Any]:
19
+ return {key: value for key, value in values.items() if value is not None}
20
+
21
+
22
+ def _path(value: object) -> str:
23
+ return quote(str(value), safe="")
24
+
25
+
26
+ class AiResource:
27
+ def __init__(self, client: FreeAstro) -> None:
28
+ self._client = client
29
+
30
+ def generate(
31
+ self,
32
+ body: schemas.AtomicReportRequest,
33
+ *,
34
+ options: RequestOptions | None = None,
35
+ ) -> Any:
36
+ """Generate Atomic Report
37
+
38
+ Generates a full astrological report using the Atomic Interpretation System.
39
+
40
+ ``POST /api/v1/ai/generate``
41
+ """
42
+ return self._client.request("POST", "/api/v1/ai/generate", params=None, json=body, options=options)
43
+
44
+
45
+ class ChineseResource:
46
+ def __init__(self, client: FreeAstro) -> None:
47
+ self._client = client
48
+
49
+ def bazi(
50
+ self,
51
+ body: schemas.BaziRequest,
52
+ *,
53
+ options: RequestOptions | None = None,
54
+ ) -> Any:
55
+ """Calculate BaZi (Four Pillars)
56
+
57
+ Calculate Chinese BaZi (Four Pillars of Destiny) chart.
58
+ Includes:
59
+ - 4 Pillars (GanZhi) for Year, Month, Day, Hour
60
+ - 5 Element Analysis (Wu Xing)
61
+ - Solar Term indicators
62
+
63
+ ``POST /api/v1/chinese/bazi``
64
+ """
65
+ return self._client.request("POST", "/api/v1/chinese/bazi", params=None, json=body, options=options)
66
+
67
+ def bazi_flow(
68
+ self,
69
+ body: schemas.BaziFlowRequest,
70
+ *,
71
+ options: RequestOptions | None = None,
72
+ ) -> Any:
73
+ """Calculate BaZi Flow (Annual/Monthly Pillars)
74
+
75
+ Calculate annual and monthly flow pillars for a specific target year.
76
+ Used for professional timing and predictive analysis.
77
+
78
+ ``POST /api/v1/chinese/bazi/flow``
79
+ """
80
+ return self._client.request("POST", "/api/v1/chinese/bazi/flow", params=None, json=body, options=options)
81
+
82
+ def bazi_dictionary(
83
+ self,
84
+ *,
85
+ lang: str | None = None,
86
+ options: RequestOptions | None = None,
87
+ ) -> Any:
88
+ """Get Bazi Interaction & Star Dictionary
89
+
90
+ Get the full mapping of Integer IDs to Interaction/Star definitions.
91
+ Clients should cache this response permanently (versioned by server version).
92
+
93
+ ``GET /api/v1/chinese/bazi/dictionary``
94
+ """
95
+ return self._client.request("GET", "/api/v1/chinese/bazi/dictionary", params=_query({"lang": lang}), json=None, options=options)
96
+
97
+ def today(
98
+ self,
99
+ *,
100
+ include_pinyin: bool | None = None,
101
+ lang: str | None = None,
102
+ options: RequestOptions | None = None,
103
+ ) -> Any:
104
+ """Get Current BaZi Pillars (Time Now)
105
+
106
+ Get current year, month, day, and hour pillars for the present moment.
107
+ Useful for "Today's energy" or quick transit checks.
108
+
109
+ ``GET /api/v1/chinese/today``
110
+ """
111
+ return self._client.request("GET", "/api/v1/chinese/today", params=_query({"include_pinyin": include_pinyin, "lang": lang}), json=None, options=options)
112
+
113
+ def calendar(
114
+ self,
115
+ date: str,
116
+ *,
117
+ lang: str | None = None,
118
+ options: RequestOptions | None = None,
119
+ ) -> schemas.ChineseCalendarResponse:
120
+ """Convert Gregorian Date to Chinese Calendar
121
+
122
+ Convert a Gregorian date to Chinese lunisolar calendar data.
123
+ Returns lunar date names, lunar-new-year and Li Chun year profiles,
124
+ sexagenary month/day cycles, solar terms, and festivals.
125
+
126
+ ``GET /api/v1/chinese/calendar/{date}``
127
+ """
128
+ return cast("schemas.ChineseCalendarResponse", self._client.request("GET", f"/api/v1/chinese/calendar/{_path(date)}", params=_query({"lang": lang}), json=None, options=options))
129
+
130
+ def bazi_time_correction(
131
+ self,
132
+ body: schemas.BaziTimeCorrectionRequest,
133
+ *,
134
+ options: RequestOptions | None = None,
135
+ ) -> Any:
136
+ """Calculate True Solar Time Corrections
137
+
138
+ Get detailed breakdown of True Solar Time corrections.
139
+ Returns Civil, LMT, and True Solar (Relative & Absolute).
140
+
141
+ ``POST /api/v1/chinese/bazi/time-correction``
142
+ """
143
+ return self._client.request("POST", "/api/v1/chinese/bazi/time-correction", params=None, json=body, options=options)
144
+
145
+ def bazi_synastry(
146
+ self,
147
+ body: schemas.BaziSynastryRequest,
148
+ *,
149
+ options: RequestOptions | None = None,
150
+ ) -> Any:
151
+ """Calculate Bazi Compatibility (Synastry)
152
+
153
+ Compare two charts for compatibility.
154
+
155
+ ``POST /api/v1/chinese/bazi/synastry``
156
+ """
157
+ return self._client.request("POST", "/api/v1/chinese/bazi/synastry", params=None, json=body, options=options)
158
+
159
+ def bazi_lifespan(
160
+ self,
161
+ body: schemas.BaziLifespanRequest,
162
+ *,
163
+ options: RequestOptions | None = None,
164
+ ) -> Any:
165
+ """Calculate Neijing Life Curve (Jing/Qi/Shen)
166
+
167
+ Experimental: Calculate energy trajectory (Jing, Qi, Shen) across 0-120y lifespan.
168
+ Based on Neijing 7/8 year cycles + DaYun/Annual modifier simulation.
169
+
170
+ ``POST /api/v1/chinese/bazi/lifespan``
171
+ """
172
+ return self._client.request("POST", "/api/v1/chinese/bazi/lifespan", params=None, json=body, options=options)
173
+
174
+ def bazi_health(
175
+ self,
176
+ body: schemas.BaziHealthRequest,
177
+ *,
178
+ options: RequestOptions | None = None,
179
+ ) -> Any:
180
+ """Analyze BaZi Constitution & Health Tendencies
181
+
182
+ Analyze BaZi chart for constitution and health tendency themes.
183
+
184
+ ``POST /api/v1/chinese/bazi/health``
185
+ """
186
+ return self._client.request("POST", "/api/v1/chinese/bazi/health", params=None, json=body, options=options)
187
+
188
+
189
+ class EphemerisResource:
190
+ def __init__(self, client: FreeAstro) -> None:
191
+ self._client = client
192
+
193
+ def calculate(
194
+ self,
195
+ body: schemas.EphemerisRequest,
196
+ *,
197
+ options: RequestOptions | None = None,
198
+ ) -> Any:
199
+ """Calculate Ephemeris
200
+
201
+ ``POST /api/v1/ephemeris/calculate``
202
+ """
203
+ return self._client.request("POST", "/api/v1/ephemeris/calculate", params=None, json=body, options=options)
204
+
205
+ def get(
206
+ self,
207
+ *,
208
+ start: str,
209
+ end: str | None = None,
210
+ step: str | None = None,
211
+ zodiac_type: Literal["tropical", "sidereal"] | None = None,
212
+ sidereal_ayanamsa: str | None = None,
213
+ house_system: str | None = None,
214
+ bodies: str | None = None,
215
+ include_angles: bool | None = None,
216
+ include_houses: bool | None = None,
217
+ include_speed: bool | None = None,
218
+ include_retrograde: bool | None = None,
219
+ include_dignity: bool | None = None,
220
+ include_sign_degree: bool | None = None,
221
+ include_aspects: bool | None = None,
222
+ include_minor_aspects: bool | None = None,
223
+ include_moon_void_of_course: bool | None = None,
224
+ include_fixed_stars: bool | None = None,
225
+ fixed_stars: str | None = None,
226
+ fixed_star_packs: str | None = None,
227
+ lat: float | None = None,
228
+ lng: float | None = None,
229
+ tz_str: str | None = None,
230
+ timezone: str | None = None,
231
+ dst_policy: Literal["reject", "earlier", "later", "shift_forward"] | None = None,
232
+ format: Literal["json", "table"] | None = None,
233
+ response_mode: Literal["json", "table"] | None = None,
234
+ table_style: Literal["rows", "columns", "grid"] | None = None,
235
+ include_sidereal_time: bool | None = None,
236
+ cell_format: Literal["parts", "text"] | None = None,
237
+ include_chart_links: bool | None = None,
238
+ sign_display: Literal["abbr", "full"] | None = None,
239
+ show_motion_markers: bool | None = None,
240
+ options: RequestOptions | None = None,
241
+ ) -> Any:
242
+ """Get Ephemeris
243
+
244
+ ``GET /api/v1/ephemeris``
245
+ """
246
+ return self._client.request("GET", "/api/v1/ephemeris", params=_query({"start": start, "end": end, "step": step, "zodiac_type": zodiac_type, "sidereal_ayanamsa": sidereal_ayanamsa, "house_system": house_system, "bodies": bodies, "include_angles": include_angles, "include_houses": include_houses, "include_speed": include_speed, "include_retrograde": include_retrograde, "include_dignity": include_dignity, "include_sign_degree": include_sign_degree, "include_aspects": include_aspects, "include_minor_aspects": include_minor_aspects, "include_moon_void_of_course": include_moon_void_of_course, "include_fixed_stars": include_fixed_stars, "fixed_stars": fixed_stars, "fixed_star_packs": fixed_star_packs, "lat": lat, "lng": lng, "tz_str": tz_str, "timezone": timezone, "dst_policy": dst_policy, "format": format, "response_mode": response_mode, "table_style": table_style, "include_sidereal_time": include_sidereal_time, "cell_format": cell_format, "include_chart_links": include_chart_links, "sign_display": sign_display, "show_motion_markers": show_motion_markers}), json=None, options=options)
247
+
248
+
249
+ class GeoResourceBase:
250
+ def __init__(self, client: FreeAstro) -> None:
251
+ self._client = client
252
+
253
+ def search_v1(
254
+ self,
255
+ *,
256
+ q: str | None = None,
257
+ city: str | None = None,
258
+ limit: int | None = None,
259
+ country: str | None = None,
260
+ options: RequestOptions | None = None,
261
+ ) -> schemas.CitySearchResponse:
262
+ """Search Cities (Free)
263
+
264
+ Search for cities by name prefix for autocomplete functionality.
265
+
266
+ ``GET /api/v1/geo/search``
267
+
268
+ .. deprecated:: this operation is deprecated by the API.
269
+ """
270
+ return cast("schemas.CitySearchResponse", self._client.request("GET", "/api/v1/geo/search", params=_query({"q": q, "city": city, "limit": limit, "country": country}), json=None, options=options))
271
+
272
+
273
+ class HoroscopeDailyResource:
274
+ def __init__(self, client: FreeAstro) -> None:
275
+ self._client = client
276
+
277
+ def sign_v1(
278
+ self,
279
+ *,
280
+ sign: str,
281
+ date: str | None = None,
282
+ timezone: str | None = None,
283
+ tz_str: str | None = None,
284
+ lang: str | None = None,
285
+ locale: str | None = None,
286
+ type: str | None = None,
287
+ style: str | None = None,
288
+ variant: str | None = None,
289
+ options: RequestOptions | None = None,
290
+ ) -> dict[str, Any]:
291
+ """Get Sign Horoscope
292
+
293
+ Get generic daily horoscope for a specific sign.
294
+
295
+ ``GET /api/v1/horoscope/daily/sign``
296
+ """
297
+ return cast("dict[str, Any]", self._client.request("GET", "/api/v1/horoscope/daily/sign", params=_query({"sign": sign, "date": date, "timezone": timezone, "tz_str": tz_str, "lang": lang, "locale": locale, "type": type, "style": style, "variant": variant}), json=None, options=options))
298
+
299
+ def bulk(
300
+ self,
301
+ *,
302
+ date: str | None = None,
303
+ timezone: str | None = None,
304
+ tz_str: str | None = None,
305
+ locale: str | None = None,
306
+ options: RequestOptions | None = None,
307
+ ) -> dict[str, Any]:
308
+ """Get Bulk Horoscope
309
+
310
+ Get daily horoscope for ALL signs. Optimized for caching/newsletters.
311
+
312
+ ``GET /api/v1/horoscope/daily/bulk``
313
+ """
314
+ return cast("dict[str, Any]", self._client.request("GET", "/api/v1/horoscope/daily/bulk", params=_query({"date": date, "timezone": timezone, "tz_str": tz_str, "locale": locale}), json=None, options=options))
315
+
316
+ def personal_v1(
317
+ self,
318
+ body: schemas.PersonalHoroscopeRequestV1,
319
+ *,
320
+ options: RequestOptions | None = None,
321
+ ) -> dict[str, Any]:
322
+ """Get Personal Horoscope
323
+
324
+ Get personalized daily horoscope using natal chart + transits.
325
+
326
+ ``POST /api/v1/horoscope/daily/personal``
327
+ """
328
+ return cast("dict[str, Any]", self._client.request("POST", "/api/v1/horoscope/daily/personal", params=None, json=body, options=options))
329
+
330
+ def sign_v2(
331
+ self,
332
+ *,
333
+ sign: str,
334
+ date: str | None = None,
335
+ tz_str: str | None = None,
336
+ lang: str | None = None,
337
+ locale: str | None = None,
338
+ options: RequestOptions | None = None,
339
+ ) -> dict[str, Any]:
340
+ """Get Sign Horoscope
341
+
342
+ ``GET /api/v2/horoscope/daily/sign``
343
+ """
344
+ return cast("dict[str, Any]", self._client.request("GET", "/api/v2/horoscope/daily/sign", params=_query({"sign": sign, "date": date, "tz_str": tz_str, "lang": lang, "locale": locale}), json=None, options=options))
345
+
346
+ def personal_v2(
347
+ self,
348
+ body: schemas.PersonalHoroscopeRequestV2,
349
+ *,
350
+ options: RequestOptions | None = None,
351
+ ) -> dict[str, Any]:
352
+ """Get Personal Horoscope
353
+
354
+ ``POST /api/v2/horoscope/daily/personal``
355
+ """
356
+ return cast("dict[str, Any]", self._client.request("POST", "/api/v2/horoscope/daily/personal", params=None, json=body, options=options))
357
+
358
+ def sign(
359
+ self,
360
+ *,
361
+ sign: str,
362
+ date: str | None = None,
363
+ timezone: str | None = None,
364
+ tz_str: str | None = None,
365
+ lang: str | None = None,
366
+ locale: str | None = None,
367
+ type: str | None = None,
368
+ style: str | None = None,
369
+ variant: str | None = None,
370
+ options: RequestOptions | None = None,
371
+ ) -> dict[str, Any]:
372
+ """Get Sign Horoscope
373
+
374
+ Compatibility endpoint for playground clients that selected the V3 engine
375
+ while using the generic sign horoscope. V3 is personal-only today, so this
376
+ returns the V2 sign engine shape under the V3 route instead of 404ing.
377
+
378
+ ``GET /api/v3/horoscope/daily/sign``
379
+ """
380
+ return cast("dict[str, Any]", self._client.request("GET", "/api/v3/horoscope/daily/sign", params=_query({"sign": sign, "date": date, "timezone": timezone, "tz_str": tz_str, "lang": lang, "locale": locale, "type": type, "style": style, "variant": variant}), json=None, options=options))
381
+
382
+ def personal(
383
+ self,
384
+ body: schemas.PersonalHoroscopeRequestV3,
385
+ *,
386
+ options: RequestOptions | None = None,
387
+ ) -> dict[str, Any]:
388
+ """Get Personal Horoscope
389
+
390
+ ``POST /api/v3/horoscope/daily/personal``
391
+ """
392
+ return cast("dict[str, Any]", self._client.request("POST", "/api/v3/horoscope/daily/personal", params=None, json=body, options=options))
393
+
394
+
395
+ class HoroscopeWeeklyResource:
396
+ def __init__(self, client: FreeAstro) -> None:
397
+ self._client = client
398
+
399
+ def personal(
400
+ self,
401
+ body: schemas.WeeklyPersonalHoroscopeRequest,
402
+ *,
403
+ options: RequestOptions | None = None,
404
+ ) -> dict[str, Any]:
405
+ """Get Weekly Personal Horoscope
406
+
407
+ ``POST /api/v3/horoscope/weekly/personal``
408
+ """
409
+ return cast("dict[str, Any]", self._client.request("POST", "/api/v3/horoscope/weekly/personal", params=None, json=body, options=options))
410
+
411
+
412
+ class HoroscopeResource:
413
+ def __init__(self, client: FreeAstro) -> None:
414
+ self._client = client
415
+ self.daily = HoroscopeDailyResource(client)
416
+ self.weekly = HoroscopeWeeklyResource(client)
417
+
418
+
419
+ class MoonResourceBase:
420
+ def __init__(self, client: FreeAstro) -> None:
421
+ self._client = client
422
+
423
+
424
+ class NatalExperimentalResource:
425
+ def __init__(self, client: FreeAstro) -> None:
426
+ self._client = client
427
+
428
+ def transits(
429
+ self,
430
+ body: schemas.ExperimentalTransitChartRequest,
431
+ *,
432
+ options: RequestOptions | None = None,
433
+ ) -> Any:
434
+ """Experimental Transits Chart
435
+
436
+ Generate a bi-wheel chart with natal planets inside and transits outside.
437
+
438
+ ``POST /api/v1/natal/experimental/transits``
439
+
440
+ .. deprecated:: this operation is deprecated by the API.
441
+ """
442
+ return self._client.request("POST", "/api/v1/natal/experimental/transits", params=None, json=body, options=options)
443
+
444
+ def solar_return(
445
+ self,
446
+ body: schemas.ExperimentalSolarReturnChartRequest,
447
+ *,
448
+ options: RequestOptions | None = None,
449
+ ) -> Any:
450
+ """Experimental Solar Return Chart
451
+
452
+ Generate a bi-wheel or standalone chart for the exact solar return in a target year.
453
+
454
+ ``POST /api/v1/natal/experimental/solar-return``
455
+
456
+ .. deprecated:: this operation is deprecated by the API.
457
+ """
458
+ return self._client.request("POST", "/api/v1/natal/experimental/solar-return", params=None, json=body, options=options)
459
+
460
+
461
+ class NatalResource:
462
+ def __init__(self, client: FreeAstro) -> None:
463
+ self._client = client
464
+ self.experimental = NatalExperimentalResource(client)
465
+
466
+ def simple(
467
+ self,
468
+ body: schemas.SimpleNatalRequest,
469
+ *,
470
+ options: RequestOptions | None = None,
471
+ ) -> Any:
472
+ """Calculate Simple Natal
473
+
474
+ A simplified natal endpoint for developer-facing apps.
475
+ Returns a compact response with curated planets, houses, and useful summary fields.
476
+
477
+ ``POST /natal``
478
+ """
479
+ return self._client.request("POST", "/natal", params=None, json=body, options=options)
480
+
481
+ def calculate(
482
+ self,
483
+ body: schemas.NatalChartRequest,
484
+ *,
485
+ include_minor: bool | None = None,
486
+ include_stelliums: bool | None = None,
487
+ options: RequestOptions | None = None,
488
+ ) -> Any:
489
+ """Calculate Natal
490
+
491
+ Calculate natal chart with planetary positions, houses, and aspects.
492
+
493
+ ``POST /api/v1/natal/calculate``
494
+ """
495
+ return self._client.request("POST", "/api/v1/natal/calculate", params=_query({"include_minor": include_minor, "include_stelliums": include_stelliums}), json=body, options=options)
496
+
497
+ def report_credits(
498
+ self,
499
+ *,
500
+ options: RequestOptions | None = None,
501
+ ) -> Any:
502
+ """Get Report Credits For Api Key
503
+
504
+ ``GET /api/v1/natal/report-credits``
505
+ """
506
+ return self._client.request("GET", "/api/v1/natal/report-credits", params=None, json=None, options=options)
507
+
508
+ def report(
509
+ self,
510
+ job_id: str,
511
+ *,
512
+ format: Literal["json", "pdf"] | None = None,
513
+ include_profile_branding_logo: bool | None = None,
514
+ options: RequestOptions | None = None,
515
+ ) -> Any:
516
+ """Get Psychological Report
517
+
518
+ ``GET /api/v1/natal/report/{job_id}``
519
+ """
520
+ return self._client.request("GET", f"/api/v1/natal/report/{_path(job_id)}", params=_query({"format": format, "include_profile_branding_logo": include_profile_branding_logo}), json=None, options=options)
521
+
522
+ def chart(
523
+ self,
524
+ body: schemas.ExperimentalNatalChartRequest,
525
+ *,
526
+ options: RequestOptions | None = None,
527
+ ) -> Any:
528
+ """Experimental Natal Chart
529
+
530
+ Render a natal chart using the bundled natal library.
531
+
532
+ ``POST /api/v1/natal/chart/``
533
+ """
534
+ return self._client.request("POST", "/api/v1/natal/chart/", params=None, json=body, options=options)
535
+
536
+ def chart_transits(
537
+ self,
538
+ body: schemas.ExperimentalTransitChartRequest,
539
+ *,
540
+ options: RequestOptions | None = None,
541
+ ) -> Any:
542
+ """Experimental Transits Chart
543
+
544
+ Generate a bi-wheel chart with natal planets inside and transits outside.
545
+
546
+ ``POST /api/v1/natal/chart/transits``
547
+ """
548
+ return self._client.request("POST", "/api/v1/natal/chart/transits", params=None, json=body, options=options)
549
+
550
+ def chart_solar_return(
551
+ self,
552
+ body: schemas.ExperimentalSolarReturnChartRequest,
553
+ *,
554
+ options: RequestOptions | None = None,
555
+ ) -> Any:
556
+ """Experimental Solar Return Chart
557
+
558
+ Generate a bi-wheel or standalone chart for the exact solar return in a target year.
559
+
560
+ ``POST /api/v1/natal/chart/solar-return``
561
+ """
562
+ return self._client.request("POST", "/api/v1/natal/chart/solar-return", params=None, json=body, options=options)
563
+
564
+ def chart_secondary_progressions(
565
+ self,
566
+ body: schemas.ExperimentalSecondaryProgressionsChartRequest,
567
+ *,
568
+ options: RequestOptions | None = None,
569
+ ) -> Any:
570
+ """Experimental Secondary Progressions Chart
571
+
572
+ Generate a bi-wheel chart with natal planets inside and secondary progressed planets outside.
573
+
574
+ ``POST /api/v1/natal/chart/secondary-progressions``
575
+ """
576
+ return self._client.request("POST", "/api/v1/natal/chart/secondary-progressions", params=None, json=body, options=options)
577
+
578
+ def chart_progressions(
579
+ self,
580
+ body: schemas.ExperimentalSecondaryProgressionsChartRequest,
581
+ *,
582
+ options: RequestOptions | None = None,
583
+ ) -> Any:
584
+ """Experimental Secondary Progressions Chart
585
+
586
+ Generate a bi-wheel chart with natal planets inside and secondary progressed planets outside.
587
+
588
+ ``POST /api/v1/natal/chart/progressions``
589
+ """
590
+ return self._client.request("POST", "/api/v1/natal/chart/progressions", params=None, json=body, options=options)
591
+
592
+ def chart_composite(
593
+ self,
594
+ body: schemas.ExperimentalCompositeChartRequest,
595
+ *,
596
+ options: RequestOptions | None = None,
597
+ ) -> Any:
598
+ """Experimental Composite Chart
599
+
600
+ Midpoint composite single-wheel chart endpoint.
601
+ Renders a standalone composite chart from two people, reusing the natal SVG renderer.
602
+
603
+ ``POST /api/v1/natal/chart/composite``
604
+ """
605
+ return self._client.request("POST", "/api/v1/natal/chart/composite", params=None, json=body, options=options)
606
+
607
+ def chart_synastry(
608
+ self,
609
+ body: schemas.ExperimentalSynastryChartRequest,
610
+ *,
611
+ options: RequestOptions | None = None,
612
+ ) -> Any:
613
+ """Experimental Synastry Chart
614
+
615
+ Synastry bi-wheel chart endpoint.
616
+ Renders person A (outer) and person B (inner) with optional B house ring and inter-aspects.
617
+
618
+ ``POST /api/v1/natal/chart/synastry``
619
+ """
620
+ return self._client.request("POST", "/api/v1/natal/chart/synastry", params=None, json=body, options=options)
621
+
622
+
623
+ class NumerologyResource:
624
+ def __init__(self, client: FreeAstro) -> None:
625
+ self._client = client
626
+
627
+ def methods(
628
+ self,
629
+ *,
630
+ options: RequestOptions | None = None,
631
+ ) -> schemas.NumerologyMethodsResponse:
632
+ """List supported numerology methods and policies
633
+
634
+ ``GET /api/v1/numerology/methods``
635
+ """
636
+ return cast("schemas.NumerologyMethodsResponse", self._client.request("GET", "/api/v1/numerology/methods", params=None, json=None, options=options))
637
+
638
+ def alphabets(
639
+ self,
640
+ *,
641
+ options: RequestOptions | None = None,
642
+ ) -> schemas.NumerologyAlphabetsResponse:
643
+ """List immutable numerology alphabet and Gematria tables
644
+
645
+ ``GET /api/v1/numerology/alphabets``
646
+ """
647
+ return cast("schemas.NumerologyAlphabetsResponse", self._client.request("GET", "/api/v1/numerology/alphabets", params=None, json=None, options=options))
648
+
649
+ def profile(
650
+ self,
651
+ body: schemas.NumerologyProfileRequest,
652
+ *,
653
+ options: RequestOptions | None = None,
654
+ ) -> schemas.NumerologyProfileResponse:
655
+ """Calculate a versioned numerology profile
656
+
657
+ Calculate without persisting subject names, dates, or derived results.
658
+
659
+ ``POST /api/v1/numerology/profile``
660
+ """
661
+ return cast("schemas.NumerologyProfileResponse", self._client.request("POST", "/api/v1/numerology/profile", params=None, json=body, options=options))
662
+
663
+
664
+ class SkyEventsResourceBase:
665
+ def __init__(self, client: FreeAstro) -> None:
666
+ self._client = client
667
+
668
+
669
+ class SpaceResource:
670
+ def __init__(self, client: FreeAstro) -> None:
671
+ self._client = client
672
+
673
+ def chart(
674
+ self,
675
+ body: schemas.SpaceChartRequest,
676
+ *,
677
+ options: RequestOptions | None = None,
678
+ ) -> Any:
679
+ """Space Chart
680
+
681
+ ``POST /api/v1/space/chart``
682
+ """
683
+ return self._client.request("POST", "/api/v1/space/chart", params=None, json=body, options=options)
684
+
685
+ def chart_svg(
686
+ self,
687
+ body: schemas.SpaceChartSvgRequest,
688
+ *,
689
+ options: RequestOptions | None = None,
690
+ ) -> Any:
691
+ """Space Chart Svg
692
+
693
+ The chart wheel, drawn by the natal chart renderer with the same themes and options.
694
+
695
+ ``POST /api/v1/space/chart/svg``
696
+ """
697
+ return self._client.request("POST", "/api/v1/space/chart/svg", params=None, json=body, options=options)
698
+
699
+
700
+ class TransitsResource:
701
+ def __init__(self, client: FreeAstro) -> None:
702
+ self._client = client
703
+
704
+ def calculate(
705
+ self,
706
+ body: schemas.TransitRequest,
707
+ *,
708
+ include_minor: bool | None = None,
709
+ options: RequestOptions | None = None,
710
+ ) -> Any:
711
+ """Calculate Transits
712
+
713
+ Calculate planetary transits relative to natal chart.
714
+
715
+ ``POST /api/v1/transits/calculate``
716
+ """
717
+ return self._client.request("POST", "/api/v1/transits/calculate", params=_query({"include_minor": include_minor}), json=body, options=options)
718
+
719
+
720
+ class VedicTransitsResource:
721
+ def __init__(self, client: FreeAstro) -> None:
722
+ self._client = client
723
+
724
+ def insights(
725
+ self,
726
+ body: schemas.VedicTransitInsightsRequest,
727
+ *,
728
+ options: RequestOptions | None = None,
729
+ ) -> schemas.VedicTransitInsightsResponse:
730
+ """Get Transit Insights
731
+
732
+ Get Vedic gochar snapshot facts comparing a transit date against the natal chart.
733
+
734
+ ``POST /api/v1/vedic/transits/insights``
735
+ """
736
+ return cast("schemas.VedicTransitInsightsResponse", self._client.request("POST", "/api/v1/vedic/transits/insights", params=None, json=body, options=options))
737
+
738
+
739
+ class VedicGocharResource:
740
+ def __init__(self, client: FreeAstro) -> None:
741
+ self._client = client
742
+
743
+ def timeline_v1(
744
+ self,
745
+ body: schemas.VedicGocharTimelineRequest,
746
+ *,
747
+ options: RequestOptions | None = None,
748
+ ) -> schemas.VedicGocharTimelineResponse:
749
+ """Get Gochar Timeline
750
+
751
+ Get compact Vedic gochar timeline windows over a bounded date range.
752
+
753
+ ``POST /api/v1/vedic/gochar/timeline``
754
+ """
755
+ return cast("schemas.VedicGocharTimelineResponse", self._client.request("POST", "/api/v1/vedic/gochar/timeline", params=None, json=body, options=options))
756
+
757
+ def timeline_insights_v1(
758
+ self,
759
+ body: schemas.VedicGocharTimelineRequest,
760
+ *,
761
+ options: RequestOptions | None = None,
762
+ ) -> schemas.VedicGocharTimelineInsightsResponse:
763
+ """Get Gochar Timeline Insights
764
+
765
+ Get ranked Vedic gochar timeline insights derived from compact timeline windows.
766
+
767
+ ``POST /api/v1/vedic/gochar/timeline/insights``
768
+ """
769
+ return cast("schemas.VedicGocharTimelineInsightsResponse", self._client.request("POST", "/api/v1/vedic/gochar/timeline/insights", params=None, json=body, options=options))
770
+
771
+ def timeline(
772
+ self,
773
+ body: schemas.GocharTimelineRequest,
774
+ *,
775
+ options: RequestOptions | None = None,
776
+ ) -> schemas.GocharTimelineV2Response:
777
+ """Get Vedic Gochar Timeline (v2)
778
+
779
+ Return compact V2 Vedic gochar windows over a bounded date range.
780
+
781
+ ``POST /api/v2/vedic/gochar/timeline``
782
+ """
783
+ return cast("schemas.GocharTimelineV2Response", self._client.request("POST", "/api/v2/vedic/gochar/timeline", params=None, json=body, options=options))
784
+
785
+ def timeline_insights(
786
+ self,
787
+ body: schemas.GocharTimelineRequest,
788
+ *,
789
+ options: RequestOptions | None = None,
790
+ ) -> schemas.VedicGocharTimelineInsightsV2Response:
791
+ """Get Vedic Gochar Timeline Insights (v2)
792
+
793
+ Return ranked V2 Vedic gochar insight facts derived from the calibrated V2 timeline.
794
+
795
+ ``POST /api/v2/vedic/gochar/timeline/insights``
796
+ """
797
+ return cast("schemas.VedicGocharTimelineInsightsV2Response", self._client.request("POST", "/api/v2/vedic/gochar/timeline/insights", params=None, json=body, options=options))
798
+
799
+
800
+ class VedicVisualResource:
801
+ def __init__(self, client: FreeAstro) -> None:
802
+ self._client = client
803
+
804
+ def chart(
805
+ self,
806
+ body: schemas.VedicVisualChartRequest,
807
+ *,
808
+ options: RequestOptions | None = None,
809
+ ) -> str:
810
+ """Render Vedic Visual Chart (v2)
811
+
812
+ Render requested V2 divisional charts as a raw SVG or PNG image.
813
+
814
+ ``POST /api/v2/vedic/visual/chart``
815
+
816
+ Returns the image body as text; use ``request_raw`` for binary formats such as PNG.
817
+ """
818
+ return cast("str", self._client.request("POST", "/api/v2/vedic/visual/chart", params=None, json=body, options=options))
819
+
820
+
821
+ class VedicHoroscopeResource:
822
+ def __init__(self, client: FreeAstro) -> None:
823
+ self._client = client
824
+
825
+ def daily_sign(
826
+ self,
827
+ *,
828
+ sign: Literal["aries", "taurus", "gemini", "cancer", "leo", "virgo", "libra", "scorpio", "sagittarius", "capricorn", "aquarius", "pisces"],
829
+ target_date: str | None = None,
830
+ tz_str: str | None = None,
831
+ ayanamsha: Literal["lahiri", "raman", "kp", "yukteshwar", "fagan_bradley", "true_pushya", "pushya"] | None = None,
832
+ node_type: Literal["mean", "true"] | None = None,
833
+ include_interpretation: bool | None = None,
834
+ lang: Literal["en", "hi"] | None = None,
835
+ language: Literal["en", "hi"] | None = None,
836
+ options: RequestOptions | None = None,
837
+ ) -> schemas.DailyRashifalSignResponse:
838
+ """Get General Daily Vedic Rashifal for One Moon Sign (v2)
839
+
840
+ General Moon-sign forecast with calculated transits and optional English or Hindi readings. No birth details required.
841
+
842
+ ``GET /api/v2/vedic/horoscope/daily/sign``
843
+ """
844
+ return cast("schemas.DailyRashifalSignResponse", self._client.request("GET", "/api/v2/vedic/horoscope/daily/sign", params=_query({"sign": sign, "target_date": target_date, "tz_str": tz_str, "ayanamsha": ayanamsha, "node_type": node_type, "include_interpretation": include_interpretation, "lang": lang, "language": language}), json=None, options=options))
845
+
846
+ def daily_bulk(
847
+ self,
848
+ *,
849
+ target_date: str | None = None,
850
+ tz_str: str | None = None,
851
+ ayanamsha: Literal["lahiri", "raman", "kp", "yukteshwar", "fagan_bradley", "true_pushya", "pushya"] | None = None,
852
+ node_type: Literal["mean", "true"] | None = None,
853
+ include_interpretation: bool | None = None,
854
+ lang: Literal["en", "hi"] | None = None,
855
+ language: Literal["en", "hi"] | None = None,
856
+ options: RequestOptions | None = None,
857
+ ) -> schemas.DailyRashifalBulkResponse:
858
+ """Get General Daily Vedic Rashifal for All 12 Moon Signs (v2)
859
+
860
+ Return all 12 rashis from one shared noon sky snapshot, keyed by lowercase English sign names.
861
+
862
+ ``GET /api/v2/vedic/horoscope/daily/bulk``
863
+ """
864
+ return cast("schemas.DailyRashifalBulkResponse", self._client.request("GET", "/api/v2/vedic/horoscope/daily/bulk", params=_query({"target_date": target_date, "tz_str": tz_str, "ayanamsha": ayanamsha, "node_type": node_type, "include_interpretation": include_interpretation, "lang": lang, "language": language}), json=None, options=options))
865
+
866
+ def daily_personal(
867
+ self,
868
+ body: schemas.DailyVedicHoroscopeRequest,
869
+ *,
870
+ options: RequestOptions | None = None,
871
+ ) -> schemas.DailyVedicHoroscopeV2Response:
872
+ """Get Daily Vedic Horoscope (v2)
873
+
874
+ Return a premium deterministic daily Vedic horoscope composed from V2
875
+ chart context, one-day gochar insights, active Vimshottari dasha, and Panchang.
876
+
877
+ ``POST /api/v2/vedic/horoscope/daily/personal``
878
+ """
879
+ return cast("schemas.DailyVedicHoroscopeV2Response", self._client.request("POST", "/api/v2/vedic/horoscope/daily/personal", params=None, json=body, options=options))
880
+
881
+
882
+ class VedicMuhuratResource:
883
+ def __init__(self, client: FreeAstro) -> None:
884
+ self._client = client
885
+
886
+ def search(
887
+ self,
888
+ body: schemas.VedicMuhuratSearchRequest,
889
+ *,
890
+ options: RequestOptions | None = None,
891
+ ) -> schemas.VedicMuhuratSearchResponse:
892
+ """Search auspicious Vedic windows (v2)
893
+
894
+ Search a monthly date range for auspicious windows.
895
+
896
+ ``POST /api/v2/vedic/muhurat/search``
897
+ """
898
+ return cast("schemas.VedicMuhuratSearchResponse", self._client.request("POST", "/api/v2/vedic/muhurat/search", params=None, json=body, options=options))
899
+
900
+ def personalized_search(
901
+ self,
902
+ body: schemas.VedicMuhuratPersonalizedSearchRequest,
903
+ *,
904
+ options: RequestOptions | None = None,
905
+ ) -> schemas.VedicMuhuratSearchResponse:
906
+ """Search auspicious Vedic windows with natal personalization (v2)
907
+
908
+ Search public muhurat windows, then re-rank them for a specific birth chart.
909
+
910
+ ``POST /api/v2/vedic/muhurat/personalized-search``
911
+ """
912
+ return cast("schemas.VedicMuhuratSearchResponse", self._client.request("POST", "/api/v2/vedic/muhurat/personalized-search", params=None, json=body, options=options))
913
+
914
+
915
+ class VedicResource:
916
+ def __init__(self, client: FreeAstro) -> None:
917
+ self._client = client
918
+ self.transits = VedicTransitsResource(client)
919
+ self.gochar = VedicGocharResource(client)
920
+ self.visual = VedicVisualResource(client)
921
+ self.horoscope = VedicHoroscopeResource(client)
922
+ self.muhurat = VedicMuhuratResource(client)
923
+
924
+ def match_v1(
925
+ self,
926
+ body: schemas.MatchRequest,
927
+ *,
928
+ options: RequestOptions | None = None,
929
+ ) -> Any:
930
+ """Match Birth Details
931
+
932
+ Calculate compatibility using birth details directly.
933
+ Computes Moon Nakshatra/Sign internally to avoid ID lookup errors.
934
+
935
+ ``POST /api/v1/vedic/match``
936
+ """
937
+ return self._client.request("POST", "/api/v1/vedic/match", params=None, json=body, options=options)
938
+
939
+ def chart_v1(
940
+ self,
941
+ body: schemas.BaseChartRequestV1,
942
+ *,
943
+ options: RequestOptions | None = None,
944
+ ) -> Any:
945
+ """Get Basic Chart
946
+
947
+ Get basic Vedic chart: Planets + Houses + Ascendant.
948
+ Lightweight endpoint for essential data only.
949
+
950
+ ``POST /api/v1/vedic/chart``
951
+ """
952
+ return self._client.request("POST", "/api/v1/vedic/chart", params=None, json=body, options=options)
953
+
954
+ def calculate_v1(
955
+ self,
956
+ body: schemas.VedicChartRequest,
957
+ *,
958
+ options: RequestOptions | None = None,
959
+ ) -> Any:
960
+ """Calculate Full Chart
961
+
962
+ Full Vedic chart with all optional features.
963
+ Use feature toggles to customize response.
964
+
965
+ ``POST /api/v1/vedic/calculate``
966
+ """
967
+ return self._client.request("POST", "/api/v1/vedic/calculate", params=None, json=body, options=options)
968
+
969
+ def dasha_v1(
970
+ self,
971
+ body: schemas.DashaRequestV1,
972
+ *,
973
+ options: RequestOptions | None = None,
974
+ ) -> Any:
975
+ """Get Dasha
976
+
977
+ Get Vimshottari Dasha timeline only.
978
+
979
+ ``POST /api/v1/vedic/dasha``
980
+ """
981
+ return self._client.request("POST", "/api/v1/vedic/dasha", params=None, json=body, options=options)
982
+
983
+ def dasha_insights_v1(
984
+ self,
985
+ body: schemas.DashaRequestV1,
986
+ *,
987
+ options: RequestOptions | None = None,
988
+ ) -> schemas.VedicDashaInsightsResponse:
989
+ """Get Dasha Insights
990
+
991
+ Get index-ready Vimshottari Dasha facts for Vedic retrieval and bot use.
992
+
993
+ ``POST /api/v1/vedic/dasha/insights``
994
+ """
995
+ return cast("schemas.VedicDashaInsightsResponse", self._client.request("POST", "/api/v1/vedic/dasha/insights", params=None, json=body, options=options))
996
+
997
+ def yogas_v1(
998
+ self,
999
+ body: schemas.BaseChartRequestV1,
1000
+ *,
1001
+ options: RequestOptions | None = None,
1002
+ ) -> Any:
1003
+ """Get Yogas
1004
+
1005
+ Get detected Yogas only (Manglik, Kala Sarpa, Raj Yogas, etc).
1006
+
1007
+ ``POST /api/v1/vedic/yogas``
1008
+ """
1009
+ return self._client.request("POST", "/api/v1/vedic/yogas", params=None, json=body, options=options)
1010
+
1011
+ def strength_v1(
1012
+ self,
1013
+ body: schemas.BaseChartRequestV1,
1014
+ *,
1015
+ options: RequestOptions | None = None,
1016
+ ) -> Any:
1017
+ """Get Strength
1018
+
1019
+ Get planetary strength: Shadbala + Ashtakavarga.
1020
+
1021
+ ``POST /api/v1/vedic/strength``
1022
+ """
1023
+ return self._client.request("POST", "/api/v1/vedic/strength", params=None, json=body, options=options)
1024
+
1025
+ def vargas_v1(
1026
+ self,
1027
+ body: schemas.VargaRequest,
1028
+ *,
1029
+ options: RequestOptions | None = None,
1030
+ ) -> Any:
1031
+ """Get Vargas
1032
+
1033
+ Get divisional chart positions (D1, D9, D10, etc).
1034
+
1035
+ ``POST /api/v1/vedic/vargas``
1036
+ """
1037
+ return self._client.request("POST", "/api/v1/vedic/vargas", params=None, json=body, options=options)
1038
+
1039
+ def compatibility_v1(
1040
+ self,
1041
+ body: schemas.CompatibilityRequest,
1042
+ *,
1043
+ options: RequestOptions | None = None,
1044
+ ) -> Any:
1045
+ """Calculate Compatibility
1046
+
1047
+ Calculate Ashtakoota (8-point) compatibility.
1048
+ Returns score out of 36.
1049
+
1050
+ ``POST /api/v1/vedic/compatibility``
1051
+ """
1052
+ return self._client.request("POST", "/api/v1/vedic/compatibility", params=None, json=body, options=options)
1053
+
1054
+ def panchang_v1(
1055
+ self,
1056
+ body: schemas.PanchangRequestV1,
1057
+ *,
1058
+ options: RequestOptions | None = None,
1059
+ ) -> Any:
1060
+ """Get Panchang
1061
+
1062
+ Get Panchang (daily almanac): Tithi, Nakshatra, Yoga, Karana, Rahu Kalam.
1063
+
1064
+ ``POST /api/v1/vedic/panchang``
1065
+ """
1066
+ return self._client.request("POST", "/api/v1/vedic/panchang", params=None, json=body, options=options)
1067
+
1068
+ def batch(
1069
+ self,
1070
+ body: schemas.VedicBatchRequest,
1071
+ *,
1072
+ options: RequestOptions | None = None,
1073
+ ) -> Any:
1074
+ """Run Vedic Batch
1075
+
1076
+ Run up to 6 single-person Vedic endpoint calls in one HTTP request.
1077
+ Items execute sequentially to keep compute bounded and preserve per-item order.
1078
+
1079
+ ``POST /api/v1/vedic/batch``
1080
+ """
1081
+ return self._client.request("POST", "/api/v1/vedic/batch", params=None, json=body, options=options)
1082
+
1083
+ def chat(
1084
+ self,
1085
+ body: schemas.VedicChatRequest,
1086
+ *,
1087
+ options: RequestOptions | None = None,
1088
+ ) -> schemas.VedicChatResponse:
1089
+ """Hosted Vedic Chat (v2)
1090
+
1091
+ Hosted Vedic Chat orchestration.
1092
+
1093
+ ``POST /api/v2/vedic/chat``
1094
+ """
1095
+ return cast("schemas.VedicChatResponse", self._client.request("POST", "/api/v2/vedic/chat", params=None, json=body, options=options))
1096
+
1097
+ def calculate(
1098
+ self,
1099
+ body: schemas.CalculateRequest,
1100
+ *,
1101
+ options: RequestOptions | None = None,
1102
+ ) -> schemas.CalculateV2Response:
1103
+ """Get Full Vedic Calculate (v2)
1104
+
1105
+ Return a full V2 Vedic chart payload composed from calibrated V2 component engines.
1106
+
1107
+ ``POST /api/v2/vedic/calculate``
1108
+ """
1109
+ return cast("schemas.CalculateV2Response", self._client.request("POST", "/api/v2/vedic/calculate", params=None, json=body, options=options))
1110
+
1111
+ def kp(
1112
+ self,
1113
+ body: schemas.KPChartRequest,
1114
+ *,
1115
+ options: RequestOptions | None = None,
1116
+ ) -> schemas.KPChartResponse:
1117
+ """Get Complete KP Chart (v2)
1118
+
1119
+ Return a complete Krishnamurti Paddhati calculation contract.
1120
+
1121
+ ``POST /api/v2/vedic/kp``
1122
+ """
1123
+ return cast("schemas.KPChartResponse", self._client.request("POST", "/api/v2/vedic/kp", params=None, json=body, options=options))
1124
+
1125
+ def kp_render(
1126
+ self,
1127
+ body: schemas.KPChartRenderRequest,
1128
+ *,
1129
+ options: RequestOptions | None = None,
1130
+ ) -> str:
1131
+ """Render KP Chart and Tables (v2)
1132
+
1133
+ Render the same complete KP calculation as an accessible SVG or PNG.
1134
+
1135
+ ``POST /api/v2/vedic/kp/render``
1136
+
1137
+ Returns the image body as text; use ``request_raw`` for binary formats such as PNG.
1138
+ """
1139
+ return cast("str", self._client.request("POST", "/api/v2/vedic/kp/render", params=None, json=body, options=options))
1140
+
1141
+ def chart(
1142
+ self,
1143
+ body: schemas.ChartRequest,
1144
+ *,
1145
+ options: RequestOptions | None = None,
1146
+ ) -> schemas.ChartV2Response:
1147
+ """Get Vedic Chart (v2)
1148
+
1149
+ Return a clean V2 D1 chart payload built from the shared sidereal chart engine.
1150
+
1151
+ ``POST /api/v2/vedic/chart``
1152
+ """
1153
+ return cast("schemas.ChartV2Response", self._client.request("POST", "/api/v2/vedic/chart", params=None, json=body, options=options))
1154
+
1155
+ def vargas(
1156
+ self,
1157
+ body: schemas.VargasRequest,
1158
+ *,
1159
+ options: RequestOptions | None = None,
1160
+ ) -> schemas.VargasV2Response:
1161
+ """Get Vedic Vargas (v2)
1162
+
1163
+ Return V2 divisional chart rows and whole-sign divisional layouts.
1164
+
1165
+ ``POST /api/v2/vedic/vargas``
1166
+ """
1167
+ return cast("schemas.VargasV2Response", self._client.request("POST", "/api/v2/vedic/vargas", params=None, json=body, options=options))
1168
+
1169
+ def dasha(
1170
+ self,
1171
+ body: schemas.DashaRequestV2,
1172
+ *,
1173
+ options: RequestOptions | None = None,
1174
+ ) -> schemas.DashaV2Response:
1175
+ """Get Vimshottari Dasha (v2)
1176
+
1177
+ Return a V2 Vimshottari Dasha contract with birth balance, active stack, and timeline.
1178
+
1179
+ ``POST /api/v2/vedic/dasha``
1180
+ """
1181
+ return cast("schemas.DashaV2Response", self._client.request("POST", "/api/v2/vedic/dasha", params=None, json=body, options=options))
1182
+
1183
+ def dasha_insights(
1184
+ self,
1185
+ body: schemas.DashaRequestV2,
1186
+ *,
1187
+ options: RequestOptions | None = None,
1188
+ ) -> schemas.VedicDashaInsightsResponse:
1189
+ """Get Vimshottari Dasha Insights (v2)
1190
+
1191
+ Return ranked dasha insight facts derived from the calibrated V2 Vimshottari timeline.
1192
+
1193
+ ``POST /api/v2/vedic/dasha/insights``
1194
+ """
1195
+ return cast("schemas.VedicDashaInsightsResponse", self._client.request("POST", "/api/v2/vedic/dasha/insights", params=None, json=body, options=options))
1196
+
1197
+ def yogas(
1198
+ self,
1199
+ body: schemas.BaseChartRequestV2,
1200
+ *,
1201
+ options: RequestOptions | None = None,
1202
+ ) -> schemas.YogasV2Response:
1203
+ """Get Vedic Yogas (v2)
1204
+
1205
+ Evaluate a classical V2 yoga catalog and return active and inactive results with evidence.
1206
+
1207
+ ``POST /api/v2/vedic/yogas``
1208
+ """
1209
+ return cast("schemas.YogasV2Response", self._client.request("POST", "/api/v2/vedic/yogas", params=None, json=body, options=options))
1210
+
1211
+ def strength(
1212
+ self,
1213
+ body: schemas.BaseChartRequestV2,
1214
+ *,
1215
+ options: RequestOptions | None = None,
1216
+ ) -> schemas.StrengthV2Response:
1217
+ """Get Vedic Strength (v2)
1218
+
1219
+ Return V2 strength data with classical Shadbala and classical Ashtakavarga.
1220
+
1221
+ ``POST /api/v2/vedic/strength``
1222
+ """
1223
+ return cast("schemas.StrengthV2Response", self._client.request("POST", "/api/v2/vedic/strength", params=None, json=body, options=options))
1224
+
1225
+ def compatibility(
1226
+ self,
1227
+ body: schemas.CompatibilityV2Request,
1228
+ *,
1229
+ options: RequestOptions | None = None,
1230
+ ) -> schemas.CompatibilityV2Response:
1231
+ """Get Vedic Compatibility (v2)
1232
+
1233
+ Return an AstroSage-style V2 Ashtakoota compatibility payload.
1234
+
1235
+ ``POST /api/v2/vedic/compatibility``
1236
+ """
1237
+ return cast("schemas.CompatibilityV2Response", self._client.request("POST", "/api/v2/vedic/compatibility", params=None, json=body, options=options))
1238
+
1239
+ def match(
1240
+ self,
1241
+ body: schemas.MatchV2Request,
1242
+ *,
1243
+ options: RequestOptions | None = None,
1244
+ ) -> schemas.CompatibilityV2Response:
1245
+ """Get Vedic Match by Birth Details (v2)
1246
+
1247
+ Return the calibrated V2 compatibility payload from two birth charts.
1248
+
1249
+ ``POST /api/v2/vedic/match``
1250
+ """
1251
+ return cast("schemas.CompatibilityV2Response", self._client.request("POST", "/api/v2/vedic/match", params=None, json=body, options=options))
1252
+
1253
+ def panchang(
1254
+ self,
1255
+ body: schemas.PanchangRequestV2,
1256
+ *,
1257
+ options: RequestOptions | None = None,
1258
+ ) -> schemas.PanchangV2Response:
1259
+ """Get Panchang (v2)
1260
+
1261
+ Return a sunrise-based daily Panchang with transition times calibrated toward
1262
+ AstroSage's public daily Panchang presentation.
1263
+
1264
+ ``POST /api/v2/vedic/panchang``
1265
+ """
1266
+ return cast("schemas.PanchangV2Response", self._client.request("POST", "/api/v2/vedic/panchang", params=None, json=body, options=options))
1267
+
1268
+ def qa(
1269
+ self,
1270
+ body: schemas.VedicQARequest,
1271
+ *,
1272
+ options: RequestOptions | None = None,
1273
+ ) -> schemas.VedicQAResponse:
1274
+ """Answer Vedic question (v2)
1275
+
1276
+ Answer a constrained Vedic question with structured calculation evidence.
1277
+
1278
+ ``POST /api/v2/vedic/qa``
1279
+ """
1280
+ return cast("schemas.VedicQAResponse", self._client.request("POST", "/api/v2/vedic/qa", params=None, json=body, options=options))
1281
+
1282
+
1283
+ class WesternSolarResource:
1284
+ def __init__(self, client: FreeAstro) -> None:
1285
+ self._client = client
1286
+
1287
+ def calculate(
1288
+ self,
1289
+ body: schemas.SolarReturnRequest,
1290
+ *,
1291
+ options: RequestOptions | None = None,
1292
+ ) -> schemas.SolarReturnResponse:
1293
+ """Get Solar Return
1294
+
1295
+ Computes purely deterministic Solar Return chart against the Natal chart.
1296
+ Returns structurally identical core chart blocks (planets, aspects) as
1297
+ well as exact cross-aspects and angularity, without scoring or archetype models.
1298
+
1299
+ ``POST /api/v1/western/solar/calculate``
1300
+ """
1301
+ return cast("schemas.SolarReturnResponse", self._client.request("POST", "/api/v1/western/solar/calculate", params=None, json=body, options=options))
1302
+
1303
+
1304
+ class WesternReturnsResource:
1305
+ def __init__(self, client: FreeAstro) -> None:
1306
+ self._client = client
1307
+
1308
+ def calculate(
1309
+ self,
1310
+ body: schemas.PlanetReturnRequest,
1311
+ *,
1312
+ options: RequestOptions | None = None,
1313
+ ) -> schemas.PlanetReturnResponse:
1314
+ """Get Planet Return
1315
+
1316
+ Computes a deterministic planetary return chart against the natal chart.
1317
+ The return target is selected by body plus a date anchor and selection mode.
1318
+
1319
+ ``POST /api/v1/western/returns/calculate``
1320
+ """
1321
+ return cast("schemas.PlanetReturnResponse", self._client.request("POST", "/api/v1/western/returns/calculate", params=None, json=body, options=options))
1322
+
1323
+
1324
+ class WesternAstrocartographyResource:
1325
+ def __init__(self, client: FreeAstro) -> None:
1326
+ self._client = client
1327
+
1328
+ def lines(
1329
+ self,
1330
+ body: schemas.AstrocartographyLinesRequest,
1331
+ *,
1332
+ options: RequestOptions | None = None,
1333
+ ) -> dict[str, Any]:
1334
+ """Get Astrocartography Lines
1335
+
1336
+ Compute astrocartography map lines for a natal chart.
1337
+
1338
+ ``POST /api/v1/western/astrocartography/lines``
1339
+ """
1340
+ return cast("dict[str, Any]", self._client.request("POST", "/api/v1/western/astrocartography/lines", params=None, json=body, options=options))
1341
+
1342
+ def recommendations(
1343
+ self,
1344
+ body: schemas.AstrocartographyRecommendationsRequest,
1345
+ *,
1346
+ options: RequestOptions | None = None,
1347
+ ) -> dict[str, Any]:
1348
+ """Get Astrocartography Recommendations
1349
+
1350
+ Rank candidate cities for a focus-oriented astrocartography search.
1351
+
1352
+ ``POST /api/v1/western/astrocartography/recommendations``
1353
+ """
1354
+ return cast("dict[str, Any]", self._client.request("POST", "/api/v1/western/astrocartography/recommendations", params=None, json=body, options=options))
1355
+
1356
+ def parans(
1357
+ self,
1358
+ body: schemas.AstrocartographyParansRequest,
1359
+ *,
1360
+ options: RequestOptions | None = None,
1361
+ ) -> dict[str, Any]:
1362
+ """Get Astrocartography Parans
1363
+
1364
+ Compute classical in-mundo astrocartography parans for a natal chart.
1365
+
1366
+ ``POST /api/v1/western/astrocartography/parans``
1367
+ """
1368
+ return cast("dict[str, Any]", self._client.request("POST", "/api/v1/western/astrocartography/parans", params=None, json=body, options=options))
1369
+
1370
+ def relocation(
1371
+ self,
1372
+ body: schemas.AstrocartographyRelocationRequest,
1373
+ *,
1374
+ options: RequestOptions | None = None,
1375
+ ) -> dict[str, Any]:
1376
+ """Get Astrocartography Relocation
1377
+
1378
+ Build a full relocated chart for the natal instant at a target city.
1379
+
1380
+ ``POST /api/v1/western/astrocartography/relocation``
1381
+ """
1382
+ return cast("dict[str, Any]", self._client.request("POST", "/api/v1/western/astrocartography/relocation", params=None, json=body, options=options))
1383
+
1384
+ def city_check(
1385
+ self,
1386
+ body: schemas.AstrocartographyCityCheckRequest,
1387
+ *,
1388
+ options: RequestOptions | None = None,
1389
+ ) -> dict[str, Any]:
1390
+ """Get Astrocartography City Check
1391
+
1392
+ Score a single city across the five primary relocation-oriented focus areas.
1393
+
1394
+ ``POST /api/v1/western/astrocartography/city-check``
1395
+ """
1396
+ return cast("dict[str, Any]", self._client.request("POST", "/api/v1/western/astrocartography/city-check", params=None, json=body, options=options))
1397
+
1398
+
1399
+ class WesternNatalResource:
1400
+ def __init__(self, client: FreeAstro) -> None:
1401
+ self._client = client
1402
+
1403
+ def insights(
1404
+ self,
1405
+ body: schemas.NatalInsightsRequest,
1406
+ *,
1407
+ options: RequestOptions | None = None,
1408
+ ) -> schemas.NatalInsightsResponse:
1409
+ """Get Natal Insights
1410
+
1411
+ Return machine-readable natal insight facts, with optional canonical grouping and French display text.
1412
+
1413
+ ``POST /api/v1/western/natal/insights``
1414
+ """
1415
+ return cast("schemas.NatalInsightsResponse", self._client.request("POST", "/api/v1/western/natal/insights", params=None, json=body, options=options))
1416
+
1417
+ def insights_index_documents(
1418
+ self,
1419
+ body: schemas.NatalInsightsRequest,
1420
+ *,
1421
+ options: RequestOptions | None = None,
1422
+ ) -> schemas.NatalInsightsIndexDocumentsResponse:
1423
+ """Get Natal Insight Index Documents
1424
+
1425
+ Return one denormalized search document per natal insight fact for external indexing systems.
1426
+
1427
+ ``POST /api/v1/western/natal/insights/index-documents``
1428
+ """
1429
+ return cast("schemas.NatalInsightsIndexDocumentsResponse", self._client.request("POST", "/api/v1/western/natal/insights/index-documents", params=None, json=body, options=options))
1430
+
1431
+
1432
+ class WesternTransitsResource:
1433
+ def __init__(self, client: FreeAstro) -> None:
1434
+ self._client = client
1435
+
1436
+ def insights(
1437
+ self,
1438
+ body: schemas.TransitTimelineRequest,
1439
+ *,
1440
+ options: RequestOptions | None = None,
1441
+ ) -> schemas.TransitInsightsResponse:
1442
+ """Get Transit Insights
1443
+
1444
+ Compute derived transit insight windows from the transit timeline engine.
1445
+
1446
+ ``POST /api/v1/western/transits/insights``
1447
+ """
1448
+ return cast("schemas.TransitInsightsResponse", self._client.request("POST", "/api/v1/western/transits/insights", params=None, json=body, options=options))
1449
+
1450
+ def timeline(
1451
+ self,
1452
+ body: schemas.TransitTimelineRequest,
1453
+ *,
1454
+ options: RequestOptions | None = None,
1455
+ ) -> schemas.TransitTimelineResponse:
1456
+ """Get Transits Timeline
1457
+
1458
+ Compute transit-to-natal interval passes across a date range for calendar and timeline rendering.
1459
+
1460
+ ``POST /api/v1/western/transits/timeline``
1461
+ """
1462
+ return cast("schemas.TransitTimelineResponse", self._client.request("POST", "/api/v1/western/transits/timeline", params=None, json=body, options=options))
1463
+
1464
+ def timeline_index_documents(
1465
+ self,
1466
+ body: schemas.TransitTimelineRequest,
1467
+ *,
1468
+ options: RequestOptions | None = None,
1469
+ ) -> schemas.TransitTimelineIndexDocumentsResponse:
1470
+ """Get Transits Timeline Index Documents
1471
+
1472
+ Compute timeline passes and return one denormalized search document per pass.
1473
+
1474
+ ``POST /api/v1/western/transits/timeline/index-documents``
1475
+ """
1476
+ return cast("schemas.TransitTimelineIndexDocumentsResponse", self._client.request("POST", "/api/v1/western/transits/timeline/index-documents", params=None, json=body, options=options))
1477
+
1478
+ def search(
1479
+ self,
1480
+ body: schemas.TransitSearchRequest,
1481
+ *,
1482
+ options: RequestOptions | None = None,
1483
+ ) -> schemas.TransitSearchResponse:
1484
+ """Search Transits
1485
+
1486
+ Search a long-range date or age window for all passes of one transit planet against one natal point.
1487
+
1488
+ ``POST /api/v1/western/transits/search``
1489
+ """
1490
+ return cast("schemas.TransitSearchResponse", self._client.request("POST", "/api/v1/western/transits/search", params=None, json=body, options=options))
1491
+
1492
+
1493
+ class WesternProfectionsResource:
1494
+ def __init__(self, client: FreeAstro) -> None:
1495
+ self._client = client
1496
+
1497
+ def annual(
1498
+ self,
1499
+ body: schemas.AnnualProfectionRequest,
1500
+ *,
1501
+ include: list[str] | None = None,
1502
+ options: RequestOptions | None = None,
1503
+ ) -> schemas.AnnualProfectionResponse:
1504
+ """Get Annual Profections
1505
+
1506
+ Annual profections endpoint with a solar-return-style envelope and a timing-oriented body.
1507
+
1508
+ ``POST /api/v1/western/profections/annual``
1509
+ """
1510
+ return cast("schemas.AnnualProfectionResponse", self._client.request("POST", "/api/v1/western/profections/annual", params=_query({"include": include}), json=body, options=options))
1511
+
1512
+
1513
+ class WesternProgressionsResource:
1514
+ def __init__(self, client: FreeAstro) -> None:
1515
+ self._client = client
1516
+
1517
+ def secondary(
1518
+ self,
1519
+ body: schemas.SecondaryProgressionsRequest,
1520
+ *,
1521
+ include: list[str] | None = None,
1522
+ response_mode: Literal["full", "table"] | None = None,
1523
+ options: RequestOptions | None = None,
1524
+ ) -> schemas.SecondaryProgressionsResponse | schemas.ProgressionTableResponse:
1525
+ """Get Secondary Progressions
1526
+
1527
+ Compute a secondary progressed chart using the classic symbolic timing rule:
1528
+ 1 day after birth = 1 year of life.
1529
+
1530
+ ``POST /api/v1/western/progressions/secondary``
1531
+ """
1532
+ return cast("schemas.SecondaryProgressionsResponse | schemas.ProgressionTableResponse", self._client.request("POST", "/api/v1/western/progressions/secondary", params=_query({"include": include, "response_mode": response_mode}), json=body, options=options))
1533
+
1534
+ def converse_secondary(
1535
+ self,
1536
+ body: schemas.ConverseSecondaryProgressionsRequest,
1537
+ *,
1538
+ response_mode: Literal["full", "table"] | None = None,
1539
+ options: RequestOptions | None = None,
1540
+ ) -> schemas.ProgressionChartResponse | schemas.ProgressionTableResponse:
1541
+ """Get Converse Secondary Progressions
1542
+
1543
+ ``POST /api/v1/western/progressions/converse-secondary``
1544
+ """
1545
+ return cast("schemas.ProgressionChartResponse | schemas.ProgressionTableResponse", self._client.request("POST", "/api/v1/western/progressions/converse-secondary", params=_query({"response_mode": response_mode}), json=body, options=options))
1546
+
1547
+ def tertiary(
1548
+ self,
1549
+ body: schemas.TertiaryProgressionsRequest,
1550
+ *,
1551
+ response_mode: Literal["full", "table"] | None = None,
1552
+ options: RequestOptions | None = None,
1553
+ ) -> schemas.ProgressionChartResponse | schemas.ProgressionTableResponse:
1554
+ """Get Tertiary Progressions
1555
+
1556
+ ``POST /api/v1/western/progressions/tertiary``
1557
+ """
1558
+ return cast("schemas.ProgressionChartResponse | schemas.ProgressionTableResponse", self._client.request("POST", "/api/v1/western/progressions/tertiary", params=_query({"response_mode": response_mode}), json=body, options=options))
1559
+
1560
+ def quotidian(
1561
+ self,
1562
+ body: schemas.QuotidianProgressionsRequest,
1563
+ *,
1564
+ response_mode: Literal["full", "table"] | None = None,
1565
+ options: RequestOptions | None = None,
1566
+ ) -> schemas.ProgressionChartResponse | schemas.ProgressionTableResponse:
1567
+ """Get Quotidian Progressions
1568
+
1569
+ ``POST /api/v1/western/progressions/quotidian``
1570
+ """
1571
+ return cast("schemas.ProgressionChartResponse | schemas.ProgressionTableResponse", self._client.request("POST", "/api/v1/western/progressions/quotidian", params=_query({"response_mode": response_mode}), json=body, options=options))
1572
+
1573
+ def quaternary(
1574
+ self,
1575
+ body: schemas.QuaternaryProgressionsRequest,
1576
+ *,
1577
+ response_mode: Literal["full", "table"] | None = None,
1578
+ options: RequestOptions | None = None,
1579
+ ) -> schemas.ProgressionChartResponse | schemas.ProgressionTableResponse:
1580
+ """Get Quaternary Progressions
1581
+
1582
+ ``POST /api/v1/western/progressions/quaternary``
1583
+ """
1584
+ return cast("schemas.ProgressionChartResponse | schemas.ProgressionTableResponse", self._client.request("POST", "/api/v1/western/progressions/quaternary", params=_query({"response_mode": response_mode}), json=body, options=options))
1585
+
1586
+ def secondary_exact_ingresses(
1587
+ self,
1588
+ body: schemas.ExactIngressSearchRequest,
1589
+ *,
1590
+ options: RequestOptions | None = None,
1591
+ ) -> schemas.ExactIngressSearchResponse:
1592
+ """Search Secondary Exact Ingresses
1593
+
1594
+ ``POST /api/v1/western/progressions/secondary/exact-ingresses``
1595
+ """
1596
+ return cast("schemas.ExactIngressSearchResponse", self._client.request("POST", "/api/v1/western/progressions/secondary/exact-ingresses", params=None, json=body, options=options))
1597
+
1598
+ def converse_secondary_exact_ingresses(
1599
+ self,
1600
+ body: schemas.ExactIngressSearchRequest,
1601
+ *,
1602
+ options: RequestOptions | None = None,
1603
+ ) -> schemas.ExactIngressSearchResponse:
1604
+ """Search Converse Secondary Exact Ingresses
1605
+
1606
+ ``POST /api/v1/western/progressions/converse-secondary/exact-ingresses``
1607
+ """
1608
+ return cast("schemas.ExactIngressSearchResponse", self._client.request("POST", "/api/v1/western/progressions/converse-secondary/exact-ingresses", params=None, json=body, options=options))
1609
+
1610
+ def tertiary_exact_ingresses(
1611
+ self,
1612
+ body: schemas.ExactIngressSearchRequest,
1613
+ *,
1614
+ options: RequestOptions | None = None,
1615
+ ) -> schemas.ExactIngressSearchResponse:
1616
+ """Search Tertiary Exact Ingresses
1617
+
1618
+ ``POST /api/v1/western/progressions/tertiary/exact-ingresses``
1619
+ """
1620
+ return cast("schemas.ExactIngressSearchResponse", self._client.request("POST", "/api/v1/western/progressions/tertiary/exact-ingresses", params=None, json=body, options=options))
1621
+
1622
+ def quotidian_exact_ingresses(
1623
+ self,
1624
+ body: schemas.ExactIngressSearchRequest,
1625
+ *,
1626
+ options: RequestOptions | None = None,
1627
+ ) -> schemas.ExactIngressSearchResponse:
1628
+ """Search Quotidian Exact Ingresses
1629
+
1630
+ ``POST /api/v1/western/progressions/quotidian/exact-ingresses``
1631
+ """
1632
+ return cast("schemas.ExactIngressSearchResponse", self._client.request("POST", "/api/v1/western/progressions/quotidian/exact-ingresses", params=None, json=body, options=options))
1633
+
1634
+ def quaternary_exact_ingresses(
1635
+ self,
1636
+ body: schemas.ExactIngressSearchRequest,
1637
+ *,
1638
+ options: RequestOptions | None = None,
1639
+ ) -> schemas.ExactIngressSearchResponse:
1640
+ """Search Quaternary Exact Ingresses
1641
+
1642
+ ``POST /api/v1/western/progressions/quaternary/exact-ingresses``
1643
+ """
1644
+ return cast("schemas.ExactIngressSearchResponse", self._client.request("POST", "/api/v1/western/progressions/quaternary/exact-ingresses", params=None, json=body, options=options))
1645
+
1646
+ def secondary_exact_aspects(
1647
+ self,
1648
+ body: schemas.ExactAspectSearchRequest,
1649
+ *,
1650
+ options: RequestOptions | None = None,
1651
+ ) -> schemas.ExactAspectSearchResponse:
1652
+ """Search Secondary Exact Aspects
1653
+
1654
+ ``POST /api/v1/western/progressions/secondary/exact-aspects``
1655
+ """
1656
+ return cast("schemas.ExactAspectSearchResponse", self._client.request("POST", "/api/v1/western/progressions/secondary/exact-aspects", params=None, json=body, options=options))
1657
+
1658
+ def converse_secondary_exact_aspects(
1659
+ self,
1660
+ body: schemas.ExactAspectSearchRequest,
1661
+ *,
1662
+ options: RequestOptions | None = None,
1663
+ ) -> schemas.ExactAspectSearchResponse:
1664
+ """Search Converse Secondary Exact Aspects
1665
+
1666
+ ``POST /api/v1/western/progressions/converse-secondary/exact-aspects``
1667
+ """
1668
+ return cast("schemas.ExactAspectSearchResponse", self._client.request("POST", "/api/v1/western/progressions/converse-secondary/exact-aspects", params=None, json=body, options=options))
1669
+
1670
+ def tertiary_exact_aspects(
1671
+ self,
1672
+ body: schemas.ExactAspectSearchRequest,
1673
+ *,
1674
+ options: RequestOptions | None = None,
1675
+ ) -> schemas.ExactAspectSearchResponse:
1676
+ """Search Tertiary Exact Aspects
1677
+
1678
+ ``POST /api/v1/western/progressions/tertiary/exact-aspects``
1679
+ """
1680
+ return cast("schemas.ExactAspectSearchResponse", self._client.request("POST", "/api/v1/western/progressions/tertiary/exact-aspects", params=None, json=body, options=options))
1681
+
1682
+ def quotidian_exact_aspects(
1683
+ self,
1684
+ body: schemas.ExactAspectSearchRequest,
1685
+ *,
1686
+ options: RequestOptions | None = None,
1687
+ ) -> schemas.ExactAspectSearchResponse:
1688
+ """Search Quotidian Exact Aspects
1689
+
1690
+ ``POST /api/v1/western/progressions/quotidian/exact-aspects``
1691
+ """
1692
+ return cast("schemas.ExactAspectSearchResponse", self._client.request("POST", "/api/v1/western/progressions/quotidian/exact-aspects", params=None, json=body, options=options))
1693
+
1694
+ def quaternary_exact_aspects(
1695
+ self,
1696
+ body: schemas.ExactAspectSearchRequest,
1697
+ *,
1698
+ options: RequestOptions | None = None,
1699
+ ) -> schemas.ExactAspectSearchResponse:
1700
+ """Search Quaternary Exact Aspects
1701
+
1702
+ ``POST /api/v1/western/progressions/quaternary/exact-aspects``
1703
+ """
1704
+ return cast("schemas.ExactAspectSearchResponse", self._client.request("POST", "/api/v1/western/progressions/quaternary/exact-aspects", params=None, json=body, options=options))
1705
+
1706
+ def secondary_calendar(
1707
+ self,
1708
+ body: schemas.ProgressionCalendarRequest,
1709
+ *,
1710
+ options: RequestOptions | None = None,
1711
+ ) -> schemas.ProgressionCalendarResponse:
1712
+ """Get Secondary Progressions Calendar
1713
+
1714
+ ``POST /api/v1/western/progressions/secondary/calendar``
1715
+ """
1716
+ return cast("schemas.ProgressionCalendarResponse", self._client.request("POST", "/api/v1/western/progressions/secondary/calendar", params=None, json=body, options=options))
1717
+
1718
+ def converse_secondary_calendar(
1719
+ self,
1720
+ body: schemas.ProgressionCalendarRequest,
1721
+ *,
1722
+ options: RequestOptions | None = None,
1723
+ ) -> schemas.ProgressionCalendarResponse:
1724
+ """Get Converse Secondary Progressions Calendar
1725
+
1726
+ ``POST /api/v1/western/progressions/converse-secondary/calendar``
1727
+ """
1728
+ return cast("schemas.ProgressionCalendarResponse", self._client.request("POST", "/api/v1/western/progressions/converse-secondary/calendar", params=None, json=body, options=options))
1729
+
1730
+ def tertiary_calendar(
1731
+ self,
1732
+ body: schemas.ProgressionCalendarRequest,
1733
+ *,
1734
+ options: RequestOptions | None = None,
1735
+ ) -> schemas.ProgressionCalendarResponse:
1736
+ """Get Tertiary Progressions Calendar
1737
+
1738
+ ``POST /api/v1/western/progressions/tertiary/calendar``
1739
+ """
1740
+ return cast("schemas.ProgressionCalendarResponse", self._client.request("POST", "/api/v1/western/progressions/tertiary/calendar", params=None, json=body, options=options))
1741
+
1742
+ def quotidian_calendar(
1743
+ self,
1744
+ body: schemas.ProgressionCalendarRequest,
1745
+ *,
1746
+ options: RequestOptions | None = None,
1747
+ ) -> schemas.ProgressionCalendarResponse:
1748
+ """Get Quotidian Progressions Calendar
1749
+
1750
+ ``POST /api/v1/western/progressions/quotidian/calendar``
1751
+ """
1752
+ return cast("schemas.ProgressionCalendarResponse", self._client.request("POST", "/api/v1/western/progressions/quotidian/calendar", params=None, json=body, options=options))
1753
+
1754
+ def quaternary_calendar(
1755
+ self,
1756
+ body: schemas.ProgressionCalendarRequest,
1757
+ *,
1758
+ options: RequestOptions | None = None,
1759
+ ) -> schemas.ProgressionCalendarResponse:
1760
+ """Get Quaternary Progressions Calendar
1761
+
1762
+ ``POST /api/v1/western/progressions/quaternary/calendar``
1763
+ """
1764
+ return cast("schemas.ProgressionCalendarResponse", self._client.request("POST", "/api/v1/western/progressions/quaternary/calendar", params=None, json=body, options=options))
1765
+
1766
+
1767
+ class WesternDirectionsResource:
1768
+ def __init__(self, client: FreeAstro) -> None:
1769
+ self._client = client
1770
+
1771
+ def primary(
1772
+ self,
1773
+ body: schemas.PrimaryDirectionsRequest,
1774
+ *,
1775
+ options: RequestOptions | None = None,
1776
+ ) -> schemas.PrimaryDirectionsResponse:
1777
+ """Get Primary Directions
1778
+
1779
+ Compute primary directions for a natal chart over a date range.
1780
+
1781
+ ``POST /api/v1/western/directions/primary``
1782
+ """
1783
+ return cast("schemas.PrimaryDirectionsResponse", self._client.request("POST", "/api/v1/western/directions/primary", params=None, json=body, options=options))
1784
+
1785
+ def primary_exact_aspects(
1786
+ self,
1787
+ body: schemas.PrimaryDirectionsRequest,
1788
+ *,
1789
+ options: RequestOptions | None = None,
1790
+ ) -> schemas.PrimaryDirectionsResponse:
1791
+ """Get Primary Directions Exact Aspects
1792
+
1793
+ ``POST /api/v1/western/directions/primary/exact-aspects``
1794
+ """
1795
+ return cast("schemas.PrimaryDirectionsResponse", self._client.request("POST", "/api/v1/western/directions/primary/exact-aspects", params=None, json=body, options=options))
1796
+
1797
+ def primary_search(
1798
+ self,
1799
+ body: schemas.PrimaryDirectionsRequest,
1800
+ *,
1801
+ options: RequestOptions | None = None,
1802
+ ) -> schemas.PrimaryDirectionsResponse:
1803
+ """Search Primary Directions
1804
+
1805
+ ``POST /api/v1/western/directions/primary/search``
1806
+ """
1807
+ return cast("schemas.PrimaryDirectionsResponse", self._client.request("POST", "/api/v1/western/directions/primary/search", params=None, json=body, options=options))
1808
+
1809
+ def primary_calendar(
1810
+ self,
1811
+ body: schemas.PrimaryDirectionsRequest,
1812
+ *,
1813
+ options: RequestOptions | None = None,
1814
+ ) -> schemas.PrimaryDirectionsCalendarResponse:
1815
+ """Get Primary Directions Calendar
1816
+
1817
+ ``POST /api/v1/western/directions/primary/calendar``
1818
+ """
1819
+ return cast("schemas.PrimaryDirectionsCalendarResponse", self._client.request("POST", "/api/v1/western/directions/primary/calendar", params=None, json=body, options=options))
1820
+
1821
+
1822
+ class WesternChartSimilarityResource:
1823
+ def __init__(self, client: FreeAstro) -> None:
1824
+ self._client = client
1825
+
1826
+ def famous_people(
1827
+ self,
1828
+ body: schemas.FamousPeopleChartSimilarityRequest,
1829
+ *,
1830
+ options: RequestOptions | None = None,
1831
+ ) -> schemas.ChartSimilarityResponse:
1832
+ """Compare Famous People Chart Similarity
1833
+
1834
+ ``POST /api/v2/western/chart-similarity/famous-people``
1835
+ """
1836
+ return cast("schemas.ChartSimilarityResponse", self._client.request("POST", "/api/v2/western/chart-similarity/famous-people", params=None, json=body, options=options))
1837
+
1838
+
1839
+ class WesternElectionalResource:
1840
+ def __init__(self, client: FreeAstro) -> None:
1841
+ self._client = client
1842
+
1843
+ def wedding_search(
1844
+ self,
1845
+ body: schemas.WeddingElectionSearchRequest,
1846
+ *,
1847
+ options: RequestOptions | None = None,
1848
+ ) -> schemas.WeddingElectionSearchResponse:
1849
+ """Search Wedding Elections
1850
+
1851
+ ``POST /api/v2/western/electional/wedding/search``
1852
+ """
1853
+ return cast("schemas.WeddingElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/wedding/search", params=None, json=body, options=options))
1854
+
1855
+ def making_contracts_search(
1856
+ self,
1857
+ body: schemas.MakingContractsElectionSearchRequest,
1858
+ *,
1859
+ options: RequestOptions | None = None,
1860
+ ) -> schemas.MakingContractsElectionSearchResponse:
1861
+ """Search Making Contracts Elections
1862
+
1863
+ ``POST /api/v2/western/electional/making-contracts/search``
1864
+ """
1865
+ return cast("schemas.MakingContractsElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/making-contracts/search", params=None, json=body, options=options))
1866
+
1867
+ def job_audition_search(
1868
+ self,
1869
+ body: schemas.JobAuditionElectionSearchRequest,
1870
+ *,
1871
+ options: RequestOptions | None = None,
1872
+ ) -> schemas.JobAuditionElectionSearchResponse:
1873
+ """Search Job Audition Elections
1874
+
1875
+ ``POST /api/v2/western/electional/job-audition/search``
1876
+ """
1877
+ return cast("schemas.JobAuditionElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/job-audition/search", params=None, json=body, options=options))
1878
+
1879
+ def purchase_property_search(
1880
+ self,
1881
+ body: schemas.PurchasePropertyElectionSearchRequest,
1882
+ *,
1883
+ options: RequestOptions | None = None,
1884
+ ) -> schemas.PurchasePropertyElectionSearchResponse:
1885
+ """Search Purchase Property Elections
1886
+
1887
+ ``POST /api/v2/western/electional/purchase-property/search``
1888
+ """
1889
+ return cast("schemas.PurchasePropertyElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/purchase-property/search", params=None, json=body, options=options))
1890
+
1891
+ def purchase_car_search(
1892
+ self,
1893
+ body: schemas.PurchaseCarElectionSearchRequest,
1894
+ *,
1895
+ options: RequestOptions | None = None,
1896
+ ) -> schemas.PurchaseCarElectionSearchResponse:
1897
+ """Search Purchase Car Elections
1898
+
1899
+ ``POST /api/v2/western/electional/purchase-car/search``
1900
+ """
1901
+ return cast("schemas.PurchaseCarElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/purchase-car/search", params=None, json=body, options=options))
1902
+
1903
+ def move_into_new_home_search(
1904
+ self,
1905
+ body: schemas.MoveIntoNewHomeElectionSearchRequest,
1906
+ *,
1907
+ options: RequestOptions | None = None,
1908
+ ) -> schemas.MoveIntoNewHomeElectionSearchResponse:
1909
+ """Search Move Into New Home Elections
1910
+
1911
+ ``POST /api/v2/western/electional/move-into-new-home/search``
1912
+ """
1913
+ return cast("schemas.MoveIntoNewHomeElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/move-into-new-home/search", params=None, json=body, options=options))
1914
+
1915
+ def starting_journey_search(
1916
+ self,
1917
+ body: schemas.StartingJourneyElectionSearchRequest,
1918
+ *,
1919
+ options: RequestOptions | None = None,
1920
+ ) -> schemas.StartingJourneyElectionSearchResponse:
1921
+ """Search Starting Journey Elections
1922
+
1923
+ ``POST /api/v2/western/electional/starting-journey/search``
1924
+ """
1925
+ return cast("schemas.StartingJourneyElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/starting-journey/search", params=None, json=body, options=options))
1926
+
1927
+ def legal_proceedings_search(
1928
+ self,
1929
+ body: schemas.LegalProceedingsElectionSearchRequest,
1930
+ *,
1931
+ options: RequestOptions | None = None,
1932
+ ) -> schemas.LegalProceedingsElectionSearchResponse:
1933
+ """Search Legal Proceedings Elections
1934
+
1935
+ ``POST /api/v2/western/electional/legal-proceedings/search``
1936
+ """
1937
+ return cast("schemas.LegalProceedingsElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/legal-proceedings/search", params=None, json=body, options=options))
1938
+
1939
+ def physical_examination_search(
1940
+ self,
1941
+ body: schemas.PhysicalExaminationElectionSearchRequest,
1942
+ *,
1943
+ options: RequestOptions | None = None,
1944
+ ) -> schemas.PhysicalExaminationElectionSearchResponse:
1945
+ """Search Physical Examination Elections
1946
+
1947
+ ``POST /api/v2/western/electional/physical-examination/search``
1948
+ """
1949
+ return cast("schemas.PhysicalExaminationElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/physical-examination/search", params=None, json=body, options=options))
1950
+
1951
+ def invest_money_search(
1952
+ self,
1953
+ body: schemas.InvestMoneyElectionSearchRequest,
1954
+ *,
1955
+ options: RequestOptions | None = None,
1956
+ ) -> schemas.InvestMoneyElectionSearchResponse:
1957
+ """Search Invest Money Elections
1958
+
1959
+ ``POST /api/v2/western/electional/invest-money/search``
1960
+ """
1961
+ return cast("schemas.InvestMoneyElectionSearchResponse", self._client.request("POST", "/api/v2/western/electional/invest-money/search", params=None, json=body, options=options))
1962
+
1963
+
1964
+ class WesternResourceBase:
1965
+ def __init__(self, client: FreeAstro) -> None:
1966
+ self._client = client
1967
+ self.solar = WesternSolarResource(client)
1968
+ self.returns = WesternReturnsResource(client)
1969
+ self.astrocartography = WesternAstrocartographyResource(client)
1970
+ self.natal = WesternNatalResource(client)
1971
+ self.transits = WesternTransitsResource(client)
1972
+ self.profections = WesternProfectionsResource(client)
1973
+ self.progressions = WesternProgressionsResource(client)
1974
+ self.directions = WesternDirectionsResource(client)
1975
+ self.chart_similarity = WesternChartSimilarityResource(client)
1976
+ self.electional = WesternElectionalResource(client)
1977
+
1978
+ def synastry_v1(
1979
+ self,
1980
+ body: schemas.SynastryRequest,
1981
+ *,
1982
+ aspects: bool | None = None,
1983
+ overlays: bool | None = None,
1984
+ scores: bool | None = None,
1985
+ archetypes: bool | None = None,
1986
+ text: bool | None = None,
1987
+ display_point_labels: bool | None = None,
1988
+ display_aspect_labels: bool | None = None,
1989
+ strength_labels: bool | None = None,
1990
+ ranges: bool | None = None,
1991
+ scoring_bucket_definitions: bool | None = None,
1992
+ options: RequestOptions | None = None,
1993
+ ) -> schemas.SynastryResponse:
1994
+ """Get Synastry
1995
+
1996
+ Detailed Western Synastry analysis.
1997
+ Deterministic, data-rich output including aspects, overlays, scoring, and archetypes.
1998
+ Use query parameters to filter the response size.
1999
+
2000
+ ``POST /api/v1/western/synastry``
2001
+ """
2002
+ return cast("schemas.SynastryResponse", self._client.request("POST", "/api/v1/western/synastry", params=_query({"aspects": aspects, "overlays": overlays, "scores": scores, "archetypes": archetypes, "text": text, "display_point_labels": display_point_labels, "display_aspect_labels": display_aspect_labels, "strength_labels": strength_labels, "ranges": ranges, "scoring_bucket_definitions": scoring_bucket_definitions}), json=body, options=options))
2003
+
2004
+ def synastry_simplified(
2005
+ self,
2006
+ body: schemas.SynastryRequest,
2007
+ *,
2008
+ options: RequestOptions | None = None,
2009
+ ) -> schemas.SynastrySimplifiedResponse:
2010
+ """Get Synastry Simplified
2011
+
2012
+ Simplified Synastry analysis.
2013
+ Returns highlights, top aspects, scores, and archetype without full aspect/overlay lists.
2014
+
2015
+ ``POST /api/v1/western/synastry/simplified``
2016
+ """
2017
+ return cast("schemas.SynastrySimplifiedResponse", self._client.request("POST", "/api/v1/western/synastry/simplified", params=None, json=body, options=options))
2018
+
2019
+ def synastry_summary(
2020
+ self,
2021
+ body: schemas.SynastryRequest,
2022
+ *,
2023
+ options: RequestOptions | None = None,
2024
+ ) -> schemas.SynastrySummaryResponse:
2025
+ """Get Synastry Summary
2026
+
2027
+ Simplified summary of the synastry chart for general audiences.
2028
+
2029
+ ``POST /api/v1/western/synastry/summary``
2030
+ """
2031
+ return cast("schemas.SynastrySummaryResponse", self._client.request("POST", "/api/v1/western/synastry/summary", params=None, json=body, options=options))
2032
+
2033
+ def synastrycards_v1(
2034
+ self,
2035
+ body: schemas.SynastryRequest,
2036
+ *,
2037
+ relationship_context: Literal["romantic", "friendship"] | None = None,
2038
+ include_minor_cards: bool | None = None,
2039
+ options: RequestOptions | None = None,
2040
+ ) -> schemas.SynastryCardsResponse:
2041
+ """Get Synastry Cards
2042
+
2043
+ Card-oriented synastry response designed for mobile apps and compatibility features.
2044
+ - Implements a 5-step polarity scoring system (structure + planet-pair + strength)
2045
+ - Fetches rich interpretation blocks from Supabase based on relationship context
2046
+ - Minor aspect cards are excluded by default; opt in with include_minor_cards=true
2047
+ - Returns a summary (archetype, scores, top strengths / challenges + narrative)
2048
+ and up to 15 aspect cards, each with both supportive and challenging blocks.
2049
+
2050
+ ``POST /api/v1/western/synastrycards``
2051
+ """
2052
+ return cast("schemas.SynastryCardsResponse", self._client.request("POST", "/api/v1/western/synastrycards", params=_query({"relationship_context": relationship_context, "include_minor_cards": include_minor_cards}), json=body, options=options))
2053
+
2054
+ def synastry_horoscope_v1(
2055
+ self,
2056
+ body: schemas.CouplesHoroscopeRequest,
2057
+ *,
2058
+ relationship_context: Literal["romantic", "friendship"] | None = None,
2059
+ include_timing: bool | None = None,
2060
+ options: RequestOptions | None = None,
2061
+ ) -> schemas.CouplesHoroscopeResponse:
2062
+ """Get Couples Horoscope
2063
+
2064
+ Daily Couples Horoscope V2.
2065
+ - Multi-dimensional scoring (Romance, Stability, Tension, etc.)
2066
+ - Dual-perspective transits (Composite & Synastry)
2067
+ - Deterministic narrative bands (Theme, Core, Shadow)
2068
+ - Integrated relational rituals
2069
+
2070
+ ``POST /api/v1/western/synastry/horoscope``
2071
+ """
2072
+ return cast("schemas.CouplesHoroscopeResponse", self._client.request("POST", "/api/v1/western/synastry/horoscope", params=_query({"relationship_context": relationship_context, "include_timing": include_timing}), json=body, options=options))
2073
+
2074
+ def chat(
2075
+ self,
2076
+ body: schemas.WesternChatRequest,
2077
+ *,
2078
+ options: RequestOptions | None = None,
2079
+ ) -> schemas.WesternChatResponse:
2080
+ """Hosted Western Astrology Chat (v2)
2081
+
2082
+ Generate a grounded Western astrology answer from the scoped Western MCP tools.
2083
+
2084
+ ``POST /api/v2/western/chat``
2085
+ """
2086
+ return cast("schemas.WesternChatResponse", self._client.request("POST", "/api/v2/western/chat", params=None, json=body, options=options))
2087
+
2088
+ def synastry(
2089
+ self,
2090
+ body: schemas.SynastryRequest,
2091
+ *,
2092
+ aspects: bool | None = None,
2093
+ overlays: bool | None = None,
2094
+ scores: bool | None = None,
2095
+ archetypes: bool | None = None,
2096
+ text: bool | None = None,
2097
+ display_point_labels: bool | None = None,
2098
+ display_aspect_labels: bool | None = None,
2099
+ strength_labels: bool | None = None,
2100
+ ranges: bool | None = None,
2101
+ scoring_bucket_definitions: bool | None = None,
2102
+ options: RequestOptions | None = None,
2103
+ ) -> schemas.SynastryResponse:
2104
+ """Get Synastry V2
2105
+
2106
+ ``POST /api/v2/western/synastry``
2107
+ """
2108
+ return cast("schemas.SynastryResponse", self._client.request("POST", "/api/v2/western/synastry", params=_query({"aspects": aspects, "overlays": overlays, "scores": scores, "archetypes": archetypes, "text": text, "display_point_labels": display_point_labels, "display_aspect_labels": display_aspect_labels, "strength_labels": strength_labels, "ranges": ranges, "scoring_bucket_definitions": scoring_bucket_definitions}), json=body, options=options))
2109
+
2110
+ def synastrycards(
2111
+ self,
2112
+ body: schemas.SynastryRequest,
2113
+ *,
2114
+ relationship_context: Literal["romantic", "friendship"] | None = None,
2115
+ include_minor_cards: bool | None = None,
2116
+ options: RequestOptions | None = None,
2117
+ ) -> schemas.SynastryCardsResponse:
2118
+ """Get Synastry Cards V2
2119
+
2120
+ ``POST /api/v2/western/synastrycards``
2121
+ """
2122
+ return cast("schemas.SynastryCardsResponse", self._client.request("POST", "/api/v2/western/synastrycards", params=_query({"relationship_context": relationship_context, "include_minor_cards": include_minor_cards}), json=body, options=options))
2123
+
2124
+ def synastry_horoscope(
2125
+ self,
2126
+ body: schemas.CouplesHoroscopeV2Request,
2127
+ *,
2128
+ include_timing: bool | None = None,
2129
+ options: RequestOptions | None = None,
2130
+ ) -> schemas.CouplesHoroscopeV2Response:
2131
+ """Get Couples Horoscope V2
2132
+
2133
+ ``POST /api/v2/western/synastry/horoscope``
2134
+ """
2135
+ return cast("schemas.CouplesHoroscopeV2Response", self._client.request("POST", "/api/v2/western/synastry/horoscope", params=_query({"include_timing": include_timing}), json=body, options=options))
2136
+
2137
+
2138
+ class AsyncAiResource:
2139
+ def __init__(self, client: AsyncFreeAstro) -> None:
2140
+ self._client = client
2141
+
2142
+ async def generate(
2143
+ self,
2144
+ body: schemas.AtomicReportRequest,
2145
+ *,
2146
+ options: RequestOptions | None = None,
2147
+ ) -> Any:
2148
+ """Generate Atomic Report
2149
+
2150
+ Generates a full astrological report using the Atomic Interpretation System.
2151
+
2152
+ ``POST /api/v1/ai/generate``
2153
+ """
2154
+ return await self._client.request("POST", "/api/v1/ai/generate", params=None, json=body, options=options)
2155
+
2156
+
2157
+ class AsyncChineseResource:
2158
+ def __init__(self, client: AsyncFreeAstro) -> None:
2159
+ self._client = client
2160
+
2161
+ async def bazi(
2162
+ self,
2163
+ body: schemas.BaziRequest,
2164
+ *,
2165
+ options: RequestOptions | None = None,
2166
+ ) -> Any:
2167
+ """Calculate BaZi (Four Pillars)
2168
+
2169
+ Calculate Chinese BaZi (Four Pillars of Destiny) chart.
2170
+ Includes:
2171
+ - 4 Pillars (GanZhi) for Year, Month, Day, Hour
2172
+ - 5 Element Analysis (Wu Xing)
2173
+ - Solar Term indicators
2174
+
2175
+ ``POST /api/v1/chinese/bazi``
2176
+ """
2177
+ return await self._client.request("POST", "/api/v1/chinese/bazi", params=None, json=body, options=options)
2178
+
2179
+ async def bazi_flow(
2180
+ self,
2181
+ body: schemas.BaziFlowRequest,
2182
+ *,
2183
+ options: RequestOptions | None = None,
2184
+ ) -> Any:
2185
+ """Calculate BaZi Flow (Annual/Monthly Pillars)
2186
+
2187
+ Calculate annual and monthly flow pillars for a specific target year.
2188
+ Used for professional timing and predictive analysis.
2189
+
2190
+ ``POST /api/v1/chinese/bazi/flow``
2191
+ """
2192
+ return await self._client.request("POST", "/api/v1/chinese/bazi/flow", params=None, json=body, options=options)
2193
+
2194
+ async def bazi_dictionary(
2195
+ self,
2196
+ *,
2197
+ lang: str | None = None,
2198
+ options: RequestOptions | None = None,
2199
+ ) -> Any:
2200
+ """Get Bazi Interaction & Star Dictionary
2201
+
2202
+ Get the full mapping of Integer IDs to Interaction/Star definitions.
2203
+ Clients should cache this response permanently (versioned by server version).
2204
+
2205
+ ``GET /api/v1/chinese/bazi/dictionary``
2206
+ """
2207
+ return await self._client.request("GET", "/api/v1/chinese/bazi/dictionary", params=_query({"lang": lang}), json=None, options=options)
2208
+
2209
+ async def today(
2210
+ self,
2211
+ *,
2212
+ include_pinyin: bool | None = None,
2213
+ lang: str | None = None,
2214
+ options: RequestOptions | None = None,
2215
+ ) -> Any:
2216
+ """Get Current BaZi Pillars (Time Now)
2217
+
2218
+ Get current year, month, day, and hour pillars for the present moment.
2219
+ Useful for "Today's energy" or quick transit checks.
2220
+
2221
+ ``GET /api/v1/chinese/today``
2222
+ """
2223
+ return await self._client.request("GET", "/api/v1/chinese/today", params=_query({"include_pinyin": include_pinyin, "lang": lang}), json=None, options=options)
2224
+
2225
+ async def calendar(
2226
+ self,
2227
+ date: str,
2228
+ *,
2229
+ lang: str | None = None,
2230
+ options: RequestOptions | None = None,
2231
+ ) -> schemas.ChineseCalendarResponse:
2232
+ """Convert Gregorian Date to Chinese Calendar
2233
+
2234
+ Convert a Gregorian date to Chinese lunisolar calendar data.
2235
+ Returns lunar date names, lunar-new-year and Li Chun year profiles,
2236
+ sexagenary month/day cycles, solar terms, and festivals.
2237
+
2238
+ ``GET /api/v1/chinese/calendar/{date}``
2239
+ """
2240
+ return cast("schemas.ChineseCalendarResponse", await self._client.request("GET", f"/api/v1/chinese/calendar/{_path(date)}", params=_query({"lang": lang}), json=None, options=options))
2241
+
2242
+ async def bazi_time_correction(
2243
+ self,
2244
+ body: schemas.BaziTimeCorrectionRequest,
2245
+ *,
2246
+ options: RequestOptions | None = None,
2247
+ ) -> Any:
2248
+ """Calculate True Solar Time Corrections
2249
+
2250
+ Get detailed breakdown of True Solar Time corrections.
2251
+ Returns Civil, LMT, and True Solar (Relative & Absolute).
2252
+
2253
+ ``POST /api/v1/chinese/bazi/time-correction``
2254
+ """
2255
+ return await self._client.request("POST", "/api/v1/chinese/bazi/time-correction", params=None, json=body, options=options)
2256
+
2257
+ async def bazi_synastry(
2258
+ self,
2259
+ body: schemas.BaziSynastryRequest,
2260
+ *,
2261
+ options: RequestOptions | None = None,
2262
+ ) -> Any:
2263
+ """Calculate Bazi Compatibility (Synastry)
2264
+
2265
+ Compare two charts for compatibility.
2266
+
2267
+ ``POST /api/v1/chinese/bazi/synastry``
2268
+ """
2269
+ return await self._client.request("POST", "/api/v1/chinese/bazi/synastry", params=None, json=body, options=options)
2270
+
2271
+ async def bazi_lifespan(
2272
+ self,
2273
+ body: schemas.BaziLifespanRequest,
2274
+ *,
2275
+ options: RequestOptions | None = None,
2276
+ ) -> Any:
2277
+ """Calculate Neijing Life Curve (Jing/Qi/Shen)
2278
+
2279
+ Experimental: Calculate energy trajectory (Jing, Qi, Shen) across 0-120y lifespan.
2280
+ Based on Neijing 7/8 year cycles + DaYun/Annual modifier simulation.
2281
+
2282
+ ``POST /api/v1/chinese/bazi/lifespan``
2283
+ """
2284
+ return await self._client.request("POST", "/api/v1/chinese/bazi/lifespan", params=None, json=body, options=options)
2285
+
2286
+ async def bazi_health(
2287
+ self,
2288
+ body: schemas.BaziHealthRequest,
2289
+ *,
2290
+ options: RequestOptions | None = None,
2291
+ ) -> Any:
2292
+ """Analyze BaZi Constitution & Health Tendencies
2293
+
2294
+ Analyze BaZi chart for constitution and health tendency themes.
2295
+
2296
+ ``POST /api/v1/chinese/bazi/health``
2297
+ """
2298
+ return await self._client.request("POST", "/api/v1/chinese/bazi/health", params=None, json=body, options=options)
2299
+
2300
+
2301
+ class AsyncEphemerisResource:
2302
+ def __init__(self, client: AsyncFreeAstro) -> None:
2303
+ self._client = client
2304
+
2305
+ async def calculate(
2306
+ self,
2307
+ body: schemas.EphemerisRequest,
2308
+ *,
2309
+ options: RequestOptions | None = None,
2310
+ ) -> Any:
2311
+ """Calculate Ephemeris
2312
+
2313
+ ``POST /api/v1/ephemeris/calculate``
2314
+ """
2315
+ return await self._client.request("POST", "/api/v1/ephemeris/calculate", params=None, json=body, options=options)
2316
+
2317
+ async def get(
2318
+ self,
2319
+ *,
2320
+ start: str,
2321
+ end: str | None = None,
2322
+ step: str | None = None,
2323
+ zodiac_type: Literal["tropical", "sidereal"] | None = None,
2324
+ sidereal_ayanamsa: str | None = None,
2325
+ house_system: str | None = None,
2326
+ bodies: str | None = None,
2327
+ include_angles: bool | None = None,
2328
+ include_houses: bool | None = None,
2329
+ include_speed: bool | None = None,
2330
+ include_retrograde: bool | None = None,
2331
+ include_dignity: bool | None = None,
2332
+ include_sign_degree: bool | None = None,
2333
+ include_aspects: bool | None = None,
2334
+ include_minor_aspects: bool | None = None,
2335
+ include_moon_void_of_course: bool | None = None,
2336
+ include_fixed_stars: bool | None = None,
2337
+ fixed_stars: str | None = None,
2338
+ fixed_star_packs: str | None = None,
2339
+ lat: float | None = None,
2340
+ lng: float | None = None,
2341
+ tz_str: str | None = None,
2342
+ timezone: str | None = None,
2343
+ dst_policy: Literal["reject", "earlier", "later", "shift_forward"] | None = None,
2344
+ format: Literal["json", "table"] | None = None,
2345
+ response_mode: Literal["json", "table"] | None = None,
2346
+ table_style: Literal["rows", "columns", "grid"] | None = None,
2347
+ include_sidereal_time: bool | None = None,
2348
+ cell_format: Literal["parts", "text"] | None = None,
2349
+ include_chart_links: bool | None = None,
2350
+ sign_display: Literal["abbr", "full"] | None = None,
2351
+ show_motion_markers: bool | None = None,
2352
+ options: RequestOptions | None = None,
2353
+ ) -> Any:
2354
+ """Get Ephemeris
2355
+
2356
+ ``GET /api/v1/ephemeris``
2357
+ """
2358
+ return await self._client.request("GET", "/api/v1/ephemeris", params=_query({"start": start, "end": end, "step": step, "zodiac_type": zodiac_type, "sidereal_ayanamsa": sidereal_ayanamsa, "house_system": house_system, "bodies": bodies, "include_angles": include_angles, "include_houses": include_houses, "include_speed": include_speed, "include_retrograde": include_retrograde, "include_dignity": include_dignity, "include_sign_degree": include_sign_degree, "include_aspects": include_aspects, "include_minor_aspects": include_minor_aspects, "include_moon_void_of_course": include_moon_void_of_course, "include_fixed_stars": include_fixed_stars, "fixed_stars": fixed_stars, "fixed_star_packs": fixed_star_packs, "lat": lat, "lng": lng, "tz_str": tz_str, "timezone": timezone, "dst_policy": dst_policy, "format": format, "response_mode": response_mode, "table_style": table_style, "include_sidereal_time": include_sidereal_time, "cell_format": cell_format, "include_chart_links": include_chart_links, "sign_display": sign_display, "show_motion_markers": show_motion_markers}), json=None, options=options)
2359
+
2360
+
2361
+ class AsyncGeoResourceBase:
2362
+ def __init__(self, client: AsyncFreeAstro) -> None:
2363
+ self._client = client
2364
+
2365
+ async def search_v1(
2366
+ self,
2367
+ *,
2368
+ q: str | None = None,
2369
+ city: str | None = None,
2370
+ limit: int | None = None,
2371
+ country: str | None = None,
2372
+ options: RequestOptions | None = None,
2373
+ ) -> schemas.CitySearchResponse:
2374
+ """Search Cities (Free)
2375
+
2376
+ Search for cities by name prefix for autocomplete functionality.
2377
+
2378
+ ``GET /api/v1/geo/search``
2379
+
2380
+ .. deprecated:: this operation is deprecated by the API.
2381
+ """
2382
+ return cast("schemas.CitySearchResponse", await self._client.request("GET", "/api/v1/geo/search", params=_query({"q": q, "city": city, "limit": limit, "country": country}), json=None, options=options))
2383
+
2384
+
2385
+ class AsyncHoroscopeDailyResource:
2386
+ def __init__(self, client: AsyncFreeAstro) -> None:
2387
+ self._client = client
2388
+
2389
+ async def sign_v1(
2390
+ self,
2391
+ *,
2392
+ sign: str,
2393
+ date: str | None = None,
2394
+ timezone: str | None = None,
2395
+ tz_str: str | None = None,
2396
+ lang: str | None = None,
2397
+ locale: str | None = None,
2398
+ type: str | None = None,
2399
+ style: str | None = None,
2400
+ variant: str | None = None,
2401
+ options: RequestOptions | None = None,
2402
+ ) -> dict[str, Any]:
2403
+ """Get Sign Horoscope
2404
+
2405
+ Get generic daily horoscope for a specific sign.
2406
+
2407
+ ``GET /api/v1/horoscope/daily/sign``
2408
+ """
2409
+ return cast("dict[str, Any]", await self._client.request("GET", "/api/v1/horoscope/daily/sign", params=_query({"sign": sign, "date": date, "timezone": timezone, "tz_str": tz_str, "lang": lang, "locale": locale, "type": type, "style": style, "variant": variant}), json=None, options=options))
2410
+
2411
+ async def bulk(
2412
+ self,
2413
+ *,
2414
+ date: str | None = None,
2415
+ timezone: str | None = None,
2416
+ tz_str: str | None = None,
2417
+ locale: str | None = None,
2418
+ options: RequestOptions | None = None,
2419
+ ) -> dict[str, Any]:
2420
+ """Get Bulk Horoscope
2421
+
2422
+ Get daily horoscope for ALL signs. Optimized for caching/newsletters.
2423
+
2424
+ ``GET /api/v1/horoscope/daily/bulk``
2425
+ """
2426
+ return cast("dict[str, Any]", await self._client.request("GET", "/api/v1/horoscope/daily/bulk", params=_query({"date": date, "timezone": timezone, "tz_str": tz_str, "locale": locale}), json=None, options=options))
2427
+
2428
+ async def personal_v1(
2429
+ self,
2430
+ body: schemas.PersonalHoroscopeRequestV1,
2431
+ *,
2432
+ options: RequestOptions | None = None,
2433
+ ) -> dict[str, Any]:
2434
+ """Get Personal Horoscope
2435
+
2436
+ Get personalized daily horoscope using natal chart + transits.
2437
+
2438
+ ``POST /api/v1/horoscope/daily/personal``
2439
+ """
2440
+ return cast("dict[str, Any]", await self._client.request("POST", "/api/v1/horoscope/daily/personal", params=None, json=body, options=options))
2441
+
2442
+ async def sign_v2(
2443
+ self,
2444
+ *,
2445
+ sign: str,
2446
+ date: str | None = None,
2447
+ tz_str: str | None = None,
2448
+ lang: str | None = None,
2449
+ locale: str | None = None,
2450
+ options: RequestOptions | None = None,
2451
+ ) -> dict[str, Any]:
2452
+ """Get Sign Horoscope
2453
+
2454
+ ``GET /api/v2/horoscope/daily/sign``
2455
+ """
2456
+ return cast("dict[str, Any]", await self._client.request("GET", "/api/v2/horoscope/daily/sign", params=_query({"sign": sign, "date": date, "tz_str": tz_str, "lang": lang, "locale": locale}), json=None, options=options))
2457
+
2458
+ async def personal_v2(
2459
+ self,
2460
+ body: schemas.PersonalHoroscopeRequestV2,
2461
+ *,
2462
+ options: RequestOptions | None = None,
2463
+ ) -> dict[str, Any]:
2464
+ """Get Personal Horoscope
2465
+
2466
+ ``POST /api/v2/horoscope/daily/personal``
2467
+ """
2468
+ return cast("dict[str, Any]", await self._client.request("POST", "/api/v2/horoscope/daily/personal", params=None, json=body, options=options))
2469
+
2470
+ async def sign(
2471
+ self,
2472
+ *,
2473
+ sign: str,
2474
+ date: str | None = None,
2475
+ timezone: str | None = None,
2476
+ tz_str: str | None = None,
2477
+ lang: str | None = None,
2478
+ locale: str | None = None,
2479
+ type: str | None = None,
2480
+ style: str | None = None,
2481
+ variant: str | None = None,
2482
+ options: RequestOptions | None = None,
2483
+ ) -> dict[str, Any]:
2484
+ """Get Sign Horoscope
2485
+
2486
+ Compatibility endpoint for playground clients that selected the V3 engine
2487
+ while using the generic sign horoscope. V3 is personal-only today, so this
2488
+ returns the V2 sign engine shape under the V3 route instead of 404ing.
2489
+
2490
+ ``GET /api/v3/horoscope/daily/sign``
2491
+ """
2492
+ return cast("dict[str, Any]", await self._client.request("GET", "/api/v3/horoscope/daily/sign", params=_query({"sign": sign, "date": date, "timezone": timezone, "tz_str": tz_str, "lang": lang, "locale": locale, "type": type, "style": style, "variant": variant}), json=None, options=options))
2493
+
2494
+ async def personal(
2495
+ self,
2496
+ body: schemas.PersonalHoroscopeRequestV3,
2497
+ *,
2498
+ options: RequestOptions | None = None,
2499
+ ) -> dict[str, Any]:
2500
+ """Get Personal Horoscope
2501
+
2502
+ ``POST /api/v3/horoscope/daily/personal``
2503
+ """
2504
+ return cast("dict[str, Any]", await self._client.request("POST", "/api/v3/horoscope/daily/personal", params=None, json=body, options=options))
2505
+
2506
+
2507
+ class AsyncHoroscopeWeeklyResource:
2508
+ def __init__(self, client: AsyncFreeAstro) -> None:
2509
+ self._client = client
2510
+
2511
+ async def personal(
2512
+ self,
2513
+ body: schemas.WeeklyPersonalHoroscopeRequest,
2514
+ *,
2515
+ options: RequestOptions | None = None,
2516
+ ) -> dict[str, Any]:
2517
+ """Get Weekly Personal Horoscope
2518
+
2519
+ ``POST /api/v3/horoscope/weekly/personal``
2520
+ """
2521
+ return cast("dict[str, Any]", await self._client.request("POST", "/api/v3/horoscope/weekly/personal", params=None, json=body, options=options))
2522
+
2523
+
2524
+ class AsyncHoroscopeResource:
2525
+ def __init__(self, client: AsyncFreeAstro) -> None:
2526
+ self._client = client
2527
+ self.daily = AsyncHoroscopeDailyResource(client)
2528
+ self.weekly = AsyncHoroscopeWeeklyResource(client)
2529
+
2530
+
2531
+ class AsyncMoonResourceBase:
2532
+ def __init__(self, client: AsyncFreeAstro) -> None:
2533
+ self._client = client
2534
+
2535
+
2536
+ class AsyncNatalExperimentalResource:
2537
+ def __init__(self, client: AsyncFreeAstro) -> None:
2538
+ self._client = client
2539
+
2540
+ async def transits(
2541
+ self,
2542
+ body: schemas.ExperimentalTransitChartRequest,
2543
+ *,
2544
+ options: RequestOptions | None = None,
2545
+ ) -> Any:
2546
+ """Experimental Transits Chart
2547
+
2548
+ Generate a bi-wheel chart with natal planets inside and transits outside.
2549
+
2550
+ ``POST /api/v1/natal/experimental/transits``
2551
+
2552
+ .. deprecated:: this operation is deprecated by the API.
2553
+ """
2554
+ return await self._client.request("POST", "/api/v1/natal/experimental/transits", params=None, json=body, options=options)
2555
+
2556
+ async def solar_return(
2557
+ self,
2558
+ body: schemas.ExperimentalSolarReturnChartRequest,
2559
+ *,
2560
+ options: RequestOptions | None = None,
2561
+ ) -> Any:
2562
+ """Experimental Solar Return Chart
2563
+
2564
+ Generate a bi-wheel or standalone chart for the exact solar return in a target year.
2565
+
2566
+ ``POST /api/v1/natal/experimental/solar-return``
2567
+
2568
+ .. deprecated:: this operation is deprecated by the API.
2569
+ """
2570
+ return await self._client.request("POST", "/api/v1/natal/experimental/solar-return", params=None, json=body, options=options)
2571
+
2572
+
2573
+ class AsyncNatalResource:
2574
+ def __init__(self, client: AsyncFreeAstro) -> None:
2575
+ self._client = client
2576
+ self.experimental = AsyncNatalExperimentalResource(client)
2577
+
2578
+ async def simple(
2579
+ self,
2580
+ body: schemas.SimpleNatalRequest,
2581
+ *,
2582
+ options: RequestOptions | None = None,
2583
+ ) -> Any:
2584
+ """Calculate Simple Natal
2585
+
2586
+ A simplified natal endpoint for developer-facing apps.
2587
+ Returns a compact response with curated planets, houses, and useful summary fields.
2588
+
2589
+ ``POST /natal``
2590
+ """
2591
+ return await self._client.request("POST", "/natal", params=None, json=body, options=options)
2592
+
2593
+ async def calculate(
2594
+ self,
2595
+ body: schemas.NatalChartRequest,
2596
+ *,
2597
+ include_minor: bool | None = None,
2598
+ include_stelliums: bool | None = None,
2599
+ options: RequestOptions | None = None,
2600
+ ) -> Any:
2601
+ """Calculate Natal
2602
+
2603
+ Calculate natal chart with planetary positions, houses, and aspects.
2604
+
2605
+ ``POST /api/v1/natal/calculate``
2606
+ """
2607
+ return await self._client.request("POST", "/api/v1/natal/calculate", params=_query({"include_minor": include_minor, "include_stelliums": include_stelliums}), json=body, options=options)
2608
+
2609
+ async def report_credits(
2610
+ self,
2611
+ *,
2612
+ options: RequestOptions | None = None,
2613
+ ) -> Any:
2614
+ """Get Report Credits For Api Key
2615
+
2616
+ ``GET /api/v1/natal/report-credits``
2617
+ """
2618
+ return await self._client.request("GET", "/api/v1/natal/report-credits", params=None, json=None, options=options)
2619
+
2620
+ async def report(
2621
+ self,
2622
+ job_id: str,
2623
+ *,
2624
+ format: Literal["json", "pdf"] | None = None,
2625
+ include_profile_branding_logo: bool | None = None,
2626
+ options: RequestOptions | None = None,
2627
+ ) -> Any:
2628
+ """Get Psychological Report
2629
+
2630
+ ``GET /api/v1/natal/report/{job_id}``
2631
+ """
2632
+ return await self._client.request("GET", f"/api/v1/natal/report/{_path(job_id)}", params=_query({"format": format, "include_profile_branding_logo": include_profile_branding_logo}), json=None, options=options)
2633
+
2634
+ async def chart(
2635
+ self,
2636
+ body: schemas.ExperimentalNatalChartRequest,
2637
+ *,
2638
+ options: RequestOptions | None = None,
2639
+ ) -> Any:
2640
+ """Experimental Natal Chart
2641
+
2642
+ Render a natal chart using the bundled natal library.
2643
+
2644
+ ``POST /api/v1/natal/chart/``
2645
+ """
2646
+ return await self._client.request("POST", "/api/v1/natal/chart/", params=None, json=body, options=options)
2647
+
2648
+ async def chart_transits(
2649
+ self,
2650
+ body: schemas.ExperimentalTransitChartRequest,
2651
+ *,
2652
+ options: RequestOptions | None = None,
2653
+ ) -> Any:
2654
+ """Experimental Transits Chart
2655
+
2656
+ Generate a bi-wheel chart with natal planets inside and transits outside.
2657
+
2658
+ ``POST /api/v1/natal/chart/transits``
2659
+ """
2660
+ return await self._client.request("POST", "/api/v1/natal/chart/transits", params=None, json=body, options=options)
2661
+
2662
+ async def chart_solar_return(
2663
+ self,
2664
+ body: schemas.ExperimentalSolarReturnChartRequest,
2665
+ *,
2666
+ options: RequestOptions | None = None,
2667
+ ) -> Any:
2668
+ """Experimental Solar Return Chart
2669
+
2670
+ Generate a bi-wheel or standalone chart for the exact solar return in a target year.
2671
+
2672
+ ``POST /api/v1/natal/chart/solar-return``
2673
+ """
2674
+ return await self._client.request("POST", "/api/v1/natal/chart/solar-return", params=None, json=body, options=options)
2675
+
2676
+ async def chart_secondary_progressions(
2677
+ self,
2678
+ body: schemas.ExperimentalSecondaryProgressionsChartRequest,
2679
+ *,
2680
+ options: RequestOptions | None = None,
2681
+ ) -> Any:
2682
+ """Experimental Secondary Progressions Chart
2683
+
2684
+ Generate a bi-wheel chart with natal planets inside and secondary progressed planets outside.
2685
+
2686
+ ``POST /api/v1/natal/chart/secondary-progressions``
2687
+ """
2688
+ return await self._client.request("POST", "/api/v1/natal/chart/secondary-progressions", params=None, json=body, options=options)
2689
+
2690
+ async def chart_progressions(
2691
+ self,
2692
+ body: schemas.ExperimentalSecondaryProgressionsChartRequest,
2693
+ *,
2694
+ options: RequestOptions | None = None,
2695
+ ) -> Any:
2696
+ """Experimental Secondary Progressions Chart
2697
+
2698
+ Generate a bi-wheel chart with natal planets inside and secondary progressed planets outside.
2699
+
2700
+ ``POST /api/v1/natal/chart/progressions``
2701
+ """
2702
+ return await self._client.request("POST", "/api/v1/natal/chart/progressions", params=None, json=body, options=options)
2703
+
2704
+ async def chart_composite(
2705
+ self,
2706
+ body: schemas.ExperimentalCompositeChartRequest,
2707
+ *,
2708
+ options: RequestOptions | None = None,
2709
+ ) -> Any:
2710
+ """Experimental Composite Chart
2711
+
2712
+ Midpoint composite single-wheel chart endpoint.
2713
+ Renders a standalone composite chart from two people, reusing the natal SVG renderer.
2714
+
2715
+ ``POST /api/v1/natal/chart/composite``
2716
+ """
2717
+ return await self._client.request("POST", "/api/v1/natal/chart/composite", params=None, json=body, options=options)
2718
+
2719
+ async def chart_synastry(
2720
+ self,
2721
+ body: schemas.ExperimentalSynastryChartRequest,
2722
+ *,
2723
+ options: RequestOptions | None = None,
2724
+ ) -> Any:
2725
+ """Experimental Synastry Chart
2726
+
2727
+ Synastry bi-wheel chart endpoint.
2728
+ Renders person A (outer) and person B (inner) with optional B house ring and inter-aspects.
2729
+
2730
+ ``POST /api/v1/natal/chart/synastry``
2731
+ """
2732
+ return await self._client.request("POST", "/api/v1/natal/chart/synastry", params=None, json=body, options=options)
2733
+
2734
+
2735
+ class AsyncNumerologyResource:
2736
+ def __init__(self, client: AsyncFreeAstro) -> None:
2737
+ self._client = client
2738
+
2739
+ async def methods(
2740
+ self,
2741
+ *,
2742
+ options: RequestOptions | None = None,
2743
+ ) -> schemas.NumerologyMethodsResponse:
2744
+ """List supported numerology methods and policies
2745
+
2746
+ ``GET /api/v1/numerology/methods``
2747
+ """
2748
+ return cast("schemas.NumerologyMethodsResponse", await self._client.request("GET", "/api/v1/numerology/methods", params=None, json=None, options=options))
2749
+
2750
+ async def alphabets(
2751
+ self,
2752
+ *,
2753
+ options: RequestOptions | None = None,
2754
+ ) -> schemas.NumerologyAlphabetsResponse:
2755
+ """List immutable numerology alphabet and Gematria tables
2756
+
2757
+ ``GET /api/v1/numerology/alphabets``
2758
+ """
2759
+ return cast("schemas.NumerologyAlphabetsResponse", await self._client.request("GET", "/api/v1/numerology/alphabets", params=None, json=None, options=options))
2760
+
2761
+ async def profile(
2762
+ self,
2763
+ body: schemas.NumerologyProfileRequest,
2764
+ *,
2765
+ options: RequestOptions | None = None,
2766
+ ) -> schemas.NumerologyProfileResponse:
2767
+ """Calculate a versioned numerology profile
2768
+
2769
+ Calculate without persisting subject names, dates, or derived results.
2770
+
2771
+ ``POST /api/v1/numerology/profile``
2772
+ """
2773
+ return cast("schemas.NumerologyProfileResponse", await self._client.request("POST", "/api/v1/numerology/profile", params=None, json=body, options=options))
2774
+
2775
+
2776
+ class AsyncSkyEventsResourceBase:
2777
+ def __init__(self, client: AsyncFreeAstro) -> None:
2778
+ self._client = client
2779
+
2780
+
2781
+ class AsyncSpaceResource:
2782
+ def __init__(self, client: AsyncFreeAstro) -> None:
2783
+ self._client = client
2784
+
2785
+ async def chart(
2786
+ self,
2787
+ body: schemas.SpaceChartRequest,
2788
+ *,
2789
+ options: RequestOptions | None = None,
2790
+ ) -> Any:
2791
+ """Space Chart
2792
+
2793
+ ``POST /api/v1/space/chart``
2794
+ """
2795
+ return await self._client.request("POST", "/api/v1/space/chart", params=None, json=body, options=options)
2796
+
2797
+ async def chart_svg(
2798
+ self,
2799
+ body: schemas.SpaceChartSvgRequest,
2800
+ *,
2801
+ options: RequestOptions | None = None,
2802
+ ) -> Any:
2803
+ """Space Chart Svg
2804
+
2805
+ The chart wheel, drawn by the natal chart renderer with the same themes and options.
2806
+
2807
+ ``POST /api/v1/space/chart/svg``
2808
+ """
2809
+ return await self._client.request("POST", "/api/v1/space/chart/svg", params=None, json=body, options=options)
2810
+
2811
+
2812
+ class AsyncTransitsResource:
2813
+ def __init__(self, client: AsyncFreeAstro) -> None:
2814
+ self._client = client
2815
+
2816
+ async def calculate(
2817
+ self,
2818
+ body: schemas.TransitRequest,
2819
+ *,
2820
+ include_minor: bool | None = None,
2821
+ options: RequestOptions | None = None,
2822
+ ) -> Any:
2823
+ """Calculate Transits
2824
+
2825
+ Calculate planetary transits relative to natal chart.
2826
+
2827
+ ``POST /api/v1/transits/calculate``
2828
+ """
2829
+ return await self._client.request("POST", "/api/v1/transits/calculate", params=_query({"include_minor": include_minor}), json=body, options=options)
2830
+
2831
+
2832
+ class AsyncVedicTransitsResource:
2833
+ def __init__(self, client: AsyncFreeAstro) -> None:
2834
+ self._client = client
2835
+
2836
+ async def insights(
2837
+ self,
2838
+ body: schemas.VedicTransitInsightsRequest,
2839
+ *,
2840
+ options: RequestOptions | None = None,
2841
+ ) -> schemas.VedicTransitInsightsResponse:
2842
+ """Get Transit Insights
2843
+
2844
+ Get Vedic gochar snapshot facts comparing a transit date against the natal chart.
2845
+
2846
+ ``POST /api/v1/vedic/transits/insights``
2847
+ """
2848
+ return cast("schemas.VedicTransitInsightsResponse", await self._client.request("POST", "/api/v1/vedic/transits/insights", params=None, json=body, options=options))
2849
+
2850
+
2851
+ class AsyncVedicGocharResource:
2852
+ def __init__(self, client: AsyncFreeAstro) -> None:
2853
+ self._client = client
2854
+
2855
+ async def timeline_v1(
2856
+ self,
2857
+ body: schemas.VedicGocharTimelineRequest,
2858
+ *,
2859
+ options: RequestOptions | None = None,
2860
+ ) -> schemas.VedicGocharTimelineResponse:
2861
+ """Get Gochar Timeline
2862
+
2863
+ Get compact Vedic gochar timeline windows over a bounded date range.
2864
+
2865
+ ``POST /api/v1/vedic/gochar/timeline``
2866
+ """
2867
+ return cast("schemas.VedicGocharTimelineResponse", await self._client.request("POST", "/api/v1/vedic/gochar/timeline", params=None, json=body, options=options))
2868
+
2869
+ async def timeline_insights_v1(
2870
+ self,
2871
+ body: schemas.VedicGocharTimelineRequest,
2872
+ *,
2873
+ options: RequestOptions | None = None,
2874
+ ) -> schemas.VedicGocharTimelineInsightsResponse:
2875
+ """Get Gochar Timeline Insights
2876
+
2877
+ Get ranked Vedic gochar timeline insights derived from compact timeline windows.
2878
+
2879
+ ``POST /api/v1/vedic/gochar/timeline/insights``
2880
+ """
2881
+ return cast("schemas.VedicGocharTimelineInsightsResponse", await self._client.request("POST", "/api/v1/vedic/gochar/timeline/insights", params=None, json=body, options=options))
2882
+
2883
+ async def timeline(
2884
+ self,
2885
+ body: schemas.GocharTimelineRequest,
2886
+ *,
2887
+ options: RequestOptions | None = None,
2888
+ ) -> schemas.GocharTimelineV2Response:
2889
+ """Get Vedic Gochar Timeline (v2)
2890
+
2891
+ Return compact V2 Vedic gochar windows over a bounded date range.
2892
+
2893
+ ``POST /api/v2/vedic/gochar/timeline``
2894
+ """
2895
+ return cast("schemas.GocharTimelineV2Response", await self._client.request("POST", "/api/v2/vedic/gochar/timeline", params=None, json=body, options=options))
2896
+
2897
+ async def timeline_insights(
2898
+ self,
2899
+ body: schemas.GocharTimelineRequest,
2900
+ *,
2901
+ options: RequestOptions | None = None,
2902
+ ) -> schemas.VedicGocharTimelineInsightsV2Response:
2903
+ """Get Vedic Gochar Timeline Insights (v2)
2904
+
2905
+ Return ranked V2 Vedic gochar insight facts derived from the calibrated V2 timeline.
2906
+
2907
+ ``POST /api/v2/vedic/gochar/timeline/insights``
2908
+ """
2909
+ return cast("schemas.VedicGocharTimelineInsightsV2Response", await self._client.request("POST", "/api/v2/vedic/gochar/timeline/insights", params=None, json=body, options=options))
2910
+
2911
+
2912
+ class AsyncVedicVisualResource:
2913
+ def __init__(self, client: AsyncFreeAstro) -> None:
2914
+ self._client = client
2915
+
2916
+ async def chart(
2917
+ self,
2918
+ body: schemas.VedicVisualChartRequest,
2919
+ *,
2920
+ options: RequestOptions | None = None,
2921
+ ) -> str:
2922
+ """Render Vedic Visual Chart (v2)
2923
+
2924
+ Render requested V2 divisional charts as a raw SVG or PNG image.
2925
+
2926
+ ``POST /api/v2/vedic/visual/chart``
2927
+
2928
+ Returns the image body as text; use ``request_raw`` for binary formats such as PNG.
2929
+ """
2930
+ return cast("str", await self._client.request("POST", "/api/v2/vedic/visual/chart", params=None, json=body, options=options))
2931
+
2932
+
2933
+ class AsyncVedicHoroscopeResource:
2934
+ def __init__(self, client: AsyncFreeAstro) -> None:
2935
+ self._client = client
2936
+
2937
+ async def daily_sign(
2938
+ self,
2939
+ *,
2940
+ sign: Literal["aries", "taurus", "gemini", "cancer", "leo", "virgo", "libra", "scorpio", "sagittarius", "capricorn", "aquarius", "pisces"],
2941
+ target_date: str | None = None,
2942
+ tz_str: str | None = None,
2943
+ ayanamsha: Literal["lahiri", "raman", "kp", "yukteshwar", "fagan_bradley", "true_pushya", "pushya"] | None = None,
2944
+ node_type: Literal["mean", "true"] | None = None,
2945
+ include_interpretation: bool | None = None,
2946
+ lang: Literal["en", "hi"] | None = None,
2947
+ language: Literal["en", "hi"] | None = None,
2948
+ options: RequestOptions | None = None,
2949
+ ) -> schemas.DailyRashifalSignResponse:
2950
+ """Get General Daily Vedic Rashifal for One Moon Sign (v2)
2951
+
2952
+ General Moon-sign forecast with calculated transits and optional English or Hindi readings. No birth details required.
2953
+
2954
+ ``GET /api/v2/vedic/horoscope/daily/sign``
2955
+ """
2956
+ return cast("schemas.DailyRashifalSignResponse", await self._client.request("GET", "/api/v2/vedic/horoscope/daily/sign", params=_query({"sign": sign, "target_date": target_date, "tz_str": tz_str, "ayanamsha": ayanamsha, "node_type": node_type, "include_interpretation": include_interpretation, "lang": lang, "language": language}), json=None, options=options))
2957
+
2958
+ async def daily_bulk(
2959
+ self,
2960
+ *,
2961
+ target_date: str | None = None,
2962
+ tz_str: str | None = None,
2963
+ ayanamsha: Literal["lahiri", "raman", "kp", "yukteshwar", "fagan_bradley", "true_pushya", "pushya"] | None = None,
2964
+ node_type: Literal["mean", "true"] | None = None,
2965
+ include_interpretation: bool | None = None,
2966
+ lang: Literal["en", "hi"] | None = None,
2967
+ language: Literal["en", "hi"] | None = None,
2968
+ options: RequestOptions | None = None,
2969
+ ) -> schemas.DailyRashifalBulkResponse:
2970
+ """Get General Daily Vedic Rashifal for All 12 Moon Signs (v2)
2971
+
2972
+ Return all 12 rashis from one shared noon sky snapshot, keyed by lowercase English sign names.
2973
+
2974
+ ``GET /api/v2/vedic/horoscope/daily/bulk``
2975
+ """
2976
+ return cast("schemas.DailyRashifalBulkResponse", await self._client.request("GET", "/api/v2/vedic/horoscope/daily/bulk", params=_query({"target_date": target_date, "tz_str": tz_str, "ayanamsha": ayanamsha, "node_type": node_type, "include_interpretation": include_interpretation, "lang": lang, "language": language}), json=None, options=options))
2977
+
2978
+ async def daily_personal(
2979
+ self,
2980
+ body: schemas.DailyVedicHoroscopeRequest,
2981
+ *,
2982
+ options: RequestOptions | None = None,
2983
+ ) -> schemas.DailyVedicHoroscopeV2Response:
2984
+ """Get Daily Vedic Horoscope (v2)
2985
+
2986
+ Return a premium deterministic daily Vedic horoscope composed from V2
2987
+ chart context, one-day gochar insights, active Vimshottari dasha, and Panchang.
2988
+
2989
+ ``POST /api/v2/vedic/horoscope/daily/personal``
2990
+ """
2991
+ return cast("schemas.DailyVedicHoroscopeV2Response", await self._client.request("POST", "/api/v2/vedic/horoscope/daily/personal", params=None, json=body, options=options))
2992
+
2993
+
2994
+ class AsyncVedicMuhuratResource:
2995
+ def __init__(self, client: AsyncFreeAstro) -> None:
2996
+ self._client = client
2997
+
2998
+ async def search(
2999
+ self,
3000
+ body: schemas.VedicMuhuratSearchRequest,
3001
+ *,
3002
+ options: RequestOptions | None = None,
3003
+ ) -> schemas.VedicMuhuratSearchResponse:
3004
+ """Search auspicious Vedic windows (v2)
3005
+
3006
+ Search a monthly date range for auspicious windows.
3007
+
3008
+ ``POST /api/v2/vedic/muhurat/search``
3009
+ """
3010
+ return cast("schemas.VedicMuhuratSearchResponse", await self._client.request("POST", "/api/v2/vedic/muhurat/search", params=None, json=body, options=options))
3011
+
3012
+ async def personalized_search(
3013
+ self,
3014
+ body: schemas.VedicMuhuratPersonalizedSearchRequest,
3015
+ *,
3016
+ options: RequestOptions | None = None,
3017
+ ) -> schemas.VedicMuhuratSearchResponse:
3018
+ """Search auspicious Vedic windows with natal personalization (v2)
3019
+
3020
+ Search public muhurat windows, then re-rank them for a specific birth chart.
3021
+
3022
+ ``POST /api/v2/vedic/muhurat/personalized-search``
3023
+ """
3024
+ return cast("schemas.VedicMuhuratSearchResponse", await self._client.request("POST", "/api/v2/vedic/muhurat/personalized-search", params=None, json=body, options=options))
3025
+
3026
+
3027
+ class AsyncVedicResource:
3028
+ def __init__(self, client: AsyncFreeAstro) -> None:
3029
+ self._client = client
3030
+ self.transits = AsyncVedicTransitsResource(client)
3031
+ self.gochar = AsyncVedicGocharResource(client)
3032
+ self.visual = AsyncVedicVisualResource(client)
3033
+ self.horoscope = AsyncVedicHoroscopeResource(client)
3034
+ self.muhurat = AsyncVedicMuhuratResource(client)
3035
+
3036
+ async def match_v1(
3037
+ self,
3038
+ body: schemas.MatchRequest,
3039
+ *,
3040
+ options: RequestOptions | None = None,
3041
+ ) -> Any:
3042
+ """Match Birth Details
3043
+
3044
+ Calculate compatibility using birth details directly.
3045
+ Computes Moon Nakshatra/Sign internally to avoid ID lookup errors.
3046
+
3047
+ ``POST /api/v1/vedic/match``
3048
+ """
3049
+ return await self._client.request("POST", "/api/v1/vedic/match", params=None, json=body, options=options)
3050
+
3051
+ async def chart_v1(
3052
+ self,
3053
+ body: schemas.BaseChartRequestV1,
3054
+ *,
3055
+ options: RequestOptions | None = None,
3056
+ ) -> Any:
3057
+ """Get Basic Chart
3058
+
3059
+ Get basic Vedic chart: Planets + Houses + Ascendant.
3060
+ Lightweight endpoint for essential data only.
3061
+
3062
+ ``POST /api/v1/vedic/chart``
3063
+ """
3064
+ return await self._client.request("POST", "/api/v1/vedic/chart", params=None, json=body, options=options)
3065
+
3066
+ async def calculate_v1(
3067
+ self,
3068
+ body: schemas.VedicChartRequest,
3069
+ *,
3070
+ options: RequestOptions | None = None,
3071
+ ) -> Any:
3072
+ """Calculate Full Chart
3073
+
3074
+ Full Vedic chart with all optional features.
3075
+ Use feature toggles to customize response.
3076
+
3077
+ ``POST /api/v1/vedic/calculate``
3078
+ """
3079
+ return await self._client.request("POST", "/api/v1/vedic/calculate", params=None, json=body, options=options)
3080
+
3081
+ async def dasha_v1(
3082
+ self,
3083
+ body: schemas.DashaRequestV1,
3084
+ *,
3085
+ options: RequestOptions | None = None,
3086
+ ) -> Any:
3087
+ """Get Dasha
3088
+
3089
+ Get Vimshottari Dasha timeline only.
3090
+
3091
+ ``POST /api/v1/vedic/dasha``
3092
+ """
3093
+ return await self._client.request("POST", "/api/v1/vedic/dasha", params=None, json=body, options=options)
3094
+
3095
+ async def dasha_insights_v1(
3096
+ self,
3097
+ body: schemas.DashaRequestV1,
3098
+ *,
3099
+ options: RequestOptions | None = None,
3100
+ ) -> schemas.VedicDashaInsightsResponse:
3101
+ """Get Dasha Insights
3102
+
3103
+ Get index-ready Vimshottari Dasha facts for Vedic retrieval and bot use.
3104
+
3105
+ ``POST /api/v1/vedic/dasha/insights``
3106
+ """
3107
+ return cast("schemas.VedicDashaInsightsResponse", await self._client.request("POST", "/api/v1/vedic/dasha/insights", params=None, json=body, options=options))
3108
+
3109
+ async def yogas_v1(
3110
+ self,
3111
+ body: schemas.BaseChartRequestV1,
3112
+ *,
3113
+ options: RequestOptions | None = None,
3114
+ ) -> Any:
3115
+ """Get Yogas
3116
+
3117
+ Get detected Yogas only (Manglik, Kala Sarpa, Raj Yogas, etc).
3118
+
3119
+ ``POST /api/v1/vedic/yogas``
3120
+ """
3121
+ return await self._client.request("POST", "/api/v1/vedic/yogas", params=None, json=body, options=options)
3122
+
3123
+ async def strength_v1(
3124
+ self,
3125
+ body: schemas.BaseChartRequestV1,
3126
+ *,
3127
+ options: RequestOptions | None = None,
3128
+ ) -> Any:
3129
+ """Get Strength
3130
+
3131
+ Get planetary strength: Shadbala + Ashtakavarga.
3132
+
3133
+ ``POST /api/v1/vedic/strength``
3134
+ """
3135
+ return await self._client.request("POST", "/api/v1/vedic/strength", params=None, json=body, options=options)
3136
+
3137
+ async def vargas_v1(
3138
+ self,
3139
+ body: schemas.VargaRequest,
3140
+ *,
3141
+ options: RequestOptions | None = None,
3142
+ ) -> Any:
3143
+ """Get Vargas
3144
+
3145
+ Get divisional chart positions (D1, D9, D10, etc).
3146
+
3147
+ ``POST /api/v1/vedic/vargas``
3148
+ """
3149
+ return await self._client.request("POST", "/api/v1/vedic/vargas", params=None, json=body, options=options)
3150
+
3151
+ async def compatibility_v1(
3152
+ self,
3153
+ body: schemas.CompatibilityRequest,
3154
+ *,
3155
+ options: RequestOptions | None = None,
3156
+ ) -> Any:
3157
+ """Calculate Compatibility
3158
+
3159
+ Calculate Ashtakoota (8-point) compatibility.
3160
+ Returns score out of 36.
3161
+
3162
+ ``POST /api/v1/vedic/compatibility``
3163
+ """
3164
+ return await self._client.request("POST", "/api/v1/vedic/compatibility", params=None, json=body, options=options)
3165
+
3166
+ async def panchang_v1(
3167
+ self,
3168
+ body: schemas.PanchangRequestV1,
3169
+ *,
3170
+ options: RequestOptions | None = None,
3171
+ ) -> Any:
3172
+ """Get Panchang
3173
+
3174
+ Get Panchang (daily almanac): Tithi, Nakshatra, Yoga, Karana, Rahu Kalam.
3175
+
3176
+ ``POST /api/v1/vedic/panchang``
3177
+ """
3178
+ return await self._client.request("POST", "/api/v1/vedic/panchang", params=None, json=body, options=options)
3179
+
3180
+ async def batch(
3181
+ self,
3182
+ body: schemas.VedicBatchRequest,
3183
+ *,
3184
+ options: RequestOptions | None = None,
3185
+ ) -> Any:
3186
+ """Run Vedic Batch
3187
+
3188
+ Run up to 6 single-person Vedic endpoint calls in one HTTP request.
3189
+ Items execute sequentially to keep compute bounded and preserve per-item order.
3190
+
3191
+ ``POST /api/v1/vedic/batch``
3192
+ """
3193
+ return await self._client.request("POST", "/api/v1/vedic/batch", params=None, json=body, options=options)
3194
+
3195
+ async def chat(
3196
+ self,
3197
+ body: schemas.VedicChatRequest,
3198
+ *,
3199
+ options: RequestOptions | None = None,
3200
+ ) -> schemas.VedicChatResponse:
3201
+ """Hosted Vedic Chat (v2)
3202
+
3203
+ Hosted Vedic Chat orchestration.
3204
+
3205
+ ``POST /api/v2/vedic/chat``
3206
+ """
3207
+ return cast("schemas.VedicChatResponse", await self._client.request("POST", "/api/v2/vedic/chat", params=None, json=body, options=options))
3208
+
3209
+ async def calculate(
3210
+ self,
3211
+ body: schemas.CalculateRequest,
3212
+ *,
3213
+ options: RequestOptions | None = None,
3214
+ ) -> schemas.CalculateV2Response:
3215
+ """Get Full Vedic Calculate (v2)
3216
+
3217
+ Return a full V2 Vedic chart payload composed from calibrated V2 component engines.
3218
+
3219
+ ``POST /api/v2/vedic/calculate``
3220
+ """
3221
+ return cast("schemas.CalculateV2Response", await self._client.request("POST", "/api/v2/vedic/calculate", params=None, json=body, options=options))
3222
+
3223
+ async def kp(
3224
+ self,
3225
+ body: schemas.KPChartRequest,
3226
+ *,
3227
+ options: RequestOptions | None = None,
3228
+ ) -> schemas.KPChartResponse:
3229
+ """Get Complete KP Chart (v2)
3230
+
3231
+ Return a complete Krishnamurti Paddhati calculation contract.
3232
+
3233
+ ``POST /api/v2/vedic/kp``
3234
+ """
3235
+ return cast("schemas.KPChartResponse", await self._client.request("POST", "/api/v2/vedic/kp", params=None, json=body, options=options))
3236
+
3237
+ async def kp_render(
3238
+ self,
3239
+ body: schemas.KPChartRenderRequest,
3240
+ *,
3241
+ options: RequestOptions | None = None,
3242
+ ) -> str:
3243
+ """Render KP Chart and Tables (v2)
3244
+
3245
+ Render the same complete KP calculation as an accessible SVG or PNG.
3246
+
3247
+ ``POST /api/v2/vedic/kp/render``
3248
+
3249
+ Returns the image body as text; use ``request_raw`` for binary formats such as PNG.
3250
+ """
3251
+ return cast("str", await self._client.request("POST", "/api/v2/vedic/kp/render", params=None, json=body, options=options))
3252
+
3253
+ async def chart(
3254
+ self,
3255
+ body: schemas.ChartRequest,
3256
+ *,
3257
+ options: RequestOptions | None = None,
3258
+ ) -> schemas.ChartV2Response:
3259
+ """Get Vedic Chart (v2)
3260
+
3261
+ Return a clean V2 D1 chart payload built from the shared sidereal chart engine.
3262
+
3263
+ ``POST /api/v2/vedic/chart``
3264
+ """
3265
+ return cast("schemas.ChartV2Response", await self._client.request("POST", "/api/v2/vedic/chart", params=None, json=body, options=options))
3266
+
3267
+ async def vargas(
3268
+ self,
3269
+ body: schemas.VargasRequest,
3270
+ *,
3271
+ options: RequestOptions | None = None,
3272
+ ) -> schemas.VargasV2Response:
3273
+ """Get Vedic Vargas (v2)
3274
+
3275
+ Return V2 divisional chart rows and whole-sign divisional layouts.
3276
+
3277
+ ``POST /api/v2/vedic/vargas``
3278
+ """
3279
+ return cast("schemas.VargasV2Response", await self._client.request("POST", "/api/v2/vedic/vargas", params=None, json=body, options=options))
3280
+
3281
+ async def dasha(
3282
+ self,
3283
+ body: schemas.DashaRequestV2,
3284
+ *,
3285
+ options: RequestOptions | None = None,
3286
+ ) -> schemas.DashaV2Response:
3287
+ """Get Vimshottari Dasha (v2)
3288
+
3289
+ Return a V2 Vimshottari Dasha contract with birth balance, active stack, and timeline.
3290
+
3291
+ ``POST /api/v2/vedic/dasha``
3292
+ """
3293
+ return cast("schemas.DashaV2Response", await self._client.request("POST", "/api/v2/vedic/dasha", params=None, json=body, options=options))
3294
+
3295
+ async def dasha_insights(
3296
+ self,
3297
+ body: schemas.DashaRequestV2,
3298
+ *,
3299
+ options: RequestOptions | None = None,
3300
+ ) -> schemas.VedicDashaInsightsResponse:
3301
+ """Get Vimshottari Dasha Insights (v2)
3302
+
3303
+ Return ranked dasha insight facts derived from the calibrated V2 Vimshottari timeline.
3304
+
3305
+ ``POST /api/v2/vedic/dasha/insights``
3306
+ """
3307
+ return cast("schemas.VedicDashaInsightsResponse", await self._client.request("POST", "/api/v2/vedic/dasha/insights", params=None, json=body, options=options))
3308
+
3309
+ async def yogas(
3310
+ self,
3311
+ body: schemas.BaseChartRequestV2,
3312
+ *,
3313
+ options: RequestOptions | None = None,
3314
+ ) -> schemas.YogasV2Response:
3315
+ """Get Vedic Yogas (v2)
3316
+
3317
+ Evaluate a classical V2 yoga catalog and return active and inactive results with evidence.
3318
+
3319
+ ``POST /api/v2/vedic/yogas``
3320
+ """
3321
+ return cast("schemas.YogasV2Response", await self._client.request("POST", "/api/v2/vedic/yogas", params=None, json=body, options=options))
3322
+
3323
+ async def strength(
3324
+ self,
3325
+ body: schemas.BaseChartRequestV2,
3326
+ *,
3327
+ options: RequestOptions | None = None,
3328
+ ) -> schemas.StrengthV2Response:
3329
+ """Get Vedic Strength (v2)
3330
+
3331
+ Return V2 strength data with classical Shadbala and classical Ashtakavarga.
3332
+
3333
+ ``POST /api/v2/vedic/strength``
3334
+ """
3335
+ return cast("schemas.StrengthV2Response", await self._client.request("POST", "/api/v2/vedic/strength", params=None, json=body, options=options))
3336
+
3337
+ async def compatibility(
3338
+ self,
3339
+ body: schemas.CompatibilityV2Request,
3340
+ *,
3341
+ options: RequestOptions | None = None,
3342
+ ) -> schemas.CompatibilityV2Response:
3343
+ """Get Vedic Compatibility (v2)
3344
+
3345
+ Return an AstroSage-style V2 Ashtakoota compatibility payload.
3346
+
3347
+ ``POST /api/v2/vedic/compatibility``
3348
+ """
3349
+ return cast("schemas.CompatibilityV2Response", await self._client.request("POST", "/api/v2/vedic/compatibility", params=None, json=body, options=options))
3350
+
3351
+ async def match(
3352
+ self,
3353
+ body: schemas.MatchV2Request,
3354
+ *,
3355
+ options: RequestOptions | None = None,
3356
+ ) -> schemas.CompatibilityV2Response:
3357
+ """Get Vedic Match by Birth Details (v2)
3358
+
3359
+ Return the calibrated V2 compatibility payload from two birth charts.
3360
+
3361
+ ``POST /api/v2/vedic/match``
3362
+ """
3363
+ return cast("schemas.CompatibilityV2Response", await self._client.request("POST", "/api/v2/vedic/match", params=None, json=body, options=options))
3364
+
3365
+ async def panchang(
3366
+ self,
3367
+ body: schemas.PanchangRequestV2,
3368
+ *,
3369
+ options: RequestOptions | None = None,
3370
+ ) -> schemas.PanchangV2Response:
3371
+ """Get Panchang (v2)
3372
+
3373
+ Return a sunrise-based daily Panchang with transition times calibrated toward
3374
+ AstroSage's public daily Panchang presentation.
3375
+
3376
+ ``POST /api/v2/vedic/panchang``
3377
+ """
3378
+ return cast("schemas.PanchangV2Response", await self._client.request("POST", "/api/v2/vedic/panchang", params=None, json=body, options=options))
3379
+
3380
+ async def qa(
3381
+ self,
3382
+ body: schemas.VedicQARequest,
3383
+ *,
3384
+ options: RequestOptions | None = None,
3385
+ ) -> schemas.VedicQAResponse:
3386
+ """Answer Vedic question (v2)
3387
+
3388
+ Answer a constrained Vedic question with structured calculation evidence.
3389
+
3390
+ ``POST /api/v2/vedic/qa``
3391
+ """
3392
+ return cast("schemas.VedicQAResponse", await self._client.request("POST", "/api/v2/vedic/qa", params=None, json=body, options=options))
3393
+
3394
+
3395
+ class AsyncWesternSolarResource:
3396
+ def __init__(self, client: AsyncFreeAstro) -> None:
3397
+ self._client = client
3398
+
3399
+ async def calculate(
3400
+ self,
3401
+ body: schemas.SolarReturnRequest,
3402
+ *,
3403
+ options: RequestOptions | None = None,
3404
+ ) -> schemas.SolarReturnResponse:
3405
+ """Get Solar Return
3406
+
3407
+ Computes purely deterministic Solar Return chart against the Natal chart.
3408
+ Returns structurally identical core chart blocks (planets, aspects) as
3409
+ well as exact cross-aspects and angularity, without scoring or archetype models.
3410
+
3411
+ ``POST /api/v1/western/solar/calculate``
3412
+ """
3413
+ return cast("schemas.SolarReturnResponse", await self._client.request("POST", "/api/v1/western/solar/calculate", params=None, json=body, options=options))
3414
+
3415
+
3416
+ class AsyncWesternReturnsResource:
3417
+ def __init__(self, client: AsyncFreeAstro) -> None:
3418
+ self._client = client
3419
+
3420
+ async def calculate(
3421
+ self,
3422
+ body: schemas.PlanetReturnRequest,
3423
+ *,
3424
+ options: RequestOptions | None = None,
3425
+ ) -> schemas.PlanetReturnResponse:
3426
+ """Get Planet Return
3427
+
3428
+ Computes a deterministic planetary return chart against the natal chart.
3429
+ The return target is selected by body plus a date anchor and selection mode.
3430
+
3431
+ ``POST /api/v1/western/returns/calculate``
3432
+ """
3433
+ return cast("schemas.PlanetReturnResponse", await self._client.request("POST", "/api/v1/western/returns/calculate", params=None, json=body, options=options))
3434
+
3435
+
3436
+ class AsyncWesternAstrocartographyResource:
3437
+ def __init__(self, client: AsyncFreeAstro) -> None:
3438
+ self._client = client
3439
+
3440
+ async def lines(
3441
+ self,
3442
+ body: schemas.AstrocartographyLinesRequest,
3443
+ *,
3444
+ options: RequestOptions | None = None,
3445
+ ) -> dict[str, Any]:
3446
+ """Get Astrocartography Lines
3447
+
3448
+ Compute astrocartography map lines for a natal chart.
3449
+
3450
+ ``POST /api/v1/western/astrocartography/lines``
3451
+ """
3452
+ return cast("dict[str, Any]", await self._client.request("POST", "/api/v1/western/astrocartography/lines", params=None, json=body, options=options))
3453
+
3454
+ async def recommendations(
3455
+ self,
3456
+ body: schemas.AstrocartographyRecommendationsRequest,
3457
+ *,
3458
+ options: RequestOptions | None = None,
3459
+ ) -> dict[str, Any]:
3460
+ """Get Astrocartography Recommendations
3461
+
3462
+ Rank candidate cities for a focus-oriented astrocartography search.
3463
+
3464
+ ``POST /api/v1/western/astrocartography/recommendations``
3465
+ """
3466
+ return cast("dict[str, Any]", await self._client.request("POST", "/api/v1/western/astrocartography/recommendations", params=None, json=body, options=options))
3467
+
3468
+ async def parans(
3469
+ self,
3470
+ body: schemas.AstrocartographyParansRequest,
3471
+ *,
3472
+ options: RequestOptions | None = None,
3473
+ ) -> dict[str, Any]:
3474
+ """Get Astrocartography Parans
3475
+
3476
+ Compute classical in-mundo astrocartography parans for a natal chart.
3477
+
3478
+ ``POST /api/v1/western/astrocartography/parans``
3479
+ """
3480
+ return cast("dict[str, Any]", await self._client.request("POST", "/api/v1/western/astrocartography/parans", params=None, json=body, options=options))
3481
+
3482
+ async def relocation(
3483
+ self,
3484
+ body: schemas.AstrocartographyRelocationRequest,
3485
+ *,
3486
+ options: RequestOptions | None = None,
3487
+ ) -> dict[str, Any]:
3488
+ """Get Astrocartography Relocation
3489
+
3490
+ Build a full relocated chart for the natal instant at a target city.
3491
+
3492
+ ``POST /api/v1/western/astrocartography/relocation``
3493
+ """
3494
+ return cast("dict[str, Any]", await self._client.request("POST", "/api/v1/western/astrocartography/relocation", params=None, json=body, options=options))
3495
+
3496
+ async def city_check(
3497
+ self,
3498
+ body: schemas.AstrocartographyCityCheckRequest,
3499
+ *,
3500
+ options: RequestOptions | None = None,
3501
+ ) -> dict[str, Any]:
3502
+ """Get Astrocartography City Check
3503
+
3504
+ Score a single city across the five primary relocation-oriented focus areas.
3505
+
3506
+ ``POST /api/v1/western/astrocartography/city-check``
3507
+ """
3508
+ return cast("dict[str, Any]", await self._client.request("POST", "/api/v1/western/astrocartography/city-check", params=None, json=body, options=options))
3509
+
3510
+
3511
+ class AsyncWesternNatalResource:
3512
+ def __init__(self, client: AsyncFreeAstro) -> None:
3513
+ self._client = client
3514
+
3515
+ async def insights(
3516
+ self,
3517
+ body: schemas.NatalInsightsRequest,
3518
+ *,
3519
+ options: RequestOptions | None = None,
3520
+ ) -> schemas.NatalInsightsResponse:
3521
+ """Get Natal Insights
3522
+
3523
+ Return machine-readable natal insight facts, with optional canonical grouping and French display text.
3524
+
3525
+ ``POST /api/v1/western/natal/insights``
3526
+ """
3527
+ return cast("schemas.NatalInsightsResponse", await self._client.request("POST", "/api/v1/western/natal/insights", params=None, json=body, options=options))
3528
+
3529
+ async def insights_index_documents(
3530
+ self,
3531
+ body: schemas.NatalInsightsRequest,
3532
+ *,
3533
+ options: RequestOptions | None = None,
3534
+ ) -> schemas.NatalInsightsIndexDocumentsResponse:
3535
+ """Get Natal Insight Index Documents
3536
+
3537
+ Return one denormalized search document per natal insight fact for external indexing systems.
3538
+
3539
+ ``POST /api/v1/western/natal/insights/index-documents``
3540
+ """
3541
+ return cast("schemas.NatalInsightsIndexDocumentsResponse", await self._client.request("POST", "/api/v1/western/natal/insights/index-documents", params=None, json=body, options=options))
3542
+
3543
+
3544
+ class AsyncWesternTransitsResource:
3545
+ def __init__(self, client: AsyncFreeAstro) -> None:
3546
+ self._client = client
3547
+
3548
+ async def insights(
3549
+ self,
3550
+ body: schemas.TransitTimelineRequest,
3551
+ *,
3552
+ options: RequestOptions | None = None,
3553
+ ) -> schemas.TransitInsightsResponse:
3554
+ """Get Transit Insights
3555
+
3556
+ Compute derived transit insight windows from the transit timeline engine.
3557
+
3558
+ ``POST /api/v1/western/transits/insights``
3559
+ """
3560
+ return cast("schemas.TransitInsightsResponse", await self._client.request("POST", "/api/v1/western/transits/insights", params=None, json=body, options=options))
3561
+
3562
+ async def timeline(
3563
+ self,
3564
+ body: schemas.TransitTimelineRequest,
3565
+ *,
3566
+ options: RequestOptions | None = None,
3567
+ ) -> schemas.TransitTimelineResponse:
3568
+ """Get Transits Timeline
3569
+
3570
+ Compute transit-to-natal interval passes across a date range for calendar and timeline rendering.
3571
+
3572
+ ``POST /api/v1/western/transits/timeline``
3573
+ """
3574
+ return cast("schemas.TransitTimelineResponse", await self._client.request("POST", "/api/v1/western/transits/timeline", params=None, json=body, options=options))
3575
+
3576
+ async def timeline_index_documents(
3577
+ self,
3578
+ body: schemas.TransitTimelineRequest,
3579
+ *,
3580
+ options: RequestOptions | None = None,
3581
+ ) -> schemas.TransitTimelineIndexDocumentsResponse:
3582
+ """Get Transits Timeline Index Documents
3583
+
3584
+ Compute timeline passes and return one denormalized search document per pass.
3585
+
3586
+ ``POST /api/v1/western/transits/timeline/index-documents``
3587
+ """
3588
+ return cast("schemas.TransitTimelineIndexDocumentsResponse", await self._client.request("POST", "/api/v1/western/transits/timeline/index-documents", params=None, json=body, options=options))
3589
+
3590
+ async def search(
3591
+ self,
3592
+ body: schemas.TransitSearchRequest,
3593
+ *,
3594
+ options: RequestOptions | None = None,
3595
+ ) -> schemas.TransitSearchResponse:
3596
+ """Search Transits
3597
+
3598
+ Search a long-range date or age window for all passes of one transit planet against one natal point.
3599
+
3600
+ ``POST /api/v1/western/transits/search``
3601
+ """
3602
+ return cast("schemas.TransitSearchResponse", await self._client.request("POST", "/api/v1/western/transits/search", params=None, json=body, options=options))
3603
+
3604
+
3605
+ class AsyncWesternProfectionsResource:
3606
+ def __init__(self, client: AsyncFreeAstro) -> None:
3607
+ self._client = client
3608
+
3609
+ async def annual(
3610
+ self,
3611
+ body: schemas.AnnualProfectionRequest,
3612
+ *,
3613
+ include: list[str] | None = None,
3614
+ options: RequestOptions | None = None,
3615
+ ) -> schemas.AnnualProfectionResponse:
3616
+ """Get Annual Profections
3617
+
3618
+ Annual profections endpoint with a solar-return-style envelope and a timing-oriented body.
3619
+
3620
+ ``POST /api/v1/western/profections/annual``
3621
+ """
3622
+ return cast("schemas.AnnualProfectionResponse", await self._client.request("POST", "/api/v1/western/profections/annual", params=_query({"include": include}), json=body, options=options))
3623
+
3624
+
3625
+ class AsyncWesternProgressionsResource:
3626
+ def __init__(self, client: AsyncFreeAstro) -> None:
3627
+ self._client = client
3628
+
3629
+ async def secondary(
3630
+ self,
3631
+ body: schemas.SecondaryProgressionsRequest,
3632
+ *,
3633
+ include: list[str] | None = None,
3634
+ response_mode: Literal["full", "table"] | None = None,
3635
+ options: RequestOptions | None = None,
3636
+ ) -> schemas.SecondaryProgressionsResponse | schemas.ProgressionTableResponse:
3637
+ """Get Secondary Progressions
3638
+
3639
+ Compute a secondary progressed chart using the classic symbolic timing rule:
3640
+ 1 day after birth = 1 year of life.
3641
+
3642
+ ``POST /api/v1/western/progressions/secondary``
3643
+ """
3644
+ return cast("schemas.SecondaryProgressionsResponse | schemas.ProgressionTableResponse", await self._client.request("POST", "/api/v1/western/progressions/secondary", params=_query({"include": include, "response_mode": response_mode}), json=body, options=options))
3645
+
3646
+ async def converse_secondary(
3647
+ self,
3648
+ body: schemas.ConverseSecondaryProgressionsRequest,
3649
+ *,
3650
+ response_mode: Literal["full", "table"] | None = None,
3651
+ options: RequestOptions | None = None,
3652
+ ) -> schemas.ProgressionChartResponse | schemas.ProgressionTableResponse:
3653
+ """Get Converse Secondary Progressions
3654
+
3655
+ ``POST /api/v1/western/progressions/converse-secondary``
3656
+ """
3657
+ return cast("schemas.ProgressionChartResponse | schemas.ProgressionTableResponse", await self._client.request("POST", "/api/v1/western/progressions/converse-secondary", params=_query({"response_mode": response_mode}), json=body, options=options))
3658
+
3659
+ async def tertiary(
3660
+ self,
3661
+ body: schemas.TertiaryProgressionsRequest,
3662
+ *,
3663
+ response_mode: Literal["full", "table"] | None = None,
3664
+ options: RequestOptions | None = None,
3665
+ ) -> schemas.ProgressionChartResponse | schemas.ProgressionTableResponse:
3666
+ """Get Tertiary Progressions
3667
+
3668
+ ``POST /api/v1/western/progressions/tertiary``
3669
+ """
3670
+ return cast("schemas.ProgressionChartResponse | schemas.ProgressionTableResponse", await self._client.request("POST", "/api/v1/western/progressions/tertiary", params=_query({"response_mode": response_mode}), json=body, options=options))
3671
+
3672
+ async def quotidian(
3673
+ self,
3674
+ body: schemas.QuotidianProgressionsRequest,
3675
+ *,
3676
+ response_mode: Literal["full", "table"] | None = None,
3677
+ options: RequestOptions | None = None,
3678
+ ) -> schemas.ProgressionChartResponse | schemas.ProgressionTableResponse:
3679
+ """Get Quotidian Progressions
3680
+
3681
+ ``POST /api/v1/western/progressions/quotidian``
3682
+ """
3683
+ return cast("schemas.ProgressionChartResponse | schemas.ProgressionTableResponse", await self._client.request("POST", "/api/v1/western/progressions/quotidian", params=_query({"response_mode": response_mode}), json=body, options=options))
3684
+
3685
+ async def quaternary(
3686
+ self,
3687
+ body: schemas.QuaternaryProgressionsRequest,
3688
+ *,
3689
+ response_mode: Literal["full", "table"] | None = None,
3690
+ options: RequestOptions | None = None,
3691
+ ) -> schemas.ProgressionChartResponse | schemas.ProgressionTableResponse:
3692
+ """Get Quaternary Progressions
3693
+
3694
+ ``POST /api/v1/western/progressions/quaternary``
3695
+ """
3696
+ return cast("schemas.ProgressionChartResponse | schemas.ProgressionTableResponse", await self._client.request("POST", "/api/v1/western/progressions/quaternary", params=_query({"response_mode": response_mode}), json=body, options=options))
3697
+
3698
+ async def secondary_exact_ingresses(
3699
+ self,
3700
+ body: schemas.ExactIngressSearchRequest,
3701
+ *,
3702
+ options: RequestOptions | None = None,
3703
+ ) -> schemas.ExactIngressSearchResponse:
3704
+ """Search Secondary Exact Ingresses
3705
+
3706
+ ``POST /api/v1/western/progressions/secondary/exact-ingresses``
3707
+ """
3708
+ return cast("schemas.ExactIngressSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/secondary/exact-ingresses", params=None, json=body, options=options))
3709
+
3710
+ async def converse_secondary_exact_ingresses(
3711
+ self,
3712
+ body: schemas.ExactIngressSearchRequest,
3713
+ *,
3714
+ options: RequestOptions | None = None,
3715
+ ) -> schemas.ExactIngressSearchResponse:
3716
+ """Search Converse Secondary Exact Ingresses
3717
+
3718
+ ``POST /api/v1/western/progressions/converse-secondary/exact-ingresses``
3719
+ """
3720
+ return cast("schemas.ExactIngressSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/converse-secondary/exact-ingresses", params=None, json=body, options=options))
3721
+
3722
+ async def tertiary_exact_ingresses(
3723
+ self,
3724
+ body: schemas.ExactIngressSearchRequest,
3725
+ *,
3726
+ options: RequestOptions | None = None,
3727
+ ) -> schemas.ExactIngressSearchResponse:
3728
+ """Search Tertiary Exact Ingresses
3729
+
3730
+ ``POST /api/v1/western/progressions/tertiary/exact-ingresses``
3731
+ """
3732
+ return cast("schemas.ExactIngressSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/tertiary/exact-ingresses", params=None, json=body, options=options))
3733
+
3734
+ async def quotidian_exact_ingresses(
3735
+ self,
3736
+ body: schemas.ExactIngressSearchRequest,
3737
+ *,
3738
+ options: RequestOptions | None = None,
3739
+ ) -> schemas.ExactIngressSearchResponse:
3740
+ """Search Quotidian Exact Ingresses
3741
+
3742
+ ``POST /api/v1/western/progressions/quotidian/exact-ingresses``
3743
+ """
3744
+ return cast("schemas.ExactIngressSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/quotidian/exact-ingresses", params=None, json=body, options=options))
3745
+
3746
+ async def quaternary_exact_ingresses(
3747
+ self,
3748
+ body: schemas.ExactIngressSearchRequest,
3749
+ *,
3750
+ options: RequestOptions | None = None,
3751
+ ) -> schemas.ExactIngressSearchResponse:
3752
+ """Search Quaternary Exact Ingresses
3753
+
3754
+ ``POST /api/v1/western/progressions/quaternary/exact-ingresses``
3755
+ """
3756
+ return cast("schemas.ExactIngressSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/quaternary/exact-ingresses", params=None, json=body, options=options))
3757
+
3758
+ async def secondary_exact_aspects(
3759
+ self,
3760
+ body: schemas.ExactAspectSearchRequest,
3761
+ *,
3762
+ options: RequestOptions | None = None,
3763
+ ) -> schemas.ExactAspectSearchResponse:
3764
+ """Search Secondary Exact Aspects
3765
+
3766
+ ``POST /api/v1/western/progressions/secondary/exact-aspects``
3767
+ """
3768
+ return cast("schemas.ExactAspectSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/secondary/exact-aspects", params=None, json=body, options=options))
3769
+
3770
+ async def converse_secondary_exact_aspects(
3771
+ self,
3772
+ body: schemas.ExactAspectSearchRequest,
3773
+ *,
3774
+ options: RequestOptions | None = None,
3775
+ ) -> schemas.ExactAspectSearchResponse:
3776
+ """Search Converse Secondary Exact Aspects
3777
+
3778
+ ``POST /api/v1/western/progressions/converse-secondary/exact-aspects``
3779
+ """
3780
+ return cast("schemas.ExactAspectSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/converse-secondary/exact-aspects", params=None, json=body, options=options))
3781
+
3782
+ async def tertiary_exact_aspects(
3783
+ self,
3784
+ body: schemas.ExactAspectSearchRequest,
3785
+ *,
3786
+ options: RequestOptions | None = None,
3787
+ ) -> schemas.ExactAspectSearchResponse:
3788
+ """Search Tertiary Exact Aspects
3789
+
3790
+ ``POST /api/v1/western/progressions/tertiary/exact-aspects``
3791
+ """
3792
+ return cast("schemas.ExactAspectSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/tertiary/exact-aspects", params=None, json=body, options=options))
3793
+
3794
+ async def quotidian_exact_aspects(
3795
+ self,
3796
+ body: schemas.ExactAspectSearchRequest,
3797
+ *,
3798
+ options: RequestOptions | None = None,
3799
+ ) -> schemas.ExactAspectSearchResponse:
3800
+ """Search Quotidian Exact Aspects
3801
+
3802
+ ``POST /api/v1/western/progressions/quotidian/exact-aspects``
3803
+ """
3804
+ return cast("schemas.ExactAspectSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/quotidian/exact-aspects", params=None, json=body, options=options))
3805
+
3806
+ async def quaternary_exact_aspects(
3807
+ self,
3808
+ body: schemas.ExactAspectSearchRequest,
3809
+ *,
3810
+ options: RequestOptions | None = None,
3811
+ ) -> schemas.ExactAspectSearchResponse:
3812
+ """Search Quaternary Exact Aspects
3813
+
3814
+ ``POST /api/v1/western/progressions/quaternary/exact-aspects``
3815
+ """
3816
+ return cast("schemas.ExactAspectSearchResponse", await self._client.request("POST", "/api/v1/western/progressions/quaternary/exact-aspects", params=None, json=body, options=options))
3817
+
3818
+ async def secondary_calendar(
3819
+ self,
3820
+ body: schemas.ProgressionCalendarRequest,
3821
+ *,
3822
+ options: RequestOptions | None = None,
3823
+ ) -> schemas.ProgressionCalendarResponse:
3824
+ """Get Secondary Progressions Calendar
3825
+
3826
+ ``POST /api/v1/western/progressions/secondary/calendar``
3827
+ """
3828
+ return cast("schemas.ProgressionCalendarResponse", await self._client.request("POST", "/api/v1/western/progressions/secondary/calendar", params=None, json=body, options=options))
3829
+
3830
+ async def converse_secondary_calendar(
3831
+ self,
3832
+ body: schemas.ProgressionCalendarRequest,
3833
+ *,
3834
+ options: RequestOptions | None = None,
3835
+ ) -> schemas.ProgressionCalendarResponse:
3836
+ """Get Converse Secondary Progressions Calendar
3837
+
3838
+ ``POST /api/v1/western/progressions/converse-secondary/calendar``
3839
+ """
3840
+ return cast("schemas.ProgressionCalendarResponse", await self._client.request("POST", "/api/v1/western/progressions/converse-secondary/calendar", params=None, json=body, options=options))
3841
+
3842
+ async def tertiary_calendar(
3843
+ self,
3844
+ body: schemas.ProgressionCalendarRequest,
3845
+ *,
3846
+ options: RequestOptions | None = None,
3847
+ ) -> schemas.ProgressionCalendarResponse:
3848
+ """Get Tertiary Progressions Calendar
3849
+
3850
+ ``POST /api/v1/western/progressions/tertiary/calendar``
3851
+ """
3852
+ return cast("schemas.ProgressionCalendarResponse", await self._client.request("POST", "/api/v1/western/progressions/tertiary/calendar", params=None, json=body, options=options))
3853
+
3854
+ async def quotidian_calendar(
3855
+ self,
3856
+ body: schemas.ProgressionCalendarRequest,
3857
+ *,
3858
+ options: RequestOptions | None = None,
3859
+ ) -> schemas.ProgressionCalendarResponse:
3860
+ """Get Quotidian Progressions Calendar
3861
+
3862
+ ``POST /api/v1/western/progressions/quotidian/calendar``
3863
+ """
3864
+ return cast("schemas.ProgressionCalendarResponse", await self._client.request("POST", "/api/v1/western/progressions/quotidian/calendar", params=None, json=body, options=options))
3865
+
3866
+ async def quaternary_calendar(
3867
+ self,
3868
+ body: schemas.ProgressionCalendarRequest,
3869
+ *,
3870
+ options: RequestOptions | None = None,
3871
+ ) -> schemas.ProgressionCalendarResponse:
3872
+ """Get Quaternary Progressions Calendar
3873
+
3874
+ ``POST /api/v1/western/progressions/quaternary/calendar``
3875
+ """
3876
+ return cast("schemas.ProgressionCalendarResponse", await self._client.request("POST", "/api/v1/western/progressions/quaternary/calendar", params=None, json=body, options=options))
3877
+
3878
+
3879
+ class AsyncWesternDirectionsResource:
3880
+ def __init__(self, client: AsyncFreeAstro) -> None:
3881
+ self._client = client
3882
+
3883
+ async def primary(
3884
+ self,
3885
+ body: schemas.PrimaryDirectionsRequest,
3886
+ *,
3887
+ options: RequestOptions | None = None,
3888
+ ) -> schemas.PrimaryDirectionsResponse:
3889
+ """Get Primary Directions
3890
+
3891
+ Compute primary directions for a natal chart over a date range.
3892
+
3893
+ ``POST /api/v1/western/directions/primary``
3894
+ """
3895
+ return cast("schemas.PrimaryDirectionsResponse", await self._client.request("POST", "/api/v1/western/directions/primary", params=None, json=body, options=options))
3896
+
3897
+ async def primary_exact_aspects(
3898
+ self,
3899
+ body: schemas.PrimaryDirectionsRequest,
3900
+ *,
3901
+ options: RequestOptions | None = None,
3902
+ ) -> schemas.PrimaryDirectionsResponse:
3903
+ """Get Primary Directions Exact Aspects
3904
+
3905
+ ``POST /api/v1/western/directions/primary/exact-aspects``
3906
+ """
3907
+ return cast("schemas.PrimaryDirectionsResponse", await self._client.request("POST", "/api/v1/western/directions/primary/exact-aspects", params=None, json=body, options=options))
3908
+
3909
+ async def primary_search(
3910
+ self,
3911
+ body: schemas.PrimaryDirectionsRequest,
3912
+ *,
3913
+ options: RequestOptions | None = None,
3914
+ ) -> schemas.PrimaryDirectionsResponse:
3915
+ """Search Primary Directions
3916
+
3917
+ ``POST /api/v1/western/directions/primary/search``
3918
+ """
3919
+ return cast("schemas.PrimaryDirectionsResponse", await self._client.request("POST", "/api/v1/western/directions/primary/search", params=None, json=body, options=options))
3920
+
3921
+ async def primary_calendar(
3922
+ self,
3923
+ body: schemas.PrimaryDirectionsRequest,
3924
+ *,
3925
+ options: RequestOptions | None = None,
3926
+ ) -> schemas.PrimaryDirectionsCalendarResponse:
3927
+ """Get Primary Directions Calendar
3928
+
3929
+ ``POST /api/v1/western/directions/primary/calendar``
3930
+ """
3931
+ return cast("schemas.PrimaryDirectionsCalendarResponse", await self._client.request("POST", "/api/v1/western/directions/primary/calendar", params=None, json=body, options=options))
3932
+
3933
+
3934
+ class AsyncWesternChartSimilarityResource:
3935
+ def __init__(self, client: AsyncFreeAstro) -> None:
3936
+ self._client = client
3937
+
3938
+ async def famous_people(
3939
+ self,
3940
+ body: schemas.FamousPeopleChartSimilarityRequest,
3941
+ *,
3942
+ options: RequestOptions | None = None,
3943
+ ) -> schemas.ChartSimilarityResponse:
3944
+ """Compare Famous People Chart Similarity
3945
+
3946
+ ``POST /api/v2/western/chart-similarity/famous-people``
3947
+ """
3948
+ return cast("schemas.ChartSimilarityResponse", await self._client.request("POST", "/api/v2/western/chart-similarity/famous-people", params=None, json=body, options=options))
3949
+
3950
+
3951
+ class AsyncWesternElectionalResource:
3952
+ def __init__(self, client: AsyncFreeAstro) -> None:
3953
+ self._client = client
3954
+
3955
+ async def wedding_search(
3956
+ self,
3957
+ body: schemas.WeddingElectionSearchRequest,
3958
+ *,
3959
+ options: RequestOptions | None = None,
3960
+ ) -> schemas.WeddingElectionSearchResponse:
3961
+ """Search Wedding Elections
3962
+
3963
+ ``POST /api/v2/western/electional/wedding/search``
3964
+ """
3965
+ return cast("schemas.WeddingElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/wedding/search", params=None, json=body, options=options))
3966
+
3967
+ async def making_contracts_search(
3968
+ self,
3969
+ body: schemas.MakingContractsElectionSearchRequest,
3970
+ *,
3971
+ options: RequestOptions | None = None,
3972
+ ) -> schemas.MakingContractsElectionSearchResponse:
3973
+ """Search Making Contracts Elections
3974
+
3975
+ ``POST /api/v2/western/electional/making-contracts/search``
3976
+ """
3977
+ return cast("schemas.MakingContractsElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/making-contracts/search", params=None, json=body, options=options))
3978
+
3979
+ async def job_audition_search(
3980
+ self,
3981
+ body: schemas.JobAuditionElectionSearchRequest,
3982
+ *,
3983
+ options: RequestOptions | None = None,
3984
+ ) -> schemas.JobAuditionElectionSearchResponse:
3985
+ """Search Job Audition Elections
3986
+
3987
+ ``POST /api/v2/western/electional/job-audition/search``
3988
+ """
3989
+ return cast("schemas.JobAuditionElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/job-audition/search", params=None, json=body, options=options))
3990
+
3991
+ async def purchase_property_search(
3992
+ self,
3993
+ body: schemas.PurchasePropertyElectionSearchRequest,
3994
+ *,
3995
+ options: RequestOptions | None = None,
3996
+ ) -> schemas.PurchasePropertyElectionSearchResponse:
3997
+ """Search Purchase Property Elections
3998
+
3999
+ ``POST /api/v2/western/electional/purchase-property/search``
4000
+ """
4001
+ return cast("schemas.PurchasePropertyElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/purchase-property/search", params=None, json=body, options=options))
4002
+
4003
+ async def purchase_car_search(
4004
+ self,
4005
+ body: schemas.PurchaseCarElectionSearchRequest,
4006
+ *,
4007
+ options: RequestOptions | None = None,
4008
+ ) -> schemas.PurchaseCarElectionSearchResponse:
4009
+ """Search Purchase Car Elections
4010
+
4011
+ ``POST /api/v2/western/electional/purchase-car/search``
4012
+ """
4013
+ return cast("schemas.PurchaseCarElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/purchase-car/search", params=None, json=body, options=options))
4014
+
4015
+ async def move_into_new_home_search(
4016
+ self,
4017
+ body: schemas.MoveIntoNewHomeElectionSearchRequest,
4018
+ *,
4019
+ options: RequestOptions | None = None,
4020
+ ) -> schemas.MoveIntoNewHomeElectionSearchResponse:
4021
+ """Search Move Into New Home Elections
4022
+
4023
+ ``POST /api/v2/western/electional/move-into-new-home/search``
4024
+ """
4025
+ return cast("schemas.MoveIntoNewHomeElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/move-into-new-home/search", params=None, json=body, options=options))
4026
+
4027
+ async def starting_journey_search(
4028
+ self,
4029
+ body: schemas.StartingJourneyElectionSearchRequest,
4030
+ *,
4031
+ options: RequestOptions | None = None,
4032
+ ) -> schemas.StartingJourneyElectionSearchResponse:
4033
+ """Search Starting Journey Elections
4034
+
4035
+ ``POST /api/v2/western/electional/starting-journey/search``
4036
+ """
4037
+ return cast("schemas.StartingJourneyElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/starting-journey/search", params=None, json=body, options=options))
4038
+
4039
+ async def legal_proceedings_search(
4040
+ self,
4041
+ body: schemas.LegalProceedingsElectionSearchRequest,
4042
+ *,
4043
+ options: RequestOptions | None = None,
4044
+ ) -> schemas.LegalProceedingsElectionSearchResponse:
4045
+ """Search Legal Proceedings Elections
4046
+
4047
+ ``POST /api/v2/western/electional/legal-proceedings/search``
4048
+ """
4049
+ return cast("schemas.LegalProceedingsElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/legal-proceedings/search", params=None, json=body, options=options))
4050
+
4051
+ async def physical_examination_search(
4052
+ self,
4053
+ body: schemas.PhysicalExaminationElectionSearchRequest,
4054
+ *,
4055
+ options: RequestOptions | None = None,
4056
+ ) -> schemas.PhysicalExaminationElectionSearchResponse:
4057
+ """Search Physical Examination Elections
4058
+
4059
+ ``POST /api/v2/western/electional/physical-examination/search``
4060
+ """
4061
+ return cast("schemas.PhysicalExaminationElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/physical-examination/search", params=None, json=body, options=options))
4062
+
4063
+ async def invest_money_search(
4064
+ self,
4065
+ body: schemas.InvestMoneyElectionSearchRequest,
4066
+ *,
4067
+ options: RequestOptions | None = None,
4068
+ ) -> schemas.InvestMoneyElectionSearchResponse:
4069
+ """Search Invest Money Elections
4070
+
4071
+ ``POST /api/v2/western/electional/invest-money/search``
4072
+ """
4073
+ return cast("schemas.InvestMoneyElectionSearchResponse", await self._client.request("POST", "/api/v2/western/electional/invest-money/search", params=None, json=body, options=options))
4074
+
4075
+
4076
+ class AsyncWesternResourceBase:
4077
+ def __init__(self, client: AsyncFreeAstro) -> None:
4078
+ self._client = client
4079
+ self.solar = AsyncWesternSolarResource(client)
4080
+ self.returns = AsyncWesternReturnsResource(client)
4081
+ self.astrocartography = AsyncWesternAstrocartographyResource(client)
4082
+ self.natal = AsyncWesternNatalResource(client)
4083
+ self.transits = AsyncWesternTransitsResource(client)
4084
+ self.profections = AsyncWesternProfectionsResource(client)
4085
+ self.progressions = AsyncWesternProgressionsResource(client)
4086
+ self.directions = AsyncWesternDirectionsResource(client)
4087
+ self.chart_similarity = AsyncWesternChartSimilarityResource(client)
4088
+ self.electional = AsyncWesternElectionalResource(client)
4089
+
4090
+ async def synastry_v1(
4091
+ self,
4092
+ body: schemas.SynastryRequest,
4093
+ *,
4094
+ aspects: bool | None = None,
4095
+ overlays: bool | None = None,
4096
+ scores: bool | None = None,
4097
+ archetypes: bool | None = None,
4098
+ text: bool | None = None,
4099
+ display_point_labels: bool | None = None,
4100
+ display_aspect_labels: bool | None = None,
4101
+ strength_labels: bool | None = None,
4102
+ ranges: bool | None = None,
4103
+ scoring_bucket_definitions: bool | None = None,
4104
+ options: RequestOptions | None = None,
4105
+ ) -> schemas.SynastryResponse:
4106
+ """Get Synastry
4107
+
4108
+ Detailed Western Synastry analysis.
4109
+ Deterministic, data-rich output including aspects, overlays, scoring, and archetypes.
4110
+ Use query parameters to filter the response size.
4111
+
4112
+ ``POST /api/v1/western/synastry``
4113
+ """
4114
+ return cast("schemas.SynastryResponse", await self._client.request("POST", "/api/v1/western/synastry", params=_query({"aspects": aspects, "overlays": overlays, "scores": scores, "archetypes": archetypes, "text": text, "display_point_labels": display_point_labels, "display_aspect_labels": display_aspect_labels, "strength_labels": strength_labels, "ranges": ranges, "scoring_bucket_definitions": scoring_bucket_definitions}), json=body, options=options))
4115
+
4116
+ async def synastry_simplified(
4117
+ self,
4118
+ body: schemas.SynastryRequest,
4119
+ *,
4120
+ options: RequestOptions | None = None,
4121
+ ) -> schemas.SynastrySimplifiedResponse:
4122
+ """Get Synastry Simplified
4123
+
4124
+ Simplified Synastry analysis.
4125
+ Returns highlights, top aspects, scores, and archetype without full aspect/overlay lists.
4126
+
4127
+ ``POST /api/v1/western/synastry/simplified``
4128
+ """
4129
+ return cast("schemas.SynastrySimplifiedResponse", await self._client.request("POST", "/api/v1/western/synastry/simplified", params=None, json=body, options=options))
4130
+
4131
+ async def synastry_summary(
4132
+ self,
4133
+ body: schemas.SynastryRequest,
4134
+ *,
4135
+ options: RequestOptions | None = None,
4136
+ ) -> schemas.SynastrySummaryResponse:
4137
+ """Get Synastry Summary
4138
+
4139
+ Simplified summary of the synastry chart for general audiences.
4140
+
4141
+ ``POST /api/v1/western/synastry/summary``
4142
+ """
4143
+ return cast("schemas.SynastrySummaryResponse", await self._client.request("POST", "/api/v1/western/synastry/summary", params=None, json=body, options=options))
4144
+
4145
+ async def synastrycards_v1(
4146
+ self,
4147
+ body: schemas.SynastryRequest,
4148
+ *,
4149
+ relationship_context: Literal["romantic", "friendship"] | None = None,
4150
+ include_minor_cards: bool | None = None,
4151
+ options: RequestOptions | None = None,
4152
+ ) -> schemas.SynastryCardsResponse:
4153
+ """Get Synastry Cards
4154
+
4155
+ Card-oriented synastry response designed for mobile apps and compatibility features.
4156
+ - Implements a 5-step polarity scoring system (structure + planet-pair + strength)
4157
+ - Fetches rich interpretation blocks from Supabase based on relationship context
4158
+ - Minor aspect cards are excluded by default; opt in with include_minor_cards=true
4159
+ - Returns a summary (archetype, scores, top strengths / challenges + narrative)
4160
+ and up to 15 aspect cards, each with both supportive and challenging blocks.
4161
+
4162
+ ``POST /api/v1/western/synastrycards``
4163
+ """
4164
+ return cast("schemas.SynastryCardsResponse", await self._client.request("POST", "/api/v1/western/synastrycards", params=_query({"relationship_context": relationship_context, "include_minor_cards": include_minor_cards}), json=body, options=options))
4165
+
4166
+ async def synastry_horoscope_v1(
4167
+ self,
4168
+ body: schemas.CouplesHoroscopeRequest,
4169
+ *,
4170
+ relationship_context: Literal["romantic", "friendship"] | None = None,
4171
+ include_timing: bool | None = None,
4172
+ options: RequestOptions | None = None,
4173
+ ) -> schemas.CouplesHoroscopeResponse:
4174
+ """Get Couples Horoscope
4175
+
4176
+ Daily Couples Horoscope V2.
4177
+ - Multi-dimensional scoring (Romance, Stability, Tension, etc.)
4178
+ - Dual-perspective transits (Composite & Synastry)
4179
+ - Deterministic narrative bands (Theme, Core, Shadow)
4180
+ - Integrated relational rituals
4181
+
4182
+ ``POST /api/v1/western/synastry/horoscope``
4183
+ """
4184
+ return cast("schemas.CouplesHoroscopeResponse", await self._client.request("POST", "/api/v1/western/synastry/horoscope", params=_query({"relationship_context": relationship_context, "include_timing": include_timing}), json=body, options=options))
4185
+
4186
+ async def chat(
4187
+ self,
4188
+ body: schemas.WesternChatRequest,
4189
+ *,
4190
+ options: RequestOptions | None = None,
4191
+ ) -> schemas.WesternChatResponse:
4192
+ """Hosted Western Astrology Chat (v2)
4193
+
4194
+ Generate a grounded Western astrology answer from the scoped Western MCP tools.
4195
+
4196
+ ``POST /api/v2/western/chat``
4197
+ """
4198
+ return cast("schemas.WesternChatResponse", await self._client.request("POST", "/api/v2/western/chat", params=None, json=body, options=options))
4199
+
4200
+ async def synastry(
4201
+ self,
4202
+ body: schemas.SynastryRequest,
4203
+ *,
4204
+ aspects: bool | None = None,
4205
+ overlays: bool | None = None,
4206
+ scores: bool | None = None,
4207
+ archetypes: bool | None = None,
4208
+ text: bool | None = None,
4209
+ display_point_labels: bool | None = None,
4210
+ display_aspect_labels: bool | None = None,
4211
+ strength_labels: bool | None = None,
4212
+ ranges: bool | None = None,
4213
+ scoring_bucket_definitions: bool | None = None,
4214
+ options: RequestOptions | None = None,
4215
+ ) -> schemas.SynastryResponse:
4216
+ """Get Synastry V2
4217
+
4218
+ ``POST /api/v2/western/synastry``
4219
+ """
4220
+ return cast("schemas.SynastryResponse", await self._client.request("POST", "/api/v2/western/synastry", params=_query({"aspects": aspects, "overlays": overlays, "scores": scores, "archetypes": archetypes, "text": text, "display_point_labels": display_point_labels, "display_aspect_labels": display_aspect_labels, "strength_labels": strength_labels, "ranges": ranges, "scoring_bucket_definitions": scoring_bucket_definitions}), json=body, options=options))
4221
+
4222
+ async def synastrycards(
4223
+ self,
4224
+ body: schemas.SynastryRequest,
4225
+ *,
4226
+ relationship_context: Literal["romantic", "friendship"] | None = None,
4227
+ include_minor_cards: bool | None = None,
4228
+ options: RequestOptions | None = None,
4229
+ ) -> schemas.SynastryCardsResponse:
4230
+ """Get Synastry Cards V2
4231
+
4232
+ ``POST /api/v2/western/synastrycards``
4233
+ """
4234
+ return cast("schemas.SynastryCardsResponse", await self._client.request("POST", "/api/v2/western/synastrycards", params=_query({"relationship_context": relationship_context, "include_minor_cards": include_minor_cards}), json=body, options=options))
4235
+
4236
+ async def synastry_horoscope(
4237
+ self,
4238
+ body: schemas.CouplesHoroscopeV2Request,
4239
+ *,
4240
+ include_timing: bool | None = None,
4241
+ options: RequestOptions | None = None,
4242
+ ) -> schemas.CouplesHoroscopeV2Response:
4243
+ """Get Couples Horoscope V2
4244
+
4245
+ ``POST /api/v2/western/synastry/horoscope``
4246
+ """
4247
+ return cast("schemas.CouplesHoroscopeV2Response", await self._client.request("POST", "/api/v2/western/synastry/horoscope", params=_query({"include_timing": include_timing}), json=body, options=options))
4248
+
4249
+
4250
+ class GeneratedResources:
4251
+ """Resources for the operations outside the hand-written ones."""
4252
+
4253
+ ai: AiResource
4254
+ chinese: ChineseResource
4255
+ ephemeris: EphemerisResource
4256
+ horoscope: HoroscopeResource
4257
+ natal: NatalResource
4258
+ numerology: NumerologyResource
4259
+ space: SpaceResource
4260
+ transits: TransitsResource
4261
+ vedic: VedicResource
4262
+
4263
+ def _init_generated_resources(self, client: FreeAstro) -> None:
4264
+ self.ai = AiResource(client)
4265
+ self.chinese = ChineseResource(client)
4266
+ self.ephemeris = EphemerisResource(client)
4267
+ self.horoscope = HoroscopeResource(client)
4268
+ self.natal = NatalResource(client)
4269
+ self.numerology = NumerologyResource(client)
4270
+ self.space = SpaceResource(client)
4271
+ self.transits = TransitsResource(client)
4272
+ self.vedic = VedicResource(client)
4273
+
4274
+
4275
+ class AsyncGeneratedResources:
4276
+ """Resources for the operations outside the hand-written ones."""
4277
+
4278
+ ai: AsyncAiResource
4279
+ chinese: AsyncChineseResource
4280
+ ephemeris: AsyncEphemerisResource
4281
+ horoscope: AsyncHoroscopeResource
4282
+ natal: AsyncNatalResource
4283
+ numerology: AsyncNumerologyResource
4284
+ space: AsyncSpaceResource
4285
+ transits: AsyncTransitsResource
4286
+ vedic: AsyncVedicResource
4287
+
4288
+ def _init_generated_resources(self, client: AsyncFreeAstro) -> None:
4289
+ self.ai = AsyncAiResource(client)
4290
+ self.chinese = AsyncChineseResource(client)
4291
+ self.ephemeris = AsyncEphemerisResource(client)
4292
+ self.horoscope = AsyncHoroscopeResource(client)
4293
+ self.natal = AsyncNatalResource(client)
4294
+ self.numerology = AsyncNumerologyResource(client)
4295
+ self.space = AsyncSpaceResource(client)
4296
+ self.transits = AsyncTransitsResource(client)
4297
+ self.vedic = AsyncVedicResource(client)
4298
+
4299
+
4300
+ @dataclass(frozen=True, slots=True)
4301
+ class OperationInfo:
4302
+ operation_id: str
4303
+ method: str
4304
+ path: str
4305
+ accessor: tuple[str, ...]
4306
+ has_body: bool
4307
+ path_params: tuple[str, ...]
4308
+ required_query: tuple[str, ...]
4309
+ deprecated: bool
4310
+
4311
+ #: Every public operation and the client method that calls it.
4312
+ OPERATIONS: tuple[OperationInfo, ...] = (
4313
+ OperationInfo("simple_natal", "POST", "/natal", ('natal', 'simple'), True, (), (), False),
4314
+ OperationInfo("v1_natal_calculate", "POST", "/api/v1/natal/calculate", ('natal', 'calculate'), True, (), (), False),
4315
+ OperationInfo("v1_natal_report_credits", "GET", "/api/v1/natal/report-credits", ('natal', 'report_credits'), False, (), (), False),
4316
+ OperationInfo("v1_natal_report_job_id", "GET", "/api/v1/natal/report/{job_id}", ('natal', 'report'), False, ('job_id',), (), False),
4317
+ OperationInfo("v1_natal_chart", "POST", "/api/v1/natal/chart/", ('natal', 'chart'), True, (), (), False),
4318
+ OperationInfo("v1_natal_chart_transits", "POST", "/api/v1/natal/chart/transits", ('natal', 'chart_transits'), True, (), (), False),
4319
+ OperationInfo("v1_natal_experimental_transits", "POST", "/api/v1/natal/experimental/transits", ('natal', 'experimental', 'transits'), True, (), (), True),
4320
+ OperationInfo("v1_natal_chart_solar_return", "POST", "/api/v1/natal/chart/solar-return", ('natal', 'chart_solar_return'), True, (), (), False),
4321
+ OperationInfo("v1_natal_experimental_solar_return", "POST", "/api/v1/natal/experimental/solar-return", ('natal', 'experimental', 'solar_return'), True, (), (), True),
4322
+ OperationInfo("v1_natal_chart_secondary_progressions", "POST", "/api/v1/natal/chart/secondary-progressions", ('natal', 'chart_secondary_progressions'), True, (), (), False),
4323
+ OperationInfo("v1_natal_chart_progressions", "POST", "/api/v1/natal/chart/progressions", ('natal', 'chart_progressions'), True, (), (), False),
4324
+ OperationInfo("v1_natal_chart_composite", "POST", "/api/v1/natal/chart/composite", ('natal', 'chart_composite'), True, (), (), False),
4325
+ OperationInfo("v1_natal_chart_synastry", "POST", "/api/v1/natal/chart/synastry", ('natal', 'chart_synastry'), True, (), (), False),
4326
+ OperationInfo("v1_transits_calculate", "POST", "/api/v1/transits/calculate", ('transits', 'calculate'), True, (), (), False),
4327
+ OperationInfo("v1_ephemeris_calculate", "POST", "/api/v1/ephemeris/calculate", ('ephemeris', 'calculate'), True, (), (), False),
4328
+ OperationInfo("v1_ephemeris", "GET", "/api/v1/ephemeris", ('ephemeris', 'get'), False, (), ('start',), False),
4329
+ OperationInfo("v1_sky_events", "GET", "/api/v1/sky-events", ('sky_events', 'list'), False, (), ('date',), False),
4330
+ OperationInfo("v1_numerology_methods", "GET", "/api/v1/numerology/methods", ('numerology', 'methods'), False, (), (), False),
4331
+ OperationInfo("v1_numerology_alphabets", "GET", "/api/v1/numerology/alphabets", ('numerology', 'alphabets'), False, (), (), False),
4332
+ OperationInfo("v1_numerology_profile", "POST", "/api/v1/numerology/profile", ('numerology', 'profile'), True, (), (), False),
4333
+ OperationInfo("v1_vedic_match", "POST", "/api/v1/vedic/match", ('vedic', 'match_v1'), True, (), (), False),
4334
+ OperationInfo("v1_vedic_chart", "POST", "/api/v1/vedic/chart", ('vedic', 'chart_v1'), True, (), (), False),
4335
+ OperationInfo("v1_vedic_calculate", "POST", "/api/v1/vedic/calculate", ('vedic', 'calculate_v1'), True, (), (), False),
4336
+ OperationInfo("v1_vedic_dasha", "POST", "/api/v1/vedic/dasha", ('vedic', 'dasha_v1'), True, (), (), False),
4337
+ OperationInfo("v1_vedic_dasha_insights", "POST", "/api/v1/vedic/dasha/insights", ('vedic', 'dasha_insights_v1'), True, (), (), False),
4338
+ OperationInfo("v1_vedic_transits_insights", "POST", "/api/v1/vedic/transits/insights", ('vedic', 'transits', 'insights'), True, (), (), False),
4339
+ OperationInfo("v1_vedic_gochar_timeline", "POST", "/api/v1/vedic/gochar/timeline", ('vedic', 'gochar', 'timeline_v1'), True, (), (), False),
4340
+ OperationInfo("v1_vedic_gochar_timeline_insights", "POST", "/api/v1/vedic/gochar/timeline/insights", ('vedic', 'gochar', 'timeline_insights_v1'), True, (), (), False),
4341
+ OperationInfo("v1_vedic_yogas", "POST", "/api/v1/vedic/yogas", ('vedic', 'yogas_v1'), True, (), (), False),
4342
+ OperationInfo("v1_vedic_strength", "POST", "/api/v1/vedic/strength", ('vedic', 'strength_v1'), True, (), (), False),
4343
+ OperationInfo("v1_vedic_vargas", "POST", "/api/v1/vedic/vargas", ('vedic', 'vargas_v1'), True, (), (), False),
4344
+ OperationInfo("v1_vedic_compatibility", "POST", "/api/v1/vedic/compatibility", ('vedic', 'compatibility_v1'), True, (), (), False),
4345
+ OperationInfo("v1_vedic_panchang", "POST", "/api/v1/vedic/panchang", ('vedic', 'panchang_v1'), True, (), (), False),
4346
+ OperationInfo("v1_vedic_batch", "POST", "/api/v1/vedic/batch", ('vedic', 'batch'), True, (), (), False),
4347
+ OperationInfo("v1_chinese_bazi", "POST", "/api/v1/chinese/bazi", ('chinese', 'bazi'), True, (), (), False),
4348
+ OperationInfo("v1_chinese_bazi_flow", "POST", "/api/v1/chinese/bazi/flow", ('chinese', 'bazi_flow'), True, (), (), False),
4349
+ OperationInfo("v1_chinese_bazi_dictionary", "GET", "/api/v1/chinese/bazi/dictionary", ('chinese', 'bazi_dictionary'), False, (), (), False),
4350
+ OperationInfo("v1_chinese_today", "GET", "/api/v1/chinese/today", ('chinese', 'today'), False, (), (), False),
4351
+ OperationInfo("v1_chinese_calendar_date", "GET", "/api/v1/chinese/calendar/{date}", ('chinese', 'calendar'), False, ('date',), (), False),
4352
+ OperationInfo("v1_chinese_bazi_time_correction", "POST", "/api/v1/chinese/bazi/time-correction", ('chinese', 'bazi_time_correction'), True, (), (), False),
4353
+ OperationInfo("v1_chinese_bazi_synastry", "POST", "/api/v1/chinese/bazi/synastry", ('chinese', 'bazi_synastry'), True, (), (), False),
4354
+ OperationInfo("v1_chinese_bazi_lifespan", "POST", "/api/v1/chinese/bazi/lifespan", ('chinese', 'bazi_lifespan'), True, (), (), False),
4355
+ OperationInfo("v1_chinese_bazi_health", "POST", "/api/v1/chinese/bazi/health", ('chinese', 'bazi_health'), True, (), (), False),
4356
+ OperationInfo("v1_geo_search", "GET", "/api/v1/geo/search", ('geo', 'search_v1'), False, (), (), True),
4357
+ OperationInfo("v1_western_synastry", "POST", "/api/v1/western/synastry", ('western', 'synastry_v1'), True, (), (), False),
4358
+ OperationInfo("v1_western_synastry_simplified", "POST", "/api/v1/western/synastry/simplified", ('western', 'synastry_simplified'), True, (), (), False),
4359
+ OperationInfo("v1_western_synastry_summary", "POST", "/api/v1/western/synastry/summary", ('western', 'synastry_summary'), True, (), (), False),
4360
+ OperationInfo("v1_western_synastrycards", "POST", "/api/v1/western/synastrycards", ('western', 'synastrycards_v1'), True, (), (), False),
4361
+ OperationInfo("v1_western_synastry_horoscope", "POST", "/api/v1/western/synastry/horoscope", ('western', 'synastry_horoscope_v1'), True, (), (), False),
4362
+ OperationInfo("v1_western_solar_calculate", "POST", "/api/v1/western/solar/calculate", ('western', 'solar', 'calculate'), True, (), (), False),
4363
+ OperationInfo("v1_western_returns_calculate", "POST", "/api/v1/western/returns/calculate", ('western', 'returns', 'calculate'), True, (), (), False),
4364
+ OperationInfo("v1_western_astrocartography_lines", "POST", "/api/v1/western/astrocartography/lines", ('western', 'astrocartography', 'lines'), True, (), (), False),
4365
+ OperationInfo("v1_western_astrocartography_recommendations", "POST", "/api/v1/western/astrocartography/recommendations", ('western', 'astrocartography', 'recommendations'), True, (), (), False),
4366
+ OperationInfo("v1_western_astrocartography_parans", "POST", "/api/v1/western/astrocartography/parans", ('western', 'astrocartography', 'parans'), True, (), (), False),
4367
+ OperationInfo("v1_western_astrocartography_relocation", "POST", "/api/v1/western/astrocartography/relocation", ('western', 'astrocartography', 'relocation'), True, (), (), False),
4368
+ OperationInfo("v1_western_astrocartography_city_check", "POST", "/api/v1/western/astrocartography/city-check", ('western', 'astrocartography', 'city_check'), True, (), (), False),
4369
+ OperationInfo("v1_western_natal_insights", "POST", "/api/v1/western/natal/insights", ('western', 'natal', 'insights'), True, (), (), False),
4370
+ OperationInfo("v1_western_natal_insights_index_documents", "POST", "/api/v1/western/natal/insights/index-documents", ('western', 'natal', 'insights_index_documents'), True, (), (), False),
4371
+ OperationInfo("v1_western_transits_insights", "POST", "/api/v1/western/transits/insights", ('western', 'transits', 'insights'), True, (), (), False),
4372
+ OperationInfo("v1_western_transits_timeline", "POST", "/api/v1/western/transits/timeline", ('western', 'transits', 'timeline'), True, (), (), False),
4373
+ OperationInfo("v1_western_transits_timeline_index_documents", "POST", "/api/v1/western/transits/timeline/index-documents", ('western', 'transits', 'timeline_index_documents'), True, (), (), False),
4374
+ OperationInfo("v1_western_transits_search", "POST", "/api/v1/western/transits/search", ('western', 'transits', 'search'), True, (), (), False),
4375
+ OperationInfo("v1_western_profections_annual", "POST", "/api/v1/western/profections/annual", ('western', 'profections', 'annual'), True, (), (), False),
4376
+ OperationInfo("v1_western_progressions_secondary", "POST", "/api/v1/western/progressions/secondary", ('western', 'progressions', 'secondary'), True, (), (), False),
4377
+ OperationInfo("v1_western_directions_primary", "POST", "/api/v1/western/directions/primary", ('western', 'directions', 'primary'), True, (), (), False),
4378
+ OperationInfo("v1_western_directions_primary_exact_aspects", "POST", "/api/v1/western/directions/primary/exact-aspects", ('western', 'directions', 'primary_exact_aspects'), True, (), (), False),
4379
+ OperationInfo("v1_western_directions_primary_search", "POST", "/api/v1/western/directions/primary/search", ('western', 'directions', 'primary_search'), True, (), (), False),
4380
+ OperationInfo("v1_western_directions_primary_calendar", "POST", "/api/v1/western/directions/primary/calendar", ('western', 'directions', 'primary_calendar'), True, (), (), False),
4381
+ OperationInfo("v1_western_progressions_converse_secondary", "POST", "/api/v1/western/progressions/converse-secondary", ('western', 'progressions', 'converse_secondary'), True, (), (), False),
4382
+ OperationInfo("v1_western_progressions_tertiary", "POST", "/api/v1/western/progressions/tertiary", ('western', 'progressions', 'tertiary'), True, (), (), False),
4383
+ OperationInfo("v1_western_progressions_quotidian", "POST", "/api/v1/western/progressions/quotidian", ('western', 'progressions', 'quotidian'), True, (), (), False),
4384
+ OperationInfo("v1_western_progressions_quaternary", "POST", "/api/v1/western/progressions/quaternary", ('western', 'progressions', 'quaternary'), True, (), (), False),
4385
+ OperationInfo("v1_western_progressions_secondary_exact_ingresses", "POST", "/api/v1/western/progressions/secondary/exact-ingresses", ('western', 'progressions', 'secondary_exact_ingresses'), True, (), (), False),
4386
+ OperationInfo("v1_western_progressions_converse_secondary_exact_ingresses", "POST", "/api/v1/western/progressions/converse-secondary/exact-ingresses", ('western', 'progressions', 'converse_secondary_exact_ingresses'), True, (), (), False),
4387
+ OperationInfo("v1_western_progressions_tertiary_exact_ingresses", "POST", "/api/v1/western/progressions/tertiary/exact-ingresses", ('western', 'progressions', 'tertiary_exact_ingresses'), True, (), (), False),
4388
+ OperationInfo("v1_western_progressions_quotidian_exact_ingresses", "POST", "/api/v1/western/progressions/quotidian/exact-ingresses", ('western', 'progressions', 'quotidian_exact_ingresses'), True, (), (), False),
4389
+ OperationInfo("v1_western_progressions_quaternary_exact_ingresses", "POST", "/api/v1/western/progressions/quaternary/exact-ingresses", ('western', 'progressions', 'quaternary_exact_ingresses'), True, (), (), False),
4390
+ OperationInfo("v1_western_progressions_secondary_exact_aspects", "POST", "/api/v1/western/progressions/secondary/exact-aspects", ('western', 'progressions', 'secondary_exact_aspects'), True, (), (), False),
4391
+ OperationInfo("v1_western_progressions_converse_secondary_exact_aspects", "POST", "/api/v1/western/progressions/converse-secondary/exact-aspects", ('western', 'progressions', 'converse_secondary_exact_aspects'), True, (), (), False),
4392
+ OperationInfo("v1_western_progressions_tertiary_exact_aspects", "POST", "/api/v1/western/progressions/tertiary/exact-aspects", ('western', 'progressions', 'tertiary_exact_aspects'), True, (), (), False),
4393
+ OperationInfo("v1_western_progressions_quotidian_exact_aspects", "POST", "/api/v1/western/progressions/quotidian/exact-aspects", ('western', 'progressions', 'quotidian_exact_aspects'), True, (), (), False),
4394
+ OperationInfo("v1_western_progressions_quaternary_exact_aspects", "POST", "/api/v1/western/progressions/quaternary/exact-aspects", ('western', 'progressions', 'quaternary_exact_aspects'), True, (), (), False),
4395
+ OperationInfo("v1_western_progressions_secondary_calendar", "POST", "/api/v1/western/progressions/secondary/calendar", ('western', 'progressions', 'secondary_calendar'), True, (), (), False),
4396
+ OperationInfo("v1_western_progressions_converse_secondary_calendar", "POST", "/api/v1/western/progressions/converse-secondary/calendar", ('western', 'progressions', 'converse_secondary_calendar'), True, (), (), False),
4397
+ OperationInfo("v1_western_progressions_tertiary_calendar", "POST", "/api/v1/western/progressions/tertiary/calendar", ('western', 'progressions', 'tertiary_calendar'), True, (), (), False),
4398
+ OperationInfo("v1_western_progressions_quotidian_calendar", "POST", "/api/v1/western/progressions/quotidian/calendar", ('western', 'progressions', 'quotidian_calendar'), True, (), (), False),
4399
+ OperationInfo("v1_western_progressions_quaternary_calendar", "POST", "/api/v1/western/progressions/quaternary/calendar", ('western', 'progressions', 'quaternary_calendar'), True, (), (), False),
4400
+ OperationInfo("v1_western_signs_sun", "POST", "/api/v1/western/signs/sun", ('western', 'signs', 'sun'), True, (), (), False),
4401
+ OperationInfo("v1_western_signs_moon", "POST", "/api/v1/western/signs/moon", ('western', 'signs', 'moon'), True, (), (), False),
4402
+ OperationInfo("v1_western_signs_rising", "POST", "/api/v1/western/signs/rising", ('western', 'signs', 'rising'), True, (), (), False),
4403
+ OperationInfo("v1_western_signs_midheaven", "POST", "/api/v1/western/signs/midheaven", ('western', 'signs', 'midheaven'), True, (), (), False),
4404
+ OperationInfo("v1_horoscope_daily_sign", "GET", "/api/v1/horoscope/daily/sign", ('horoscope', 'daily', 'sign_v1'), False, (), ('sign',), False),
4405
+ OperationInfo("v1_horoscope_daily_bulk", "GET", "/api/v1/horoscope/daily/bulk", ('horoscope', 'daily', 'bulk'), False, (), (), False),
4406
+ OperationInfo("v1_horoscope_daily_personal", "POST", "/api/v1/horoscope/daily/personal", ('horoscope', 'daily', 'personal_v1'), True, (), (), False),
4407
+ OperationInfo("v1_ai_generate", "POST", "/api/v1/ai/generate", ('ai', 'generate'), True, (), (), False),
4408
+ OperationInfo("v1_moon_phase", "GET", "/api/v1/moon/phase", ('moon', 'phase'), False, (), (), False),
4409
+ OperationInfo("v1_moon_month", "GET", "/api/v1/moon/month", ('moon', 'month'), False, (), ('year', 'month'), False),
4410
+ OperationInfo("v1_space_chart", "POST", "/api/v1/space/chart", ('space', 'chart'), True, (), (), False),
4411
+ OperationInfo("v1_space_chart_svg", "POST", "/api/v1/space/chart/svg", ('space', 'chart_svg'), True, (), (), False),
4412
+ OperationInfo("v2_geo_search", "GET", "/api/v2/geo/search", ('geo', 'search'), False, (), ('q',), False),
4413
+ OperationInfo("v2_horoscope_daily_sign", "GET", "/api/v2/horoscope/daily/sign", ('horoscope', 'daily', 'sign_v2'), False, (), ('sign',), False),
4414
+ OperationInfo("v2_horoscope_daily_personal", "POST", "/api/v2/horoscope/daily/personal", ('horoscope', 'daily', 'personal_v2'), True, (), (), False),
4415
+ OperationInfo("v2_vedic_chat", "POST", "/api/v2/vedic/chat", ('vedic', 'chat'), True, (), (), False),
4416
+ OperationInfo("v2_vedic_calculate", "POST", "/api/v2/vedic/calculate", ('vedic', 'calculate'), True, (), (), False),
4417
+ OperationInfo("v2_vedic_kp", "POST", "/api/v2/vedic/kp", ('vedic', 'kp'), True, (), (), False),
4418
+ OperationInfo("v2_vedic_kp_render", "POST", "/api/v2/vedic/kp/render", ('vedic', 'kp_render'), True, (), (), False),
4419
+ OperationInfo("v2_vedic_chart", "POST", "/api/v2/vedic/chart", ('vedic', 'chart'), True, (), (), False),
4420
+ OperationInfo("v2_vedic_visual_chart", "POST", "/api/v2/vedic/visual/chart", ('vedic', 'visual', 'chart'), True, (), (), False),
4421
+ OperationInfo("v2_vedic_vargas", "POST", "/api/v2/vedic/vargas", ('vedic', 'vargas'), True, (), (), False),
4422
+ OperationInfo("v2_vedic_dasha", "POST", "/api/v2/vedic/dasha", ('vedic', 'dasha'), True, (), (), False),
4423
+ OperationInfo("v2_vedic_dasha_insights", "POST", "/api/v2/vedic/dasha/insights", ('vedic', 'dasha_insights'), True, (), (), False),
4424
+ OperationInfo("v2_vedic_gochar_timeline", "POST", "/api/v2/vedic/gochar/timeline", ('vedic', 'gochar', 'timeline'), True, (), (), False),
4425
+ OperationInfo("v2_vedic_gochar_timeline_insights", "POST", "/api/v2/vedic/gochar/timeline/insights", ('vedic', 'gochar', 'timeline_insights'), True, (), (), False),
4426
+ OperationInfo("v2_vedic_horoscope_daily_sign", "GET", "/api/v2/vedic/horoscope/daily/sign", ('vedic', 'horoscope', 'daily_sign'), False, (), ('sign',), False),
4427
+ OperationInfo("v2_vedic_horoscope_daily_bulk", "GET", "/api/v2/vedic/horoscope/daily/bulk", ('vedic', 'horoscope', 'daily_bulk'), False, (), (), False),
4428
+ OperationInfo("v2_vedic_horoscope_daily_personal", "POST", "/api/v2/vedic/horoscope/daily/personal", ('vedic', 'horoscope', 'daily_personal'), True, (), (), False),
4429
+ OperationInfo("v2_vedic_yogas", "POST", "/api/v2/vedic/yogas", ('vedic', 'yogas'), True, (), (), False),
4430
+ OperationInfo("v2_vedic_strength", "POST", "/api/v2/vedic/strength", ('vedic', 'strength'), True, (), (), False),
4431
+ OperationInfo("v2_vedic_compatibility", "POST", "/api/v2/vedic/compatibility", ('vedic', 'compatibility'), True, (), (), False),
4432
+ OperationInfo("v2_vedic_match", "POST", "/api/v2/vedic/match", ('vedic', 'match'), True, (), (), False),
4433
+ OperationInfo("v2_vedic_panchang", "POST", "/api/v2/vedic/panchang", ('vedic', 'panchang'), True, (), (), False),
4434
+ OperationInfo("v2_vedic_qa", "POST", "/api/v2/vedic/qa", ('vedic', 'qa'), True, (), (), False),
4435
+ OperationInfo("v2_vedic_muhurat_search", "POST", "/api/v2/vedic/muhurat/search", ('vedic', 'muhurat', 'search'), True, (), (), False),
4436
+ OperationInfo("v2_vedic_muhurat_personalized_search", "POST", "/api/v2/vedic/muhurat/personalized-search", ('vedic', 'muhurat', 'personalized_search'), True, (), (), False),
4437
+ OperationInfo("v2_western_chat", "POST", "/api/v2/western/chat", ('western', 'chat'), True, (), (), False),
4438
+ OperationInfo("v2_western_synastry", "POST", "/api/v2/western/synastry", ('western', 'synastry'), True, (), (), False),
4439
+ OperationInfo("v2_western_synastrycards", "POST", "/api/v2/western/synastrycards", ('western', 'synastrycards'), True, (), (), False),
4440
+ OperationInfo("v2_western_chart_similarity_famous_people", "POST", "/api/v2/western/chart-similarity/famous-people", ('western', 'chart_similarity', 'famous_people'), True, (), (), False),
4441
+ OperationInfo("v2_western_synastry_horoscope", "POST", "/api/v2/western/synastry/horoscope", ('western', 'synastry_horoscope'), True, (), (), False),
4442
+ OperationInfo("v2_western_electional_wedding_search", "POST", "/api/v2/western/electional/wedding/search", ('western', 'electional', 'wedding_search'), True, (), (), False),
4443
+ OperationInfo("v2_western_electional_making_contracts_search", "POST", "/api/v2/western/electional/making-contracts/search", ('western', 'electional', 'making_contracts_search'), True, (), (), False),
4444
+ OperationInfo("v2_western_electional_job_audition_search", "POST", "/api/v2/western/electional/job-audition/search", ('western', 'electional', 'job_audition_search'), True, (), (), False),
4445
+ OperationInfo("v2_western_electional_purchase_property_search", "POST", "/api/v2/western/electional/purchase-property/search", ('western', 'electional', 'purchase_property_search'), True, (), (), False),
4446
+ OperationInfo("v2_western_electional_purchase_car_search", "POST", "/api/v2/western/electional/purchase-car/search", ('western', 'electional', 'purchase_car_search'), True, (), (), False),
4447
+ OperationInfo("v2_western_electional_move_into_new_home_search", "POST", "/api/v2/western/electional/move-into-new-home/search", ('western', 'electional', 'move_into_new_home_search'), True, (), (), False),
4448
+ OperationInfo("v2_western_electional_starting_journey_search", "POST", "/api/v2/western/electional/starting-journey/search", ('western', 'electional', 'starting_journey_search'), True, (), (), False),
4449
+ OperationInfo("v2_western_electional_legal_proceedings_search", "POST", "/api/v2/western/electional/legal-proceedings/search", ('western', 'electional', 'legal_proceedings_search'), True, (), (), False),
4450
+ OperationInfo("v2_western_electional_physical_examination_search", "POST", "/api/v2/western/electional/physical-examination/search", ('western', 'electional', 'physical_examination_search'), True, (), (), False),
4451
+ OperationInfo("v2_western_electional_invest_money_search", "POST", "/api/v2/western/electional/invest-money/search", ('western', 'electional', 'invest_money_search'), True, (), (), False),
4452
+ OperationInfo("v3_horoscope_daily_sign", "GET", "/api/v3/horoscope/daily/sign", ('horoscope', 'daily', 'sign'), False, (), ('sign',), False),
4453
+ OperationInfo("v3_horoscope_daily_personal", "POST", "/api/v3/horoscope/daily/personal", ('horoscope', 'daily', 'personal'), True, (), (), False),
4454
+ OperationInfo("v3_horoscope_weekly_personal", "POST", "/api/v3/horoscope/weekly/personal", ('horoscope', 'weekly', 'personal'), True, (), (), False),
4455
+ )