AstroWay/api v2.95.1 · blog
усі системи в нормі

Reports V2: один ендпоінт замість дванадцяти — `/v1/reports/generate`

Замість 12 type-specific роутів /reports/natal, /reports/synastry, … — один уніфікований ендпоінт POST /v1/reports/generate з полем report_type. SDK-консументи отримують один метод замість дванадцяти; MCP-каталог скорочується з 12 інструментів до одного.

12 типів PDF-репортів — natal, transit-yearly, synastry, business, career, love, money, child, lal-kitab, human-design, tarot, vedic-kundli — донедавна жили як 12 окремих роутів. Кожен має свою схему, свій chart-payload, свій pricing tier. Це чесно по REST-канону, але створює DX-проблему на двох рівнях:

  1. SDK surface. TypeScript-клієнт носить 12 методів client.reports.natal(), client.reports.synastry(), … Кожен новий тип репорту = breaking change у public API SDK (мінорна версія з новим методом).
  2. MCP-каталог. Hosted MCP-сервер експонує 686 інструментів — кожен з 12 reports займає окремий tool entry. AI-агент, який ходить через MCP, має просканувати 12 tool descriptions, щоб обрати правильний. Це шум у tool selection.

Новий ендпоінт POST /v1/reports/generate — один dispatcher з report_type enum.

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

12 валідних значень report_type: natal, transit-yearly, synastry, business, career, love, money, child, lal-kitab, human-design, tarot, vedic-kundli.

Різні типи потребують різних payload-полів. Dispatcher робить валідацію у handler-і й повертає типізований 400:

report_typeRequired fieldsError code на missing
natal, business, career, love, money, child, lal-kitab, human-design, vedic-kundli, transit-yearlychartMISSING_CHART
synastrychart1, chart2MISSING_CHARTS
tarot(optional) seed

Тобто report_type керує не лише render-маршрутом, а й валідаційними правилами на тіло запиту.

Зворотна сумісність повна: всі 12 type-specific ендпоінтів залишаються живими. Новий /v1/reports/generate — additive surface, не replacement. Це значить існуючий код не зламається, але новий код може писатися компактніше:

// Стара модель — direct method per type
const pdf1 = await client.reports.natal.create({ chart, whitelabel });
const pdf2 = await client.reports.synastry.create({ chart1, chart2 });
const pdf3 = await client.reports.tarot.create({ seed: "abc" });
// V2 — generic dispatcher
const pdf1 = await client.reports.generate({ report_type: "natal", chart, whitelabel });
const pdf2 = await client.reports.generate({ report_type: "synastry", chart1, chart2 });
const pdf3 = await client.reports.generate({ report_type: "tarot", seed: "abc" });

Що краще — залежить від use-case. Direct-метод дає кращий type narrowing (TS-компілятор знає, що client.reports.synastry.create() вимагає chart1 + chart2). Generic-dispatcher дає менший surface area для динамічних use-case’ів — наприклад, коли користувач обирає тип звіту через UI dropdown і ви не хочете 12-разовий switch у клієнтському коді.

На hosted MCP-сервері (mcp.astroway.info) було 12 окремих tools, кожен з повним описом параметрів. Після додавання generate ми не видаляємо старі (зворотна сумісність) — але новий tool astroway_reports_generate має один опис із report_type enum:

Tool: astroway_reports_generate
Description: Generates a PDF/HTML astrology report. Pass report_type to select template.
Parameters:
report_type (enum): "natal" | "transit-yearly" | "synastry" | "business" | ...
chart (object, required for most types): birth chart data
chart1, chart2 (objects, required for synastry)
language (string): "uk" | "en" | ...
whitelabel (boolean | object): branding override

AI-агент при отриманні задачі “згенеруй мені натальний звіт для дати X” отримує один кандидат з очевидним descriptor, замість 12 кандидатів з overlapping descriptions. Це покращує tool selection accuracy на агентному рівні.

Dispatcher не додає окремої вартості. Кожен report_type форвардиться на свого внутрішнього рендерера, який має свій pricing tier:

  • natal → TIER_7
  • transit-yearly → TIER_8
  • synastry, business, career, love, money, child, lal-kitab, human-design, vedic-kundli → відповідні тіри
  • tarot → TIER_4

Конкретні credit-числа дивись на сторінці Pricing. Виклик POST /v1/reports/generate з report_type: "natal" коштує точно стільки ж, як прямий POST /v1/reports/natal.

Whitelabel inline працює однаково

Section titled “Whitelabel inline працює однаково”

Новий whitelabel: BrandingObject inline-режим (релізований 2026-05-19) працює через generic dispatcher без змін:

Terminal window
curl -X POST https://api.astroway.info/v1/reports/generate \
-H "X-Api-Key: aw_live_..." \
-H "Content-Type: application/json" \
-d '{
"report_type": "synastry",
"chart1": { ... },
"chart2": { ... },
"whitelabel": {
"companyName": "Acme Astrology",
"logoUrl": "https://cdn.example.com/logo.png",
"themeColor": "#ff5500"
}
}'

Один dispatch + один inline whitelabel = повноцінна white-label інтеграція з мінімальним SDK surface.

GenerateReport — окремий компонент у /v1/openapi.json. Він використовує oneOf за report_type discriminator, що дає коректний codegen у Python (Pydantic) та PHP (typed unions через psalm/phpstan-style hints).

Наступний codegen-реліз SDK додасть метод client.reports.generate() у всіх трьох пакетах (TS / Python / PHP). До того часу можете викликати через generic HTTP-клієнт у вашому SDK — пейлоад документований у OpenAPI.

Коли використовувати який стиль

Section titled “Коли використовувати який стиль”
СценарійRecommended
Користувач обирає тип звіту з UI dropdowngenerate (динамічно)
Бекенд знає точно один тип на endpointdirect (natal, synastry, …) — кращий тайпинг
Інтеграція через MCP / AI-агентgenerate (менше tool noise)
Існуючий код на v1.0 SDKзалишити direct, мігрувати поступово

Окремої migration-урджентності немає — direct-ендпоінти не deprecated. Це чисто DX-покращення для тих, кому 12-методна поверхня заважає.

AstroWay team

Інженерна команда AstroWay API. Ми загортаємо Swiss Ephemeris у чистий REST і пишемо про нудні деталі, які насправді важливі.

// побудуй на цьому

Той самий Swiss Ephemeris, що й у Solar Fire — у 4 рядках коду.

Безкоштовний ключ без картки. 5 000 викликів на місяць до першої оплати.

Більше з блогу усі дописи →

Engineering 2026-05-19

White-label PDF без WordPress: inline branding через одне поле

Поле whitelabel у схемах усіх 12 ендпоінтів /v1/reports/* тепер приймає не лише boolean (читати DB-конфіг), а й inline-об'єкт з 15 полями. Це знімає прив'язку до WordPress-користувача — будь-який SaaS-консумент API може брендувати PDF на льоту, без okремої admin-сторінки.

Changelog 2026-05-14

Pricing v2: пакети, прозорість, річна знижка 25% — підсумок Тижня 1

За 7 днів ми переробили pricing model: уніфікували Reports, додали 3 add-on пакети ($9 Esoteric, $19 Vedic, $99 Reports), бахнули 25% знижку на річний з roll-over невикористаних кредитів, і опублікували вартість усіх 700+ ендпоінтів. Що це значить для вашої інтеграції.

Human Design 2026-04-22

Запуск AstroWay API: повний стек астрологічних розрахунків з точністю Swiss Ephemeris

Три роки ми будували обчислювальний шар астрології для власних споживчих продуктів. Тепер відкриваємо API для зовнішніх розробників. Ось що всередині, чому ми це зробили і які жорсткі компроміси прийняли.