12 tipuri de rapoarte PDF - natal, transit-yearly, synastry, business, career, love, money, child, lal-kitab, human-design, tarot, vedic-kundli - până recent trăiau ca 12 rute separate. Fiecare are propria schemă, propriul chart-payload, propriul pricing tier. E corect conform canonului REST, dar creează o problemă DX la două niveluri:
- Suprafața SDK. Clientul TypeScript are 12 metode
client.reports.natal(),client.reports.synastry(), … Fiecare tip nou de raport = breaking change în public API SDK (versiune minoră cu metodă nouă). - Catalog MCP. Serverul MCP găzduit expune 686 instrumente: fiecare dintre cele 12 rapoarte ocupă o intrare de tool separată. Agentul AI, care interacționează prin MCP, trebuie să scaneze 12 descrieri de tool-uri pentru a alege pe cel corect. E zgomot în selecția de tool-uri.
Noul endpoint POST /v1/reports/generate - un singur dispatcher cu enum-ul report_type.
contract API
Section titled “contract API”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 valori valide pentru report_type: natal, transit-yearly, synastry, business, career, love, money, child, lal-kitab, human-design, tarot, vedic-kundli.
Validare per tip
Section titled “Validare per tip”Tipuri diferite necesită câmpuri payload diferite. Dispatcher efectuează validarea în handler și returnează un 400 tipizat:
report_type | Câmpuri necesare | Cod de eroare la lipsă |
|---|---|---|
natal, business, career, love, money, child, lal-kitab, human-design, vedic-kundli, transit-yearly | chart | MISSING_CHART |
synastry | chart1, chart2 | MISSING_CHARTS |
tarot | (optional) seed | – |
Adică report_type controlează nu doar ruta de render, ci și regulile de validare pentru corpul cererii.
Migrare SDK
Section titled “Migrare SDK”Compatibilitatea inversă este completă: toate cele 12 endpoint-uri type-specific rămân active. Noul /v1/reports/generate - suprafață aditivă, nu un înlocuitor. Asta înseamnă că codul existent nu se va rupe, dar codul nou poate fi scris mai compact:
// Стара модель - 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" });Ce e mai bine - depinde de use-case. Metoda Direct oferă un type narrowing mai bun (compilatorul TS știe că client.reports.synastry.create() necesită chart1 + chart2). Generic-dispatcher oferă o suprafață mai mică pentru use-case-uri dinamice - de exemplu, când utilizatorul alege tipul raportului printr-un dropdown UI și nu vrei un switch de 12 de ramuri în codul clientului.
Catalog MCP: 12 → 1
Section titled “Catalog MCP: 12 → 1”Pe serverul MCP găzduit (mcp.astroway.info) erau 12 tool-uri separate, fiecare cu o descriere completă a parametrilor. După adăugarea generate noi nu ștergem pe cele vechi (compatibilitate inversă) - dar noul tool astroway_reports_generate are o singură descriere cu enum-ul report_type:
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 overrideAgentul AI, la primirea sarcinii „generează-mi raportul natal pentru data X”, primește un singur candidat cu un descriptor evident, în loc de 12 candidați cu descrieri suprapuse. Asta îmbunătățește acuratețea selecției de tool-uri la nivel de agent.
Pricing: fără surprize
Section titled “Pricing: fără surprize”Dispatcher nu adaugă costuri separate. Fiecare report_type este redirecționat către propriul său renderer intern, care are propriul său pricing tier:
natal→ TIER_7transit-yearly→ TIER_8synastry,business,career,love,money,child,lal-kitab,human-design,vedic-kundli→ tier-urile corespunzătoaretarot→ TIER_4
Vezi numerele concrete de credite pe pagina Prețuri. Apelul POST /v1/reports/generate cu report_type: "natal" costă exact la fel ca POST /v1/reports/natal direct.
Whitelabel inline funcționează la fel
Section titled “Whitelabel inline funcționează la fel”Noul whitelabel: BrandingObject inline-mod (lansat 2026-05-19) funcționează prin generic dispatcher fără modificări:
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" } }'Un dispatch + un inline whitelabel = integrare white-label completă cu suprafață SDK minimă.
OpenAPI 3.1
Section titled “OpenAPI 3.1”GenerateReport - componentă separată în /v1/openapi.json. Folosește oneOf cu discriminator report_type, ceea ce oferă codegen corect în Python (Pydantic) și PHP (typed unions prin indicii de tip psalm/phpstan).
Următorul release de codegen al SDK-ului va adăuga metoda client.reports.generate() în toate cele trei pachete (TS / Python / PHP). Până atunci poți apela printr-un client HTTP generic în SDK-ul tău - payload-ul este documentat în OpenAPI.
Când să folosești ce stil
Section titled “Când să folosești ce stil”| Scenariu | Recomandat |
|---|---|
| Utilizatorul alege tipul raportului din dropdown UI | generate (dinamic) |
| Backend-ul știe exact un tip pe endpoint | direct (natal, synastry, …) - tipare mai bune |
| Integrare prin MCP / agent AI | generate (mai puțin zgomot de tool) |
| Codul existent pe SDK v1.0 | păstrează direct, migrează treptat |
Nu există o urgență de migrare separată - endpoint-urile direct nu sunt deprecated. E pur și simplu o îmbunătățire DX pentru cei cărora suprafața cu 12 metode îi deranjează.
Același Swiss Ephemeris ca în Solar Fire - în 4 linii de cod.
Cheie gratuită fără card. 5.000 de apeluri pe lună până la prima plată.