AstroWay/api v2.295.7 · it
tutti i sistemi sono operativi

Come costruire un'applicazione astrologica: guida completa per gli sviluppatori

Guida passo dopo passo per la creazione di un'applicazione astrologica da zero - scelta dell'API, architettura, prima carta natale, aggiunta di sinastria e transiti, deploy.

🕓 Registrato il 2026-04-14, aggiornato il 2026-05-09. Gli SDK TS / Python / PHP ora risiedono su registry pubblici - @astroway/sdk (npm), astroway (PyPI), astroway/sdk (Packagist). Dettagli nel changelog.

Vuoi creare un’applicazione astrologica? Da dove iniziare? Questa guida offre soluzioni e codice: dalla scelta dell’API al deployment di un prodotto funzionante.

Prima di scrivere codice, decidi: calcoli sul client o sul server?

Client (ad esempio, Swiss Ephemeris WASM nel browser):

  • Pro: nessun costo per richiesta, funziona offline, controllo completo
  • Contro: ~2 MB di WASM per utente, licenze complesse (l’uso commerciale di Swiss Ephemeris ha restrizioni), sei tu a mantenere il codice di calcolo

API server (AstroWay, Prokerala, ecc.):

  • Pro: nessuna dipendenza client, bundle dell’applicazione ridotto, veloce su mobile, nessun problema di licenza
  • Contro: costo in crediti per richiesta, latenza per richieste “a freddo”

Per la maggior parte delle applicazioni, l’API server è la scelta migliore. Gli utenti mobile non aspetteranno 2 MB di WASM; non vale la pena affrontare le sfumature delle licenze; e le API moderne memorizzano gratuitamente nella cache le richieste identiche (AstroWay crea una cache di 5 minuti con l’header X-Cache: HIT).

Cosa conta:

  • Precisione: cerca Swiss Ephemeris “sotto il cofano” (±1 secondo d’arco). Se l’API non lo dichiara esplicitamente, chiedi.
  • Copertura: tema natale + sinastria + transiti: minimo. Progressioni e ritorni - il livello successivo. Tecniche rare (rettifica, Human Design) - sono un fattore distintivo.
  • Qualità dell’SDK: gli SDK TypeScript e Python tipizzati ti fanno risparmiare ore.
  • Modello tariffario: basato sui crediti si scala meglio del “per richiesta” con carichi di lavoro misti.

Per questo tutorial useremo AstroWay API, perché ha tutti e quattro (777 endpoint, Swiss Ephemeris, SDK tipizzati, basato sui crediti).

Non chiamare mai un’API astrologica direttamente dal browser: la tua chiave API verrebbe esposta. Passa sempre attraverso il tuo 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

Crea 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'));

Avvia:

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

Verifica tramite 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}'

Riceverai una carta natale JSON completa.

Qualsiasi framework andrà bene. Per esempio, React con un semplice form:

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>
);
}

La compatibilità è la prossima ovvia funzionalità. Aggiungi a 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,
});
});

Fatto. Un endpoint, 50 crediti per chiamata, restituisce un punteggio 0–100 e gli aspetti incrociati.

Per l’engagement dei contenuti, gli oroscopi giornalieri sono un must. AstroWay li genera da dati di transiti reali:

// 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!
});
});

Importante: i contenuti generati dall’IA includono un disclaimer che sei obbligato a mostrare agli utenti (secondo i Termini di Servizio). Non rimuoverlo.

Gli oroscopi giornalieri sono gli stessi per tutti gli utenti con la stessa data di nascita e carte natali simili. Memorizza aggressivamente nella cache:

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 ha anche una cache server integrata di 5 minuti (X-Cache: HIT), ma per contenuti a lunga durata è necessaria una cache propria.

Qualsiasi piattaforma andrà bene. Per un avvio rapido - Vercel o Railway:

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

Nel pannello della piattaforma, imposta la variabile d’ambiente ASTROWAY_API_KEY.

Se sei arrivato fin qui, stima il consumo mensile di crediti prima del lancio:

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

Per 100 DAU con 1 carta + 1 oroscopo + 0.3 sinastrie per utente al giorno:

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

Questo è il piano Starter a $19/mese (200K crediti).

Funzionalità avanzate da aggiungere con la crescita:

  • Sovrapposizione dei transiti: /v1/transits mostra le posizioni attuali dei pianeti sulla carta natale
  • Progressioni: /v1/progressions per gli archi di sviluppo psicologico
  • Ritorno solare: /v1/solar-return per la “previsione annuale dal giorno di nascita”
  • Human Design: Human Design API apre un intero nuovo dominio funzionale
  • Astrocartografia: /v1/acg mappa dove l’utente dovrebbe vivere

Ogni funzionalità è difficile da implementare da zero, ma con AstroWay è una singola chiamata API.

MakSeong · AstroWay

Sto sviluppando l'API AstroWay: sto avvolgendo Swiss Ephemeris in un REST pulito e scrivo sui dettagli noiosi che sono in realtà importanti.

// costruisci su questo

Lo stesso Swiss Ephemeris di Solar Fire - in 4 righe di codice.

Chiave API gratuita senza carta. 5 000 chiamate al mese fino al primo pagamento.

Altro dal blog tutti gli articoli →

Ephemeris 2026-07-19

Come teniamo sotto controllo la precisione: CI contro swetest e NASA

In un'API astrologica la precisione si degrada facilmente con un solo refactoring delle effemeridi. Vediamo le difese: un unico motore Swiss Ephemeris per l'app e l'API, centinaia di snapshot congelati su temi di riferimento e la triangolazione di ogni PR con swetest CGI, Kerykeion, Prokerala e il catalogo delle eclissi della NASA.

Engineering 2026-07-15

Tre SDK ufficiali: TypeScript, Python e PHP al posto del curl grezzo

L'HTTP grezzo funziona, ma un client tipizzato fa risparmiare ore: autocompletamento dei percorsi, tipi di richiesta e risposta, retry integrato su 408/409/429/5xx e una gerarchia di errori in stile Stainless. Analizziamo i tre SDK ufficiali, @astroway/sdk (npm), astroway (PyPI) e astroway/sdk (Packagist), e vediamo perché sono generati da un unico contratto OpenAPI.

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.