SDK

Clientes listos para los lenguajes más populares. Un solo archivo, sin dependencias externas, compactos ~80 líneas. Copia el código de abajo y úsalo de inmediato.

Estado de la publicación: el SDK por ahora se distribuye solo a través de esta página. La publicación en npm y PyPI está planificada tras la primera ola de adopción. Si quieres recibir avisos del lanzamiento, escribe a [email protected].

JavaScript / TypeScript

Compatible con Node.js 18+, Bun, Deno y navegadores. Usa el fetch integrado — sin dependencias externas.

Instalación

Copia el código de abajo en el archivo zaruvia-client.ts de tu proyecto.

zaruvia-client.ts
/**
 * ZaruviaClient — cliente del Zaruvia Open Numerology API.
 *
 * Licencia: MIT (código), CC-BY 4.0 (datos).
 * Documentación: https://zaruvia.com/docs
 */

export interface ArcanaPosition {
  arcana: number;
  name: string;
  keyword: string;
  emoji: string;
}

export interface Matrix {
  personal: ArcanaPosition; social: ArcanaPosition;
  soul: ArcanaPosition;     body: ArcanaPosition;
  spirit: ArcanaPosition;   center: ArcanaPosition;
  talents: ArcanaPosition;  karma: ArcanaPosition;
  money: ArcanaPosition;    relationships: ArcanaPosition;
  destiny: ArcanaPosition;  purpose: ArcanaPosition;
}

export interface MatrixResponse {
  input: { day: number; month: number; year: number };
  matrix: Matrix;
  source_url: string;
  details_url: string;
  license: string;
  attribution: string;
  attribution_html: string;
  api_version: string;
}

export type LifePathNumber = 1|2|3|4|5|6|7|8|9|11|22|33;

export class ZaruviaError extends Error {
  constructor(public status: number, public body: unknown) {
    super(`Zaruvia API HTTP ${status}`);
    this.name = "ZaruviaError";
  }
}

export class ZaruviaClient {
  private baseUrl: string;
  private timeoutMs: number;

  constructor(opts: { baseUrl?: string; timeoutMs?: number } = {}) {
    this.baseUrl = (opts.baseUrl ?? "https://zaruvia.com/api/public").replace(/\/$/, "");
    this.timeoutMs = opts.timeoutMs ?? 10_000;
  }

  async getMatrix(day: number, month: number, year: number): Promise<MatrixResponse> {
    return this.request<MatrixResponse>(`/matrix/${day}/${month}/${year}`);
  }

  async getLifePath(n: LifePathNumber | number): Promise<unknown> {
    return this.request(`/life-path/${n}`);
  }

  async listLifePaths(): Promise<unknown[]> {
    return this.request(`/life-path`);
  }

  private async request<T>(path: string): Promise<T> {
    const res = await fetch(`${this.baseUrl}${path}`, {
      headers: { Accept: "application/json" },
      signal: AbortSignal.timeout(this.timeoutMs),
    });
    if (!res.ok) {
      const body = await res.json().catch(() => null);
      throw new ZaruviaError(res.status, body);
    }
    return res.json();
  }
}

Uso

example.ts
import { ZaruviaClient } from "./zaruvia-client";

const client = new ZaruviaClient();

// Matriz del destino
const matrix = await client.getMatrix(15, 3, 1990);
console.log(matrix.matrix.center.name); // "La Rueda de la Fortuna"
console.log(matrix.matrix.money.emoji); // "⚡"

// Número del camino de vida
const lp = await client.getLifePath(7);
console.log(lp);

// Lista de todos los números
const all = await client.listLifePaths();
console.log(all.length); // 12

Si prefieres JavaScript puro sin TypeScript, elimina los tipos del código fuente (todo lo que viene tras interface, type, : string, etc.); quedará un módulo ES funcional de ~30 líneas.

Python

Python 3.8+. Sin dependencias — solo la biblioteca estándar urllib.

Instalación

Copia el código de abajo en el archivo zaruvia_client.py de tu proyecto.

zaruvia_client.py
"""
ZaruviaClient — cliente del Zaruvia Open Numerology API.

Licencia: MIT (código), CC-BY 4.0 (datos).
Documentación: https://zaruvia.com/docs
"""
import json
import urllib.error
import urllib.request
from typing import Any, Dict, List


class ZaruviaError(Exception):
    def __init__(self, message: str, status: int, body: Any):
        super().__init__(message)
        self.status = status
        self.body = body


class ZaruviaClient:
    def __init__(
        self,
        base_url: str = "https://zaruvia.com/api/public",
        timeout: float = 10.0,
        user_agent: str = "zaruvia-python/1.0",
    ) -> None:
        self.base_url = base_url.rstrip("/")
        self.timeout = timeout
        self.user_agent = user_agent

    def get_matrix(self, day: int, month: int, year: int) -> Dict[str, Any]:
        return self._request(f"/matrix/{int(day)}/{int(month)}/{int(year)}")

    def list_life_paths(self) -> List[Dict[str, Any]]:
        return self._request("/life-path")

    def get_life_path(self, number: int) -> Dict[str, Any]:
        return self._request(f"/life-path/{int(number)}")

    def _request(self, path: str) -> Any:
        req = urllib.request.Request(
            f"{self.base_url}{path}",
            headers={"Accept": "application/json", "User-Agent": self.user_agent},
            method="GET",
        )
        try:
            with urllib.request.urlopen(req, timeout=self.timeout) as r:
                return json.loads(r.read().decode("utf-8"))
        except urllib.error.HTTPError as e:
            try:
                body = json.loads(e.read().decode("utf-8"))
            except Exception:
                body = None
            raise ZaruviaError(f"Zaruvia API HTTP {e.code}", e.code, body) from None
        except urllib.error.URLError as e:
            raise ZaruviaError(f"Network error: {e.reason}", 0, None) from None


# Uso:
#   from zaruvia_client import ZaruviaClient
#   client = ZaruviaClient()
#   matrix = client.get_matrix(day=15, month=3, year=1990)
#   print(matrix["matrix"]["center"]["name"])  # "La Rueda de la Fortuna"

Uso

example.py
from zaruvia_client import ZaruviaClient

client = ZaruviaClient()

# Matriz del destino
matrix = client.get_matrix(day=15, month=3, year=1990)
print(matrix["matrix"]["center"]["name"])  # "La Rueda de la Fortuna"
print(matrix["matrix"]["money"]["emoji"])  # "⚡"

# Número del camino de vida
lp = client.get_life_path(7)
print(lp["archetype"])  # "El Sabio"

Variante async

Si necesitas un cliente async, crea un equivalente con aiohttp o httpx.AsyncClient con la misma firma. La lógica es idéntica a la versión síncrona; la única diferencia es el await.

Sin SDK

El API es tan simple que el SDK no es obligatorio. Llamada mínima en cualquier lenguaje:

curl https://zaruvia.com/api/public/matrix/15/3/1990

Otros lenguajes

Puedes generar un cliente en más de 50 lenguajes a partir de la especificación OpenAPI 3.0 con openapi-generator (Go, Java, C#, Rust, Swift, Kotlin, Ruby y otros).

Comentarios

¿Encontraste un fallo, quieres un nuevo lenguaje o una variante async? Escribe a [email protected]. El lanzamiento open source con repositorio en GitHub llegará tras publicar en npm/PyPI.