12 typů PDF‑reportů - natal, transit-yearly, synastry, business, career, love, money, child, lal-kitab, human-design, tarot, vedic-kundli - doposud žily jako 12 samostatných routů. Každý má svůj schéma, svůj chart-payload, svůj pricing tier. To je podle REST‑kanónu v pořádku, ale vytváří DX‑problém na dvou úrovních:
- SDK surface. TypeScript‑klient nese 12 metod
client.reports.natal(),client.reports.synastry(), … Každý nový typ reportu = breaking change v public API SDK (menší verze s novou metodou). - MCP‑katalog. Hosted MCP‑server exponuje 686 nástrojů: každý z 12 reportů zabírá samostatný tool entry. AI‑agent, který prochází MCP, musí prozkoumat 12 tool descriptions, aby vybral ten správný. To je šum v tool selection.
Nový endpoint POST /v1/reports/generate – jeden dispatcher s report_type enum.
API kontrakt
Sekce “API kontrakt”curl -X POST https://api.astroway.info/v1/reports/generate \ -H "X-Api-Key: aw_live_..." \ -H "Content-Type: application/json" \ -d '{ "report_type": "natal", "chart": { "date": "1990-05-15", "time": "14:30:00", "timezoneOffset": 3, "latitude": 50.45, "longitude": 30.52, "name": "Test" }, "language": "uk", "whitelabel": { "themeColor": "#ff5500", "reportName": "My Cosmic Map" } }'12 platných hodnot report_type: natal, transit-yearly, synastry, business, career, love, money, child, lal-kitab, human-design, tarot, vedic-kundli.
Per‑type validace
Sekce “Per‑type validace”Různé typy vyžadují různá payload‑pole. Dispatcher provádí validaci v handleru a vrací typizovaný 400:
report_type | Požadovaná pole | Kód chyby při chybějícím |
|---|---|---|
natal, business, career, love, money, child, lal-kitab, human-design, vedic-kundli, transit-yearly | chart | MISSING_CHART |
synastry | chart1, chart2 | MISSING_CHARTS |
tarot | (volitelný) seed | – |
Takže report_type řídí nejen render‑route, ale i validační pravidla pro tělo požadavku.
SDK přechod
Sekce “SDK přechod”Zpětná kompatibilita je úplná: všechny 12 type‑specific endpointy zůstávají živé. Nový /v1/reports/generate – additive surface, ne replacement. To znamená, že existující kód se nezlomí, ale nový kód může být psán kompaktněji:
// Стара модель - direct method per typeconst 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 dispatcherconst 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" });Co je lepší – závisí na use‑case. Direct‑metoda dává lepší type narrowing (TS‑kompilátor ví, že client.reports.synastry.create() vyžaduje chart1 + chart2). Generic‑dispatcher poskytuje menší surface area pro dynamické use‑case’y – například když uživatel vybírá typ reportu přes UI dropdown a nechceš 12‑násobný switch v klientském kódu.
MCP‑katalog: 12 → 1
Sekce “MCP‑katalog: 12 → 1”Na hosted MCP‑serveru (mcp.astroway.info) bylo 12 samostatných tools, každý s úplným popisem parametrů. Po přidání generate neodstraňujeme staré (zpětná kompatibilita) – ale nový tool astroway_reports_generate má jeden popis s report_type enum:
Tool: astroway_reports_generateDescription: 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 overrideAI‑agent při získání úkolu „vygeneruj mi natal report pro datum X“ získá jednoho kandidáta s jasným descriptor, místo 12 kandidátů s překrývajícími se popisy. To zlepšuje tool selection accuracy na úrovni agenta.
Pricing: bez překvapení
Sekce “Pricing: bez překvapení”Dispatcher nepřidává samostatnou cenu. Každý report_type je forwardován na svého interního renderera, který má svůj pricing tier:
natal→ TIER_7transit-yearly→ TIER_8synastry,business,career,love,money,child,lal-kitab,human-design,vedic-kundli→ odpovídající tierytarot→ TIER_4
Konkrétní credit‑čísla najdeš na stránce Cenová nabídka. Volání POST /v1/reports/generate s report_type: "natal" stojí přesně stejně jako přímé POST /v1/reports/natal.
Whitelabel inline funguje stejně
Sekce “Whitelabel inline funguje stejně”Nový whitelabel: BrandingObject inline‑režim (vydaný 2026-05-19) funguje přes generic dispatcher bez změn:
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" } }'Jeden dispatch + jeden inline whitelabel = plnohodnotná white‑label integrace s minimálním SDK surface.
OpenAPI 3.1
Sekce “OpenAPI 3.1”GenerateReport – samostatná komponenta v /v1/openapi.json. Používá oneOf s report_type discriminator, což poskytuje korektní codegen v Python (Pydantic) a PHP (typed unions přes psalm/phpstan‑style hints).
Příští codegen‑release SDK přidá metodu client.reports.generate() ve všech třech balíčcích (TS / Python / PHP). Do té doby můžeš volat přes generic HTTP‑klient ve svém SDK – payload je dokumentován v OpenAPI.
Kdy použít který styl
Sekce “Kdy použít který styl”| Scénář | Doporučeno |
|---|---|
| Uživatel vybírá typ reportu z UI dropdown | generate (dynamicky) |
| Backend ví přesně jeden typ na endpointu | direct (natal, synastry, …) – lepší typování |
| Integrace přes MCP / AI‑agent | generate (méně tool noise) |
| Existující kód na v1.0 SDK | zanechat direct, migrovat postupně |
Samostatná migrační urgentnost neexistuje – direct‑endpointy nejsou deprecated. Je to čistě DX‑vylepšení pro ty, kterým 12‑metodová surface vadí.
Stejný Swiss Ephemeris jako v Solar Fire - ve 4 řádcích kódu.
Zdarma klíč bez karty. 5 000 volání za měsíc do první platby.