roxy-sdk 1.2.1__tar.gz → 1.3.0__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roxy-sdk
3
- Version: 1.2.1
3
+ Version: 1.3.0
4
4
  Summary: Python SDK for RoxyAPI. Astrology, tarot, numerology, and more.
5
5
  Keywords: astrology,vedic,tarot,numerology,horoscope,kundli,birth-chart,natal-chart,iching,crystals,angel-numbers,dreams,biorhythm,spiritual,api,sdk,async,fastapi,ai-agent,mcp,llm
6
6
  License-Expression: MIT
@@ -120,6 +120,7 @@ kundli = roxy.vedic_astrology.generate_birth_chart(
120
120
  | [Angel Numbers](https://roxyapi.com/api-reference/angel-numbers) | `roxy.angel_numbers` | 4 | Angel numbers API with meanings for 111, 222, 333, 444, 555, 666, 777, 888, 999, 1111, and 75+ sequences covering eve... |
121
121
  | [Location and Timezone](https://roxyapi.com/api-reference/location-and-timezone) | `roxy.location` | 3 | Timezone and location API with city search and geocoding across 5,180,000+ cities, towns and villages in 240+ countri... |
122
122
  | [Usage](https://roxyapi.com/api-reference/usage) | `roxy.usage` | 1 | Monitor your API usage, check rate limits, and track request consumption |
123
+ | [Reports](https://roxyapi.com/api-reference/reports) | `roxy.reports` | 9 | Branded reports built from the API: a natal chart and more as a print-ready PDF, self-contained HTML or Markdown, whi... |
123
124
  | [Languages](https://roxyapi.com/api-reference/languages) | `roxy.languages` | 2 | List the response languages accepted by the `lang` query parameter on every i18n-aware endpoint |
124
125
  <!-- END:DOMAINS -->
125
126
 
@@ -480,7 +481,7 @@ Never expose your API key client-side. Call Roxy from server code only.
480
481
  ## Multi-language responses
481
482
 
482
483
  <!-- BEGIN:LANGS -->
483
- Interpretations and editorial text are available in 10 languages: `en`, `tr`, `de`, `es`, `hi`, `pt`, `fr`, `ru`, `zh-Hans`, `zh-Hant`. Pass `lang` as a keyword argument on any supported method. Defaults to `en`. Supported: `astrology`, `vedic_astrology`, `forecast`, `human_design`, `chinese_astrology`, `feng_shui`, `mesoamerican_astrology`, `vastu`, `numerology`, `kabbalah`, `tarot`, `biorhythm`, `ayurveda`, `iching`, `crystals`, `angel_numbers`, `languages`. English-only: `dreams`, `location`, `usage`. Languages without translations yet fall back to English.
484
+ Interpretations and editorial text are available in 10 languages: `en`, `tr`, `de`, `es`, `hi`, `pt`, `fr`, `ru`, `zh-Hans`, `zh-Hant`. Pass `lang` as a keyword argument on any supported method. Defaults to `en`. Supported: `astrology`, `vedic_astrology`, `forecast`, `human_design`, `chinese_astrology`, `feng_shui`, `mesoamerican_astrology`, `vastu`, `numerology`, `kabbalah`, `tarot`, `biorhythm`, `ayurveda`, `iching`, `crystals`, `angel_numbers`, `reports`, `languages`. English-only: `dreams`, `location`, `usage`. Languages without translations yet fall back to English.
484
485
  <!-- END:LANGS -->
485
486
 
486
487
  ```python
@@ -518,6 +519,9 @@ Every error returns `{ error, code, doc_url }`. Switch on `code`; `error` is rea
518
519
  | 400 | `validation_error` | A field is missing or invalid. The body lists every failing field at once in issues, each with its path and the expected shape. |
519
520
  | 400 | `bad_request` | The request was rejected as a whole, for example a body that is not valid JSON or a date range that ends before it starts. |
520
521
  | 400 | `date_out_of_range` | A date lies outside the span the planetary positions are served for. The error names the supported dates. |
522
+ | 400 | `invalid_branding` | The report branding cannot be used, for example a logo that is not a PNG, JPEG, WebP or SVG image. |
523
+ | 400 | `logo_fetch_failed` | The report logo could not be fetched: it must be an HTTPS URL on a public host that answers within the size limit. |
524
+ | 400 | `unsupported_character` | The report text holds a character no report font draws. The error names it: remove or replace it. |
521
525
  | 401 | `api_key_required` | No API key was sent. |
522
526
  | 401 | `invalid_api_key` | The key sent is malformed or cannot be verified. |
523
527
  | 401 | `api_key_revoked` | The key was valid once and has since been revoked from the account page. |
@@ -540,8 +544,11 @@ Every error returns `{ error, code, doc_url }`. Switch on `code`; `error` is rea
540
544
  | 429 | `rate_limit_per_minute` | The per-minute limit of the plan was reached. Retry-After gives the seconds to the next minute, and the monthly allowance is not charged. |
541
545
  | 429 | `rate_limited` | A rate limit was reached, reported without the plan detail. |
542
546
  | 429 | `free_tier_exhausted` | A keyless request has used up its trial allowance. |
547
+ | 429 | `reports_rate_limited` | Too many reports were requested this minute. Retry-After gives the seconds to the next minute. |
543
548
  | 500 | `internal_error` | The request failed inside our service. Retry with exponential backoff. |
544
549
  | 503 | `compute_saturated` | Heavy calculations are briefly at capacity. Send the same request again after Retry-After seconds. |
550
+ | 503 | `reports_busy` | Report rendering is briefly at capacity. Send the same request again after Retry-After seconds. |
551
+ | 503 | `report_render_timeout` | The report took too long to render. Send the same request again. |
545
552
  | Any | `error` | A fallback for a status with no more specific code. The status and the error field carry the signal. |
546
553
  <!-- END:ERRORS -->
547
554
 
@@ -97,6 +97,7 @@ kundli = roxy.vedic_astrology.generate_birth_chart(
97
97
  | [Angel Numbers](https://roxyapi.com/api-reference/angel-numbers) | `roxy.angel_numbers` | 4 | Angel numbers API with meanings for 111, 222, 333, 444, 555, 666, 777, 888, 999, 1111, and 75+ sequences covering eve... |
98
98
  | [Location and Timezone](https://roxyapi.com/api-reference/location-and-timezone) | `roxy.location` | 3 | Timezone and location API with city search and geocoding across 5,180,000+ cities, towns and villages in 240+ countri... |
99
99
  | [Usage](https://roxyapi.com/api-reference/usage) | `roxy.usage` | 1 | Monitor your API usage, check rate limits, and track request consumption |
100
+ | [Reports](https://roxyapi.com/api-reference/reports) | `roxy.reports` | 9 | Branded reports built from the API: a natal chart and more as a print-ready PDF, self-contained HTML or Markdown, whi... |
100
101
  | [Languages](https://roxyapi.com/api-reference/languages) | `roxy.languages` | 2 | List the response languages accepted by the `lang` query parameter on every i18n-aware endpoint |
101
102
  <!-- END:DOMAINS -->
102
103
 
@@ -457,7 +458,7 @@ Never expose your API key client-side. Call Roxy from server code only.
457
458
  ## Multi-language responses
458
459
 
459
460
  <!-- BEGIN:LANGS -->
460
- Interpretations and editorial text are available in 10 languages: `en`, `tr`, `de`, `es`, `hi`, `pt`, `fr`, `ru`, `zh-Hans`, `zh-Hant`. Pass `lang` as a keyword argument on any supported method. Defaults to `en`. Supported: `astrology`, `vedic_astrology`, `forecast`, `human_design`, `chinese_astrology`, `feng_shui`, `mesoamerican_astrology`, `vastu`, `numerology`, `kabbalah`, `tarot`, `biorhythm`, `ayurveda`, `iching`, `crystals`, `angel_numbers`, `languages`. English-only: `dreams`, `location`, `usage`. Languages without translations yet fall back to English.
461
+ Interpretations and editorial text are available in 10 languages: `en`, `tr`, `de`, `es`, `hi`, `pt`, `fr`, `ru`, `zh-Hans`, `zh-Hant`. Pass `lang` as a keyword argument on any supported method. Defaults to `en`. Supported: `astrology`, `vedic_astrology`, `forecast`, `human_design`, `chinese_astrology`, `feng_shui`, `mesoamerican_astrology`, `vastu`, `numerology`, `kabbalah`, `tarot`, `biorhythm`, `ayurveda`, `iching`, `crystals`, `angel_numbers`, `reports`, `languages`. English-only: `dreams`, `location`, `usage`. Languages without translations yet fall back to English.
461
462
  <!-- END:LANGS -->
462
463
 
463
464
  ```python
@@ -495,6 +496,9 @@ Every error returns `{ error, code, doc_url }`. Switch on `code`; `error` is rea
495
496
  | 400 | `validation_error` | A field is missing or invalid. The body lists every failing field at once in issues, each with its path and the expected shape. |
496
497
  | 400 | `bad_request` | The request was rejected as a whole, for example a body that is not valid JSON or a date range that ends before it starts. |
497
498
  | 400 | `date_out_of_range` | A date lies outside the span the planetary positions are served for. The error names the supported dates. |
499
+ | 400 | `invalid_branding` | The report branding cannot be used, for example a logo that is not a PNG, JPEG, WebP or SVG image. |
500
+ | 400 | `logo_fetch_failed` | The report logo could not be fetched: it must be an HTTPS URL on a public host that answers within the size limit. |
501
+ | 400 | `unsupported_character` | The report text holds a character no report font draws. The error names it: remove or replace it. |
498
502
  | 401 | `api_key_required` | No API key was sent. |
499
503
  | 401 | `invalid_api_key` | The key sent is malformed or cannot be verified. |
500
504
  | 401 | `api_key_revoked` | The key was valid once and has since been revoked from the account page. |
@@ -517,8 +521,11 @@ Every error returns `{ error, code, doc_url }`. Switch on `code`; `error` is rea
517
521
  | 429 | `rate_limit_per_minute` | The per-minute limit of the plan was reached. Retry-After gives the seconds to the next minute, and the monthly allowance is not charged. |
518
522
  | 429 | `rate_limited` | A rate limit was reached, reported without the plan detail. |
519
523
  | 429 | `free_tier_exhausted` | A keyless request has used up its trial allowance. |
524
+ | 429 | `reports_rate_limited` | Too many reports were requested this minute. Retry-After gives the seconds to the next minute. |
520
525
  | 500 | `internal_error` | The request failed inside our service. Retry with exponential backoff. |
521
526
  | 503 | `compute_saturated` | Heavy calculations are briefly at capacity. Send the same request again after Retry-After seconds. |
527
+ | 503 | `reports_busy` | Report rendering is briefly at capacity. Send the same request again after Retry-After seconds. |
528
+ | 503 | `report_render_timeout` | The report took too long to render. Send the same request again. |
522
529
  | Any | `error` | A fallback for a status with no more specific code. The status and the error field carry the signal. |
523
530
  <!-- END:ERRORS -->
524
531
 
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "roxy-sdk"
7
- version = "1.2.1"
7
+ version = "1.3.0"
8
8
  description = "Python SDK for RoxyAPI. Astrology, tarot, numerology, and more."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "roxy-sdk"
7
- version = "1.2.1"
7
+ version = "1.3.0"
8
8
  description = "Python SDK for RoxyAPI. Astrology, tarot, numerology, and more."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -60,6 +60,7 @@ Type `roxy.` to see all available namespaces. Type `roxy.{domain}.` in an IDE wi
60
60
  | [`roxy.angel_numbers`](https://roxyapi.com/api-reference/angel-numbers) | 4 | Angel numbers API with meanings for 111, 222, 333, 444, 555, 666, 777, 888, 999, 1111, and 75+ sequences covering eve... |
61
61
  | [`roxy.location`](https://roxyapi.com/api-reference/location-and-timezone) | 3 | Timezone and location API with city search and geocoding across 5,180,000+ cities, towns and villages in 240+ countri... |
62
62
  | [`roxy.usage`](https://roxyapi.com/api-reference/usage) | 1 | Monitor your API usage, check rate limits, and track request consumption |
63
+ | [`roxy.reports`](https://roxyapi.com/api-reference/reports) | 9 | Branded reports built from the API: a natal chart and more as a print-ready PDF, self-contained HTML or Markdown, whi... |
63
64
  | [`roxy.languages`](https://roxyapi.com/api-reference/languages) | 2 | List the response languages accepted by the `lang` query parameter on every i18n-aware endpoint |
64
65
  <!-- END:DOMAINS -->
65
66
 
@@ -146,7 +147,7 @@ numerology = roxy.numerology.generate_numerology_chart(
146
147
  ### Multi-language via `lang` kwarg
147
148
 
148
149
  <!-- BEGIN:LANGS -->
149
- 10 languages: `en`, `tr`, `de`, `es`, `hi`, `pt`, `fr`, `ru`, `zh-Hans`, `zh-Hant`. Defaults to `en`. Supported: `astrology`, `vedic_astrology`, `forecast`, `human_design`, `chinese_astrology`, `feng_shui`, `mesoamerican_astrology`, `vastu`, `numerology`, `kabbalah`, `tarot`, `biorhythm`, `ayurveda`, `iching`, `crystals`, `angel_numbers`, `languages`. English-only: `dreams`, `location`, `usage`.
150
+ 10 languages: `en`, `tr`, `de`, `es`, `hi`, `pt`, `fr`, `ru`, `zh-Hans`, `zh-Hant`. Defaults to `en`. Supported: `astrology`, `vedic_astrology`, `forecast`, `human_design`, `chinese_astrology`, `feng_shui`, `mesoamerican_astrology`, `vastu`, `numerology`, `kabbalah`, `tarot`, `biorhythm`, `ayurveda`, `iching`, `crystals`, `angel_numbers`, `reports`, `languages`. English-only: `dreams`, `location`, `usage`.
150
151
  <!-- END:LANGS -->
151
152
 
152
153
  ```python
@@ -303,6 +304,9 @@ Every error returns `{ error, code, doc_url }`. Switch on `code`; `error` is rea
303
304
  | 400 | `validation_error` | A field is missing or invalid. The body lists every failing field at once in issues, each with its path and the expected shape. |
304
305
  | 400 | `bad_request` | The request was rejected as a whole, for example a body that is not valid JSON or a date range that ends before it starts. |
305
306
  | 400 | `date_out_of_range` | A date lies outside the span the planetary positions are served for. The error names the supported dates. |
307
+ | 400 | `invalid_branding` | The report branding cannot be used, for example a logo that is not a PNG, JPEG, WebP or SVG image. |
308
+ | 400 | `logo_fetch_failed` | The report logo could not be fetched: it must be an HTTPS URL on a public host that answers within the size limit. |
309
+ | 400 | `unsupported_character` | The report text holds a character no report font draws. The error names it: remove or replace it. |
306
310
  | 401 | `api_key_required` | No API key was sent. |
307
311
  | 401 | `invalid_api_key` | The key sent is malformed or cannot be verified. |
308
312
  | 401 | `api_key_revoked` | The key was valid once and has since been revoked from the account page. |
@@ -325,8 +329,11 @@ Every error returns `{ error, code, doc_url }`. Switch on `code`; `error` is rea
325
329
  | 429 | `rate_limit_per_minute` | The per-minute limit of the plan was reached. Retry-After gives the seconds to the next minute, and the monthly allowance is not charged. |
326
330
  | 429 | `rate_limited` | A rate limit was reached, reported without the plan detail. |
327
331
  | 429 | `free_tier_exhausted` | A keyless request has used up its trial allowance. |
332
+ | 429 | `reports_rate_limited` | Too many reports were requested this minute. Retry-After gives the seconds to the next minute. |
328
333
  | 500 | `internal_error` | The request failed inside our service. Retry with exponential backoff. |
329
334
  | 503 | `compute_saturated` | Heavy calculations are briefly at capacity. Send the same request again after Retry-After seconds. |
335
+ | 503 | `reports_busy` | Report rendering is briefly at capacity. Send the same request again after Retry-After seconds. |
336
+ | 503 | `report_render_timeout` | The report took too long to render. Send the same request again. |
330
337
  | Any | `error` | A fallback for a status with no more specific code. The status and the error field carry the signal. |
331
338
  <!-- END:ERRORS -->
332
339
 
@@ -30,6 +30,12 @@ class ErrorCode(str, Enum):
30
30
  '400. The request was rejected as a whole, for example a body that is not valid JSON or a date range that ends before it starts.'
31
31
  DATE_OUT_OF_RANGE = "date_out_of_range"
32
32
  '400. A date lies outside the span the planetary positions are served for. The error names the supported dates.'
33
+ INVALID_BRANDING = "invalid_branding"
34
+ '400. The report branding cannot be used, for example a logo that is not a PNG, JPEG, WebP or SVG image.'
35
+ LOGO_FETCH_FAILED = "logo_fetch_failed"
36
+ '400. The report logo could not be fetched: it must be an HTTPS URL on a public host that answers within the size limit.'
37
+ UNSUPPORTED_CHARACTER = "unsupported_character"
38
+ '400. The report text holds a character no report font draws. The error names it: remove or replace it.'
33
39
  API_KEY_REQUIRED = "api_key_required"
34
40
  '401. No API key was sent.'
35
41
  INVALID_API_KEY = "invalid_api_key"
@@ -74,10 +80,16 @@ class ErrorCode(str, Enum):
74
80
  '429. A rate limit was reached, reported without the plan detail.'
75
81
  FREE_TIER_EXHAUSTED = "free_tier_exhausted"
76
82
  '429. A keyless request has used up its trial allowance.'
83
+ REPORTS_RATE_LIMITED = "reports_rate_limited"
84
+ '429. Too many reports were requested this minute. Retry-After gives the seconds to the next minute.'
77
85
  INTERNAL_ERROR = "internal_error"
78
86
  '500. The request failed inside our service. Retry with exponential backoff.'
79
87
  COMPUTE_SATURATED = "compute_saturated"
80
88
  '503. Heavy calculations are briefly at capacity. Send the same request again after Retry-After seconds.'
89
+ REPORTS_BUSY = "reports_busy"
90
+ '503. Report rendering is briefly at capacity. Send the same request again after Retry-After seconds.'
91
+ REPORT_RENDER_TIMEOUT = "report_render_timeout"
92
+ '503. The report took too long to render. Send the same request again.'
81
93
  ERROR = "error"
82
94
  'Any. A fallback for a status with no more specific code. The status and the error field carry the signal.'
83
95
 
@@ -817,7 +829,7 @@ class AstrologyDomain(_BaseDomain):
817
829
  params["lang"] = lang
818
830
  return await self._post_async(f"/astrology/profections", body, params=params or None)
819
831
 
820
- def generate_progressions(self, *, date: str, time: str, latitude: float, longitude: float, timezone: str, node_type: str | None = None, target_date: str, lang: str | None = None) -> Any:
832
+ def generate_progressions(self, *, date: str, time: str, latitude: float, longitude: float, timezone: str, node_type: str | None = None, target_date: str, house_system: str | None = None, lang: str | None = None) -> Any:
821
833
  """Secondary progressions calculator - progressed chart, progressed Sun and Moon"""
822
834
  body: dict[str, Any] = {}
823
835
  body["date"] = date
@@ -828,12 +840,14 @@ class AstrologyDomain(_BaseDomain):
828
840
  if node_type is not None:
829
841
  body["nodeType"] = node_type
830
842
  body["targetDate"] = target_date
843
+ if house_system is not None:
844
+ body["houseSystem"] = house_system
831
845
  params: dict[str, Any] = {}
832
846
  if lang is not None:
833
847
  params["lang"] = lang
834
848
  return self._post(f"/astrology/progressions", body, params=params or None)
835
849
 
836
- async def generate_progressions_async(self, *, date: str, time: str, latitude: float, longitude: float, timezone: str, node_type: str | None = None, target_date: str, lang: str | None = None) -> Any:
850
+ async def generate_progressions_async(self, *, date: str, time: str, latitude: float, longitude: float, timezone: str, node_type: str | None = None, target_date: str, house_system: str | None = None, lang: str | None = None) -> Any:
837
851
  """Secondary progressions calculator - progressed chart, progressed Sun and Moon (async)"""
838
852
  body: dict[str, Any] = {}
839
853
  body["date"] = date
@@ -844,6 +858,8 @@ class AstrologyDomain(_BaseDomain):
844
858
  if node_type is not None:
845
859
  body["nodeType"] = node_type
846
860
  body["targetDate"] = target_date
861
+ if house_system is not None:
862
+ body["houseSystem"] = house_system
847
863
  params: dict[str, Any] = {}
848
864
  if lang is not None:
849
865
  params["lang"] = lang
@@ -5361,7 +5377,7 @@ class NumerologyDomain(_BaseDomain):
5361
5377
  params["lang"] = lang
5362
5378
  return await self._post_async(f"/numerology/karmic-debt", body, params=params or None)
5363
5379
 
5364
- def generate_numerology_chart(self, *, full_name: str, year: int, month: int, day: int, current_year: int | None = None, lang: str | None = None) -> Any:
5380
+ def generate_numerology_chart(self, *, full_name: str, year: int, month: int, day: int, current_year: int | None = None, target_date: str | None = None, lang: str | None = None) -> Any:
5365
5381
  """Generate numerology chart - Complete numerology reading API"""
5366
5382
  body: dict[str, Any] = {}
5367
5383
  body["fullName"] = full_name
@@ -5370,12 +5386,14 @@ class NumerologyDomain(_BaseDomain):
5370
5386
  body["day"] = day
5371
5387
  if current_year is not None:
5372
5388
  body["currentYear"] = current_year
5389
+ if target_date is not None:
5390
+ body["targetDate"] = target_date
5373
5391
  params: dict[str, Any] = {}
5374
5392
  if lang is not None:
5375
5393
  params["lang"] = lang
5376
5394
  return self._post(f"/numerology/chart", body, params=params or None)
5377
5395
 
5378
- async def generate_numerology_chart_async(self, *, full_name: str, year: int, month: int, day: int, current_year: int | None = None, lang: str | None = None) -> Any:
5396
+ async def generate_numerology_chart_async(self, *, full_name: str, year: int, month: int, day: int, current_year: int | None = None, target_date: str | None = None, lang: str | None = None) -> Any:
5379
5397
  """Generate numerology chart - Complete numerology reading API (async)"""
5380
5398
  body: dict[str, Any] = {}
5381
5399
  body["fullName"] = full_name
@@ -5384,6 +5402,8 @@ class NumerologyDomain(_BaseDomain):
5384
5402
  body["day"] = day
5385
5403
  if current_year is not None:
5386
5404
  body["currentYear"] = current_year
5405
+ if target_date is not None:
5406
+ body["targetDate"] = target_date
5387
5407
  params: dict[str, Any] = {}
5388
5408
  if lang is not None:
5389
5409
  params["lang"] = lang
@@ -5533,7 +5553,7 @@ class KabbalahDomain(_BaseDomain):
5533
5553
  params["lang"] = lang
5534
5554
  return await self._post_async(f"/kabbalah/compatibility", body, params=params or None)
5535
5555
 
5536
- def generate_birth_profile(self, *, date: str, time: str | None = None, timezone: str, angel_dating: str | None = None, year_start: str | None = None, leap_day_policy: str | None = None, after_sunset: bool | None = None, lang: str | None = None) -> Any:
5556
+ def generate_birth_profile(self, *, date: str, time: str | None = None, timezone: str, angel_dating: str | None = None, year_start: str | None = None, leap_day_policy: str | None = None, after_sunset: bool | None = None, target_date: str | None = None, lang: str | None = None) -> Any:
5537
5557
  """Generate a birth profile - Hebrew birthday and birth angel API"""
5538
5558
  body: dict[str, Any] = {}
5539
5559
  body["date"] = date
@@ -5548,12 +5568,14 @@ class KabbalahDomain(_BaseDomain):
5548
5568
  body["leapDayPolicy"] = leap_day_policy
5549
5569
  if after_sunset is not None:
5550
5570
  body["afterSunset"] = after_sunset
5571
+ if target_date is not None:
5572
+ body["targetDate"] = target_date
5551
5573
  params: dict[str, Any] = {}
5552
5574
  if lang is not None:
5553
5575
  params["lang"] = lang
5554
5576
  return self._post(f"/kabbalah/birth-profile", body, params=params or None)
5555
5577
 
5556
- async def generate_birth_profile_async(self, *, date: str, time: str | None = None, timezone: str, angel_dating: str | None = None, year_start: str | None = None, leap_day_policy: str | None = None, after_sunset: bool | None = None, lang: str | None = None) -> Any:
5578
+ async def generate_birth_profile_async(self, *, date: str, time: str | None = None, timezone: str, angel_dating: str | None = None, year_start: str | None = None, leap_day_policy: str | None = None, after_sunset: bool | None = None, target_date: str | None = None, lang: str | None = None) -> Any:
5557
5579
  """Generate a birth profile - Hebrew birthday and birth angel API (async)"""
5558
5580
  body: dict[str, Any] = {}
5559
5581
  body["date"] = date
@@ -5568,6 +5590,8 @@ class KabbalahDomain(_BaseDomain):
5568
5590
  body["leapDayPolicy"] = leap_day_policy
5569
5591
  if after_sunset is not None:
5570
5592
  body["afterSunset"] = after_sunset
5593
+ if target_date is not None:
5594
+ body["targetDate"] = target_date
5571
5595
  params: dict[str, Any] = {}
5572
5596
  if lang is not None:
5573
5597
  params["lang"] = lang
@@ -7042,6 +7066,448 @@ class UsageDomain(_BaseDomain):
7042
7066
  return await self._get_async(f"/usage")
7043
7067
 
7044
7068
 
7069
+ class ReportsDomain(_BaseDomain):
7070
+ """Branded reports built from the API: a natal chart and more as a print-ready PDF, self-contained HTML or Markdown, whi..."""
7071
+
7072
+ def generate_bazi_report(self, *, date: str, time: str, timezone: str, latitude: float | None = None, longitude: float | None = None, day_boundary: str | None = None, year_boundary: str | None = None, hour_clock: str | None = None, gender: str, year: int, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7073
+ """BaZi report - Branded PDF report API"""
7074
+ body: dict[str, Any] = {}
7075
+ body["date"] = date
7076
+ body["time"] = time
7077
+ body["timezone"] = timezone
7078
+ if latitude is not None:
7079
+ body["latitude"] = latitude
7080
+ if longitude is not None:
7081
+ body["longitude"] = longitude
7082
+ if day_boundary is not None:
7083
+ body["dayBoundary"] = day_boundary
7084
+ if year_boundary is not None:
7085
+ body["yearBoundary"] = year_boundary
7086
+ if hour_clock is not None:
7087
+ body["hourClock"] = hour_clock
7088
+ body["gender"] = gender
7089
+ body["year"] = year
7090
+ if format is not None:
7091
+ body["format"] = format
7092
+ if branding is not None:
7093
+ body["branding"] = branding
7094
+ if page is not None:
7095
+ body["page"] = page
7096
+ if readings is not None:
7097
+ body["readings"] = readings
7098
+ params: dict[str, Any] = {}
7099
+ if lang is not None:
7100
+ params["lang"] = lang
7101
+ return self._post(f"/reports/bazi", body, params=params or None)
7102
+
7103
+ async def generate_bazi_report_async(self, *, date: str, time: str, timezone: str, latitude: float | None = None, longitude: float | None = None, day_boundary: str | None = None, year_boundary: str | None = None, hour_clock: str | None = None, gender: str, year: int, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7104
+ """BaZi report - Branded PDF report API (async)"""
7105
+ body: dict[str, Any] = {}
7106
+ body["date"] = date
7107
+ body["time"] = time
7108
+ body["timezone"] = timezone
7109
+ if latitude is not None:
7110
+ body["latitude"] = latitude
7111
+ if longitude is not None:
7112
+ body["longitude"] = longitude
7113
+ if day_boundary is not None:
7114
+ body["dayBoundary"] = day_boundary
7115
+ if year_boundary is not None:
7116
+ body["yearBoundary"] = year_boundary
7117
+ if hour_clock is not None:
7118
+ body["hourClock"] = hour_clock
7119
+ body["gender"] = gender
7120
+ body["year"] = year
7121
+ if format is not None:
7122
+ body["format"] = format
7123
+ if branding is not None:
7124
+ body["branding"] = branding
7125
+ if page is not None:
7126
+ body["page"] = page
7127
+ if readings is not None:
7128
+ body["readings"] = readings
7129
+ params: dict[str, Any] = {}
7130
+ if lang is not None:
7131
+ params["lang"] = lang
7132
+ return await self._post_async(f"/reports/bazi", body, params=params or None)
7133
+
7134
+ def generate_human_design_report(self, *, date: str, time: str, timezone: str, latitude: float | None = None, longitude: float | None = None, node_type: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7135
+ """Human Design report - Branded PDF report API"""
7136
+ body: dict[str, Any] = {}
7137
+ body["date"] = date
7138
+ body["time"] = time
7139
+ body["timezone"] = timezone
7140
+ if latitude is not None:
7141
+ body["latitude"] = latitude
7142
+ if longitude is not None:
7143
+ body["longitude"] = longitude
7144
+ if node_type is not None:
7145
+ body["nodeType"] = node_type
7146
+ if format is not None:
7147
+ body["format"] = format
7148
+ if branding is not None:
7149
+ body["branding"] = branding
7150
+ if page is not None:
7151
+ body["page"] = page
7152
+ if readings is not None:
7153
+ body["readings"] = readings
7154
+ params: dict[str, Any] = {}
7155
+ if lang is not None:
7156
+ params["lang"] = lang
7157
+ return self._post(f"/reports/human-design", body, params=params or None)
7158
+
7159
+ async def generate_human_design_report_async(self, *, date: str, time: str, timezone: str, latitude: float | None = None, longitude: float | None = None, node_type: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7160
+ """Human Design report - Branded PDF report API (async)"""
7161
+ body: dict[str, Any] = {}
7162
+ body["date"] = date
7163
+ body["time"] = time
7164
+ body["timezone"] = timezone
7165
+ if latitude is not None:
7166
+ body["latitude"] = latitude
7167
+ if longitude is not None:
7168
+ body["longitude"] = longitude
7169
+ if node_type is not None:
7170
+ body["nodeType"] = node_type
7171
+ if format is not None:
7172
+ body["format"] = format
7173
+ if branding is not None:
7174
+ body["branding"] = branding
7175
+ if page is not None:
7176
+ body["page"] = page
7177
+ if readings is not None:
7178
+ body["readings"] = readings
7179
+ params: dict[str, Any] = {}
7180
+ if lang is not None:
7181
+ params["lang"] = lang
7182
+ return await self._post_async(f"/reports/human-design", body, params=params or None)
7183
+
7184
+ def generate_kundli_report(self, *, date: str, time: str, latitude: float, longitude: float, timezone: str | None = None, ayanamsa: str | None = None, ayanamsa_value: float | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7185
+ """Kundli report - Branded PDF report API"""
7186
+ body: dict[str, Any] = {}
7187
+ body["date"] = date
7188
+ body["time"] = time
7189
+ body["latitude"] = latitude
7190
+ body["longitude"] = longitude
7191
+ if timezone is not None:
7192
+ body["timezone"] = timezone
7193
+ if ayanamsa is not None:
7194
+ body["ayanamsa"] = ayanamsa
7195
+ if ayanamsa_value is not None:
7196
+ body["ayanamsaValue"] = ayanamsa_value
7197
+ if format is not None:
7198
+ body["format"] = format
7199
+ if branding is not None:
7200
+ body["branding"] = branding
7201
+ if page is not None:
7202
+ body["page"] = page
7203
+ if readings is not None:
7204
+ body["readings"] = readings
7205
+ params: dict[str, Any] = {}
7206
+ if lang is not None:
7207
+ params["lang"] = lang
7208
+ return self._post(f"/reports/kundli", body, params=params or None)
7209
+
7210
+ async def generate_kundli_report_async(self, *, date: str, time: str, latitude: float, longitude: float, timezone: str | None = None, ayanamsa: str | None = None, ayanamsa_value: float | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7211
+ """Kundli report - Branded PDF report API (async)"""
7212
+ body: dict[str, Any] = {}
7213
+ body["date"] = date
7214
+ body["time"] = time
7215
+ body["latitude"] = latitude
7216
+ body["longitude"] = longitude
7217
+ if timezone is not None:
7218
+ body["timezone"] = timezone
7219
+ if ayanamsa is not None:
7220
+ body["ayanamsa"] = ayanamsa
7221
+ if ayanamsa_value is not None:
7222
+ body["ayanamsaValue"] = ayanamsa_value
7223
+ if format is not None:
7224
+ body["format"] = format
7225
+ if branding is not None:
7226
+ body["branding"] = branding
7227
+ if page is not None:
7228
+ body["page"] = page
7229
+ if readings is not None:
7230
+ body["readings"] = readings
7231
+ params: dict[str, Any] = {}
7232
+ if lang is not None:
7233
+ params["lang"] = lang
7234
+ return await self._post_async(f"/reports/kundli", body, params=params or None)
7235
+
7236
+ def generate_matchmaking_report(self, *, person1: dict[str, Any], person2: dict[str, Any], ayanamsa: str | None = None, ayanamsa_value: float | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7237
+ """Kundli matching report - Branded PDF report API"""
7238
+ body: dict[str, Any] = {}
7239
+ body["person1"] = person1
7240
+ body["person2"] = person2
7241
+ if ayanamsa is not None:
7242
+ body["ayanamsa"] = ayanamsa
7243
+ if ayanamsa_value is not None:
7244
+ body["ayanamsaValue"] = ayanamsa_value
7245
+ if format is not None:
7246
+ body["format"] = format
7247
+ if branding is not None:
7248
+ body["branding"] = branding
7249
+ if page is not None:
7250
+ body["page"] = page
7251
+ if readings is not None:
7252
+ body["readings"] = readings
7253
+ params: dict[str, Any] = {}
7254
+ if lang is not None:
7255
+ params["lang"] = lang
7256
+ return self._post(f"/reports/matchmaking", body, params=params or None)
7257
+
7258
+ async def generate_matchmaking_report_async(self, *, person1: dict[str, Any], person2: dict[str, Any], ayanamsa: str | None = None, ayanamsa_value: float | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7259
+ """Kundli matching report - Branded PDF report API (async)"""
7260
+ body: dict[str, Any] = {}
7261
+ body["person1"] = person1
7262
+ body["person2"] = person2
7263
+ if ayanamsa is not None:
7264
+ body["ayanamsa"] = ayanamsa
7265
+ if ayanamsa_value is not None:
7266
+ body["ayanamsaValue"] = ayanamsa_value
7267
+ if format is not None:
7268
+ body["format"] = format
7269
+ if branding is not None:
7270
+ body["branding"] = branding
7271
+ if page is not None:
7272
+ body["page"] = page
7273
+ if readings is not None:
7274
+ body["readings"] = readings
7275
+ params: dict[str, Any] = {}
7276
+ if lang is not None:
7277
+ params["lang"] = lang
7278
+ return await self._post_async(f"/reports/matchmaking", body, params=params or None)
7279
+
7280
+ def generate_natal_report(self, *, date: str, time: str, latitude: float, longitude: float, timezone: str, node_type: str | None = None, house_system: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7281
+ """Natal chart report - Branded PDF report API"""
7282
+ body: dict[str, Any] = {}
7283
+ body["date"] = date
7284
+ body["time"] = time
7285
+ body["latitude"] = latitude
7286
+ body["longitude"] = longitude
7287
+ body["timezone"] = timezone
7288
+ if node_type is not None:
7289
+ body["nodeType"] = node_type
7290
+ if house_system is not None:
7291
+ body["houseSystem"] = house_system
7292
+ if format is not None:
7293
+ body["format"] = format
7294
+ if branding is not None:
7295
+ body["branding"] = branding
7296
+ if page is not None:
7297
+ body["page"] = page
7298
+ if readings is not None:
7299
+ body["readings"] = readings
7300
+ params: dict[str, Any] = {}
7301
+ if lang is not None:
7302
+ params["lang"] = lang
7303
+ return self._post(f"/reports/natal", body, params=params or None)
7304
+
7305
+ async def generate_natal_report_async(self, *, date: str, time: str, latitude: float, longitude: float, timezone: str, node_type: str | None = None, house_system: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7306
+ """Natal chart report - Branded PDF report API (async)"""
7307
+ body: dict[str, Any] = {}
7308
+ body["date"] = date
7309
+ body["time"] = time
7310
+ body["latitude"] = latitude
7311
+ body["longitude"] = longitude
7312
+ body["timezone"] = timezone
7313
+ if node_type is not None:
7314
+ body["nodeType"] = node_type
7315
+ if house_system is not None:
7316
+ body["houseSystem"] = house_system
7317
+ if format is not None:
7318
+ body["format"] = format
7319
+ if branding is not None:
7320
+ body["branding"] = branding
7321
+ if page is not None:
7322
+ body["page"] = page
7323
+ if readings is not None:
7324
+ body["readings"] = readings
7325
+ params: dict[str, Any] = {}
7326
+ if lang is not None:
7327
+ params["lang"] = lang
7328
+ return await self._post_async(f"/reports/natal", body, params=params or None)
7329
+
7330
+ def generate_numerology_report(self, *, full_name: str, year: int, month: int, day: int, current_year: int | None = None, target_date: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7331
+ """Numerology report - Branded PDF report API"""
7332
+ body: dict[str, Any] = {}
7333
+ body["fullName"] = full_name
7334
+ body["year"] = year
7335
+ body["month"] = month
7336
+ body["day"] = day
7337
+ if current_year is not None:
7338
+ body["currentYear"] = current_year
7339
+ if target_date is not None:
7340
+ body["targetDate"] = target_date
7341
+ if format is not None:
7342
+ body["format"] = format
7343
+ if branding is not None:
7344
+ body["branding"] = branding
7345
+ if page is not None:
7346
+ body["page"] = page
7347
+ if readings is not None:
7348
+ body["readings"] = readings
7349
+ params: dict[str, Any] = {}
7350
+ if lang is not None:
7351
+ params["lang"] = lang
7352
+ return self._post(f"/reports/numerology", body, params=params or None)
7353
+
7354
+ async def generate_numerology_report_async(self, *, full_name: str, year: int, month: int, day: int, current_year: int | None = None, target_date: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7355
+ """Numerology report - Branded PDF report API (async)"""
7356
+ body: dict[str, Any] = {}
7357
+ body["fullName"] = full_name
7358
+ body["year"] = year
7359
+ body["month"] = month
7360
+ body["day"] = day
7361
+ if current_year is not None:
7362
+ body["currentYear"] = current_year
7363
+ if target_date is not None:
7364
+ body["targetDate"] = target_date
7365
+ if format is not None:
7366
+ body["format"] = format
7367
+ if branding is not None:
7368
+ body["branding"] = branding
7369
+ if page is not None:
7370
+ body["page"] = page
7371
+ if readings is not None:
7372
+ body["readings"] = readings
7373
+ params: dict[str, Any] = {}
7374
+ if lang is not None:
7375
+ params["lang"] = lang
7376
+ return await self._post_async(f"/reports/numerology", body, params=params or None)
7377
+
7378
+ def generate_synastry_report(self, *, person1: dict[str, Any], person2: dict[str, Any], house_system: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7379
+ """Synastry report - Branded PDF report API"""
7380
+ body: dict[str, Any] = {}
7381
+ body["person1"] = person1
7382
+ body["person2"] = person2
7383
+ if house_system is not None:
7384
+ body["houseSystem"] = house_system
7385
+ if format is not None:
7386
+ body["format"] = format
7387
+ if branding is not None:
7388
+ body["branding"] = branding
7389
+ if page is not None:
7390
+ body["page"] = page
7391
+ if readings is not None:
7392
+ body["readings"] = readings
7393
+ params: dict[str, Any] = {}
7394
+ if lang is not None:
7395
+ params["lang"] = lang
7396
+ return self._post(f"/reports/synastry", body, params=params or None)
7397
+
7398
+ async def generate_synastry_report_async(self, *, person1: dict[str, Any], person2: dict[str, Any], house_system: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7399
+ """Synastry report - Branded PDF report API (async)"""
7400
+ body: dict[str, Any] = {}
7401
+ body["person1"] = person1
7402
+ body["person2"] = person2
7403
+ if house_system is not None:
7404
+ body["houseSystem"] = house_system
7405
+ if format is not None:
7406
+ body["format"] = format
7407
+ if branding is not None:
7408
+ body["branding"] = branding
7409
+ if page is not None:
7410
+ body["page"] = page
7411
+ if readings is not None:
7412
+ body["readings"] = readings
7413
+ params: dict[str, Any] = {}
7414
+ if lang is not None:
7415
+ params["lang"] = lang
7416
+ return await self._post_async(f"/reports/synastry", body, params=params or None)
7417
+
7418
+ def generate_tarot_report(self, *, spread: str | None = None, question: str | None = None, seed: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7419
+ """Tarot reading report - Branded PDF report API"""
7420
+ body: dict[str, Any] = {}
7421
+ if spread is not None:
7422
+ body["spread"] = spread
7423
+ if question is not None:
7424
+ body["question"] = question
7425
+ if seed is not None:
7426
+ body["seed"] = seed
7427
+ if format is not None:
7428
+ body["format"] = format
7429
+ if branding is not None:
7430
+ body["branding"] = branding
7431
+ if page is not None:
7432
+ body["page"] = page
7433
+ if readings is not None:
7434
+ body["readings"] = readings
7435
+ params: dict[str, Any] = {}
7436
+ if lang is not None:
7437
+ params["lang"] = lang
7438
+ return self._post(f"/reports/tarot", body, params=params or None)
7439
+
7440
+ async def generate_tarot_report_async(self, *, spread: str | None = None, question: str | None = None, seed: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7441
+ """Tarot reading report - Branded PDF report API (async)"""
7442
+ body: dict[str, Any] = {}
7443
+ if spread is not None:
7444
+ body["spread"] = spread
7445
+ if question is not None:
7446
+ body["question"] = question
7447
+ if seed is not None:
7448
+ body["seed"] = seed
7449
+ if format is not None:
7450
+ body["format"] = format
7451
+ if branding is not None:
7452
+ body["branding"] = branding
7453
+ if page is not None:
7454
+ body["page"] = page
7455
+ if readings is not None:
7456
+ body["readings"] = readings
7457
+ params: dict[str, Any] = {}
7458
+ if lang is not None:
7459
+ params["lang"] = lang
7460
+ return await self._post_async(f"/reports/tarot", body, params=params or None)
7461
+
7462
+ def generate_yearly_forecast_report(self, *, date: str, time: str, year: int, latitude: float, longitude: float, timezone: str, house_system: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7463
+ """Yearly forecast report - Branded PDF report API"""
7464
+ body: dict[str, Any] = {}
7465
+ body["date"] = date
7466
+ body["time"] = time
7467
+ body["year"] = year
7468
+ body["latitude"] = latitude
7469
+ body["longitude"] = longitude
7470
+ body["timezone"] = timezone
7471
+ if house_system is not None:
7472
+ body["houseSystem"] = house_system
7473
+ if format is not None:
7474
+ body["format"] = format
7475
+ if branding is not None:
7476
+ body["branding"] = branding
7477
+ if page is not None:
7478
+ body["page"] = page
7479
+ if readings is not None:
7480
+ body["readings"] = readings
7481
+ params: dict[str, Any] = {}
7482
+ if lang is not None:
7483
+ params["lang"] = lang
7484
+ return self._post(f"/reports/yearly-forecast", body, params=params or None)
7485
+
7486
+ async def generate_yearly_forecast_report_async(self, *, date: str, time: str, year: int, latitude: float, longitude: float, timezone: str, house_system: str | None = None, format: str | None = None, branding: dict[str, Any] | None = None, page: dict[str, Any] | None = None, readings: bool | None = None, lang: str | None = None) -> Any:
7487
+ """Yearly forecast report - Branded PDF report API (async)"""
7488
+ body: dict[str, Any] = {}
7489
+ body["date"] = date
7490
+ body["time"] = time
7491
+ body["year"] = year
7492
+ body["latitude"] = latitude
7493
+ body["longitude"] = longitude
7494
+ body["timezone"] = timezone
7495
+ if house_system is not None:
7496
+ body["houseSystem"] = house_system
7497
+ if format is not None:
7498
+ body["format"] = format
7499
+ if branding is not None:
7500
+ body["branding"] = branding
7501
+ if page is not None:
7502
+ body["page"] = page
7503
+ if readings is not None:
7504
+ body["readings"] = readings
7505
+ params: dict[str, Any] = {}
7506
+ if lang is not None:
7507
+ params["lang"] = lang
7508
+ return await self._post_async(f"/reports/yearly-forecast", body, params=params or None)
7509
+
7510
+
7045
7511
  class LanguagesDomain(_BaseDomain):
7046
7512
  """List the response languages accepted by the `lang` query parameter on every i18n-aware endpoint"""
7047
7513
 
@@ -7114,6 +7580,7 @@ class Roxy:
7114
7580
  self.angel_numbers = AngelNumbersDomain(self._client, self._async_client, retry)
7115
7581
  self.location = LocationDomain(self._client, self._async_client, retry)
7116
7582
  self.usage = UsageDomain(self._client, self._async_client, retry)
7583
+ self.reports = ReportsDomain(self._client, self._async_client, retry)
7117
7584
  self.languages = LanguagesDomain(self._client, self._async_client, retry)
7118
7585
 
7119
7586
  def close(self) -> None:
@@ -0,0 +1 @@
1
+ VERSION = "1.3.0"
@@ -1 +0,0 @@
1
- VERSION = "1.2.1"
File without changes
File without changes