AstroWay/api v2.295.7 · nl
alle systemen normaal

Een astrologie-app bouwen: complete gids voor ontwikkelaars

Stap-voor-stap gids voor het maken van een astrologie-app van scratch - keuze van API, architectuur, eerste geboortehoroscoop, toevoegen van synastrie en transits, deployen.

🕓 Verslag van 2026-04-14, bijgewerkt op 2026-05-09. TS / Python / PHP SDK nu beschikbaar in public registries - @astroway/sdk (npm), astroway (PyPI), astroway/sdk (Packagist). Zie details in het changelog.

Wil je een astrologische applicatie maken. Waar begin je? In deze gids vind je oplossingen en code: van het kiezen van een API tot het deployen van een werkend product.

Voordat je code schrijft, beslis: berekeningen op de client of op de server?

Client (bijv. Swiss Ephemeris WASM in de browser):

  • Voordelen: geen kosten per request, werkt offline, volledige controle
  • Nadelen: ~2 MB WASM per gebruiker, complexe licentie (commercieel gebruik van Swiss Ephemeris heeft beperkingen), je onderhoudt de rekencode zelf

Server API (AstroWay, Prokerala, etc.):

  • Voordelen: geen client-afhankelijkheden, kleine app bundle, snel op mobiel, geen licentieproblemen
  • Nadelen: kosten in credits per request, vertraging bij “koude” requests

Voor de meeste apps wint het server API. Mobiele gebruikers zullen niet wachten op 2 MB WASM; je wilt niet omgaan met licentiecomplexiteit; en moderne API’s cachen identieke requests gratis (AstroWay doet 5-minuten caching met header X-Cache: HIT).

Wat belangrijk is:

  • Nauwkeurigheid: zoek naar Swiss Ephemeris “onder de motorkap” (±1 boogseconde). Als API dit niet expliciet vermeldt - vraag.
  • Dekking: geboortekaart + synastrie + transits: minimum. Progressies en returns: volgende niveau. Zeldzame technieken (rectificatie, Human Design) is een differentiator.
  • SDK kwaliteit: getypeerde TypeScript en Python SDK’s besparen uren.
  • Tariefmodel: credit-based schaler beter dan per-request bij gemengde belasting.

Voor deze tutorial gebruiken we AstroWay API, omdat het alle vier heeft (777 endpoints, Swiss Ephemeris, getypeerde SDK’s, credit-based).

Roep nooit een astrologische API rechtstreeks vanuit de browser aan - je API-key lekt. Ga altijd via je eigen backend.

Terminal window
mkdir my-astrology-app
cd my-astrology-app
npm init -y
npm install express @astroway/sdk zod
npm install -D typescript @types/express @types/node tsx

Maak 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.compute({
...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:

Terminal window
ASTROWAY_API_KEY=aw_test_... npx tsx src/server.ts

Testen met curl:

Terminal window
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}'

Je krijgt een volledige JSON-geboortekaart.

Elk framework werkt. Voor het voorbeeld - React met een eenvormige vorm:

import { useState } from 'react';
type Chart = {
planets: { name: string; longitude: number; isRetrograde: boolean }[];
aspects: { planet1: string; planet2: string; type: { name: string }; orb: number }[];
};
// Planets come with ecliptic longitude, not a sign: the sign is that longitude
// divided by 30. Work it out on your side, it is cheaper than another call.
const SIGNS = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo',
'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'];
const signOf = (longitude: number) => SIGNS[Math.floor(longitude / 30) % 12];
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 (e.g. 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>Build chart</button>
</form>
{chart && (
<div>
<h2>Planets</h2>
<ul>
{chart.planets.map(p => (
<li key={p.name}>{p.name}: {signOf(p.longitude)} {(p.longitude % 30).toFixed(2)}°{p.isRetrograde ? ' R' : ''}</li>
))}
</ul>
<h2>Aspects</h2>
<ul>
{chart.aspects.map((a, i) => (
<li key={i}>{a.planet1} {a.type.name} {a.planet2} (orb {a.orb.toFixed(2)}°)</li>
))}
</ul>
</div>
)}
</div>
);
}

Compatibiliteit is de volgende logische functie. Voeg toe aan 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.compute(parsed.data);
res.json({
score: result.compatibility.score,
label: result.compatibility.label,
aspects: result.crossAspects,
});
});

Klaar. Eén endpoint, 50 credits per aanroep, geeft een score 0-100 en cross-aspects.

Voor content-engagement zijn dagelijkse horoscopes een must-have. AstroWay genereert ze met echte transitgegevens:

// The daily horoscope is keyed by sign and date, not by the birth chart.
const DailyInput = z.object({
sign: z.enum(['aries', 'taurus', 'gemini', 'cancer', 'leo', 'virgo',
'libra', 'scorpio', 'sagittarius', 'capricorn', 'aquarius', 'pisces']),
date: z.string(),
});
app.post('/api/horoscope/daily', async (req, res) => {
const parsed = DailyInput.safeParse(req.body);
if (!parsed.success) return res.status(400).json({ error: parsed.error });
const horoscope = await client.horoscope.daily({ ...parsed.data, language: 'uk' });
res.json({
text: horoscope.horoscope,
disclaimer: horoscope.disclaimer, // must be shown in the UI!
});
});

Belangrijk: AI-gegenereerde content bevat een disclaimer die je verplicht moet tonen aan gebruikers (volgens Terms of Service). Verwijder het niet.

Dagelijkse horoscopes zijn hetzelfde voor alle gebruikers met dezelfde geboortedatum en vergelijkbare 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.horoscope.daily(req.body);
cache.set(key, horoscope);
res.json(horoscope);
});

AstroWay heeft ook ingebouwd 5-minuten server caching (X-Cache: HIT), maar voor langlevende content heb je je eigen cache nodig.

Elk platform werkt. Voor een snelle start - Vercel of Railway:

Terminal window
# vercel.json
{ "functions": { "src/server.ts": { "runtime": "@vercel/node" } } }

Stel in het platformpaneel de env ASTROWAY_API_KEY in.

Als je hier bent gekomen - evalueer het maandelijkse creditverbruik voordat je lanceert:

credits/month = DAU × (avg_charts_per_user × 20
+ avg_synastries × 50
+ avg_horoscopes × 20) × 30

Voor 100 DAU met 1 kaart + 1 horoscoop + 0.3 synastrieën per gebruiker per dag:

100 × (20 + 20 + 0.3 × 50) × 30 = 165,000 credits/month

Dit is het Starter plan voor $19/maand (200K credits).

Geavanceerde functies die je toe moet voegen met groei:

  • Overlay transits: /v1/transits toont huidige planetposities op de geboortekaart
  • Progressies: /v1/progressions voor boog van psychologische ontwikkeling
  • Solar return: /v1/solar-return voor “jaarvoorspelling vanaf verjaardag”
  • Human Design: Human Design API opent een compleet nieuw functioneel domein
  • Astrocartografie: /v1/acg mapt waar de gebruiker zou moeten wonen

Elke functie is moeilijk om vanaf nul te implementeren, maar - één API-call met AstroWay.

MakSeong · AstroWay

I build the AstroWay API: Swiss Ephemeris on a clean REST surface, and I write about the dull parts that turn out to matter.

// bouw hierop

Dezelfde Swiss Ephemeris als in Solar Fire - in 4 regels code.

Gratis sleutel zonder kaart. 5.000 calls per maand tot de eerste betaling.

Meer uit de blog alle berichten →

Ephemeris 2026-07-19

Zo houden we de nauwkeurigheid onder controle: CI tegen swetest en NASA

Nauwkeurigheid in een astrologie-API gaat makkelijk achteruit door één refactor van de efemeriden. We laten zien hoe we ons beschermen: één Swiss Ephemeris-kern voor app en API, honderden bevroren snapshots op referentiehoroscopen en triangulatie van elke PR tegen swetest CGI, Kerykeion, Prokerala en de eclipscatalogus van NASA.

Engineering 2026-07-15

Drie officiële SDK's: TypeScript, Python en PHP in plaats van kale curl

Kale HTTP werkt, maar een getypeerde client scheelt uren: autocompletion van paden, request- en responsetypes, ingebouwde retry bij 408/409/429/5xx en een foutenhiërarchie in Stainless-stijl. We bespreken de drie officiële SDK's, @astroway/sdk (npm), astroway (PyPI) en astroway/sdk (Packagist), en hoe ze uit één OpenAPI-contract worden gegenereerd.

Industry 2026-06-05

Free Astrology API: Which One Has the Best Free Tier in 2026?

A side-by-side of free tiers across the major astrology APIs - credits, request caps, card requirements - and how much you can actually build for free.