🕓 Bericht van 2026-04-14, bijgewerkt 2026-05-09. TS / Python / PHP SDK zijn nu beschikbaar op public registries —
@astroway/sdk(npm),astroway(PyPI),astroway/sdk(Packagist). Details in changelog.
Wil je een astrologische applicatie maken? Waar begin je? In deze gids — oplossingen en code: van het kiezen van een API tot het deployen van een werkend product.
Architectuurvragen
Section titled “Architectuurvragen”Voordat je code schrijft, moet je beslissen: berekeningen op de client of op de server?
Client (bijvoorbeeld, Swiss Ephemeris WASM in de browser):
- Voordelen: geen kosten per verzoek, werkt offline, volledige controle
- Nadelen: ~2 MB WASM per gebruiker, complexe licentie (commercieel gebruik van Swiss Ephemeris heeft beperkingen), je bent zelf verantwoordelijk voor het onderhoud van de berekeningscode
Server-API (AstroWay, Prokerala, enz.):
- Voordelen: geen clientafhankelijkheden, kleine bundle applicatie, snel op mobiel, geen licentieproblemen
- Nadelen: kosten per verzoek, vertraging bij ‘koude’ verzoeken
Voor de meeste applicaties wint de server-API. Mobiele gebruikers wachten niet op 2 MB WASM; met licentie-nuances hoef je niet te dealen; en moderne API’s cacheen identieke verzoeken gratis (AstroWay doet 5-minuten cache met header X-Cache: HIT).
API-keuze
Section titled “API-keuze”Wat telt:
- Nauwkeurigheid — zoek naar Swiss Ephemeris ‘onder de motorkap’ (±1 boogseconde). Als de API dit niet rechtstreeks zegt — vraag het.
- Bereik — natte + synastrie + transits — minimum. Progressies en terugkeer — volgend niveau. Zeldzame technieken (rectificatie, Human Design) — dit is een differentiator.
- SDK-kwaliteit — getypeerde TypeScript en Python SDK’s besparen uren.
- Tariefmodel — credit-based schaalt beter dan per-verzoek, op gemengde belasting.
Voor deze tutorial nemen we AstroWay API, omdat het alle vier heeft (723 endpoint, Swiss Ephemeris, getypeerde SDK’s, credit-based).
Stap 1: Backend opzetten
Section titled “Stap 1: Backend opzetten”Roep nooit een astrologische API rechtstreeks aan vanuit de browser — je API-sleutel lekt uit. Ga altijd via je eigen backend.
mkdir my-astrology-appcd my-astrology-appnpm init -ynpm install express @astroway/sdk zodnpm install -D typescript @types/express @types/node tsxMaak src/server.ts:
import express from 'express';import { Astroway } from '@astroway/sdk';import { z } from 'zod';
const app = express();app.use(express.json());
const client = new Astroway({ apiKey: process.env.ASTROWAY_API_KEY!,});
const BirthInput = z.object({ date: z.string(), time: z.string(), timezoneOffset: z.number(), latitude: z.number(), longitude: z.number(),});
app.post('/api/chart', async (req, res) => { const parsed = BirthInput.safeParse(req.body); if (!parsed.success) return res.status(400).json({ error: parsed.error });
try { const chart = await client.chart({ ...parsed.data, houseSystem: 'P', }); res.json(chart); } catch (err) { res.status(500).json({ error: String(err) }); }});
app.listen(3000, () => console.log('http://localhost:3000'));Start:
ASTROWAY_API_KEY=aw_test_... npx tsx src/server.tsControleer via curl:
curl -X POST http://localhost:3000/api/chart \ -H "Content-Type: application/json" \ -d '{"date":"1990-07-14","time":"14:30:00","timezoneOffset":3,"latitude":50.4501,"longitude":30.5234}'Ontvangt volledige JSON-geboortekaart.
Stap 2: Frontend
Section titled “Stap 2: Frontend”Elk framework is geschikt. Voor het voorbeeld — React met een eenvoudig formulier:
import { useState } from 'react';
type Chart = { planets: { name: string; longitude: number; sign: string; house: number }[]; aspects: { planet1: string; planet2: string; type: string; orb: number }[];};
export function NatalForm() { const [chart, setChart] = useState<Chart | null>(null);
async function handleSubmit(formData: FormData) { const body = Object.fromEntries(formData.entries()); const res = await fetch('/api/chart', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ date: body.date, time: body.time + ':00', timezoneOffset: Number(body.tz), latitude: Number(body.lat), longitude: Number(body.lng), }), }); setChart(await res.json()); }
return ( <div> <form action={handleSubmit}> <input name="date" type="date" required /> <input name="time" type="time" required /> <input name="tz" type="number" placeholder="Timezone offset (bijv. 3)" required /> <input name="lat" type="number" step="0.0001" placeholder="Latitude" required /> <input name="lng" type="number" step="0.0001" placeholder="Longitude" required /> <button>Maak kaart</button> </form>
{chart && ( <div> <h2>Planeten</h2> <ul> {chart.planets.map(p => ( <li key={p.name}>{p.name}: {p.sign} (huis {p.house})</li> ))} </ul> <h2>Aspecten</h2> <ul> {chart.aspects.map((a, i) => ( <li key={i}>{a.planet1} {a.type} {a.planet2} (orb {a.orb.toFixed(2)}°)</li> ))} </ul> </div> )} </div> );}Stap 3: Synastrie
Section titled “Stap 3: Synastrie”Compatibiliteit — de volgende logische functie. Voeg toe in src/server.ts:
const SynastryInput = z.object({ chart1: BirthInput, chart2: BirthInput,});
app.post('/api/synastry', async (req, res) => { const parsed = SynastryInput.safeParse(req.body); if (!parsed.success) return res.status(400).json({ error: parsed.error });
const result = await client.synastry(parsed.data); res.json({ score: result.compatibility.score, label: result.compatibility.label, aspects: result.crossAspects, });});Klaar. Één endpoint, 50 credits per oproep, retourneert score 0–100 en cross-aspecten.
Stap 4: Daghoroscopen
Section titled “Stap 4: Daghoroscopen”Voor content-engagement zijn daghoroscopen een must-have. AstroWay genereert ze met behulp van echte transitsgegevens:
app.post('/api/horoscope/daily', async (req, res) => { const parsed = BirthInput.safeParse(req.body); if (!parsed.success) return res.status(400).json({ error: parsed.error });
const horoscope = await client.horoscopeDaily(parsed.data); res.json({ text: horoscope.text, disclaimer: horoscope.disclaimer, // verplicht om in UI te tonen! });});Belangrijk: AI-gegenereerde inhoud bevat een disclaimer die je verplicht bent om aan gebruikers te tonen (volgens de Terms of Service). Verwijder deze niet.
Stap 5: Caching
Section titled “Stap 5: Caching”Daghoroscopen zijn hetzelfde voor alle gebruikers met dezelfde geboortedatum en soortgelijke geboortekaarten. Cache agressief:
import { LRUCache } from 'lru-cache';
const cache = new LRUCache<string, any>({ max: 1000, ttl: 86400 * 1000 });
app.post('/api/horoscope/daily', async (req, res) => { const key = JSON.stringify(req.body); const cached = cache.get(key); if (cached) return res.json(cached);
const horoscope = await client.horoscopeDaily(req.body); cache.set(key, horoscope); res.json(horoscope);});AstroWay heeft ook ingebouwd 5-minuten servercaching (X-Cache: HIT), maar voor langdurige inhoud is eigen caching nodig.
Stap 6: Deployen
Section titled “Stap 6: Deployen”Elk platform is geschikt. Voor een snelle start — Vercel of Railway:
# vercel.json{ "functions": { "src/server.ts": { "runtime": "@vercel/node" } } }In het paneel van de platform stel je env ASTROWAY_API_KEY in.
Budgetplanning
Section titled “Budgetplanning”Als je hier bent gekomen — schat je maandelijkse creditverbruik voordat je start:
credits/maand = DAU × (avg_charts_per_user × 20 + avg_synastries × 50 + avg_horoscopes × 20) × 30Voor 100 DAU met 1 kaart + 1 horoscoop + 0,3 synastrie per gebruiker per dag:
100 × (20 + 20 + 0,3 × 50) × 30 = 165 000 credits / maandDit is plan Starter voor $19/maand (200K credits).
Wat verder
Section titled “Wat verder”Geavanceerde functies die je moet toevoegen met het groeien:
- Transit overlay —
/v1/transitstoont huidige planetenposities op de geboortekaart - Progressies —
/v1/progressionsvoor psychologische ontwikkelingsbogen - Zonneretour —
/v1/solar-returnvoor ‘voorspelling voor het komende jaar’ - Human Design — Human Design API opent een geheel nieuw functioneel domein
- Astrocartografie —
/v1/acgtoont waar gebruikers moeten wonen
Elke functie is moeilijk om van scratch te implementeren, maar — één API-aanroep naar AstroWay.
- Krijg een gratis API-sleutel — 10 000 credits / maand
- Volledige API-referentie — alle 723 endpoints
- Geboortekaart API — gedetailleerde documentatie van het endpoint
Dezelfde Swiss Ephemeris als in Solar Fire — in 4 regels code.
Gratis sleutel zonder kaart. 5.000 calls per maand tot de eerste betaling.