返回开放平台

TradAstro Developer API

HTTP JSON APIs for classical chart calculation and theme interpretations. Create an API key on the Open Platform after signing up. Usage is metered in weighted monthly points.

Item Value
Base URL https://tradastro.com/api/v1
Protocol HTTPS + JSON
Version v1 (versioned by path prefix)
Content type Request body Content-Type: application/json
Console Open Platform
Docs 中文 / English
Contact [email protected]
Product UI routes under /api/*/compute are for the website only. **Integrations must use /api/v1/*.**

Table of contents

  • Quick start
  • Authentication & keys
  • Quota, weights & rate limits
  • Plans & billing
  • Conventions
  • Shared objects
  • Endpoint reference
  • Response structure notes
  • Errors
  • Catalog
  • Versioning
  • Onboarding & FAQ

  • Quick start

  • Register and sign in.
  • Open Open Platform, create an API key (the full secret is shown once — store it immediately).
  • Call any POST /api/v1/... endpoint with that key.
  • curl -s -X POST https://tradastro.com/api/v1/natal \
      -H "Authorization: Bearer ta_live_YOUR_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "datetime": "1990-05-15T14:30:00",
        "timezone": "Asia/Shanghai",
        "latitude": 31.23,
        "longitude": 121.47,
        "house_system": "regiomontanus",
        "terms": "egyptian"
      }'

    Success responses are JSON (e.g. { "snapshot": { ... } }) and include monthly quota headers (see below).


    Authentication & keys

    Headers (either form)

    Authorization: Bearer ta_live_...

    or

    X-Api-Key: ta_live_...

    If both are present, X-Api-Key wins. Keys always start with ta_live_.

    Key lifecycle

    Action Notes
    Create From Open Platform after login; full secret returned only once
    List Console shows name + prefix (~12 chars), never the full secret again
    Revoke Immediate; irreversible
    Cap Per plan (Free 2, Starter 5, Pro 10, Business 20); over limit → 409 key_limit
    Storage Server stores SHA-256 hashes only — lost secrets cannot be recovered

    Monthly quota is attached to the account, not to a single key. All keys under one account share the same monthly points pool.


    Quota, weights & rate limits

    Monthly points (account-level)

  • Accumulated by UTC calendar month; resets at UTC month boundary.
  • Only successful handled requests consume points; auth failures, validation errors, and rate limits do not.
  • Cost = endpoint weight (see each endpoint).
  • Weights

    Weight Endpoints
    1 Natal, transit, solar arc, secondary/tertiary (incl. comparison), solar/lunar return, daily/monthly horoscope
    2 Synastry, composite, all interpretation themes
    3 Timing focus timing/focus
    5 Electional scan electional/scan

    Per-minute rate limit (per key)

  • Default 60 requests / minute / key (overridable via env; production default 60).
  • Counted in process memory; multi-instance deploys have independent counters — treat as a soft guard, not a hard global ceiling.
  • Over limit → 429 with error: "rate_limited".
  • Response headers (successful 2xx only)

    These headers reflect the monthly account quota (not the per-minute limiter):

    Header Meaning
    X-RateLimit-Limit Monthly quota
    X-RateLimit-Used Used points after this request
    X-RateLimit-Remaining Remaining points

    Error responses usually omit these headers. There is no Retry-After today.


    Plans & billing

    Plan Points / mo Monthly Yearly API keys
    Free 2,000 $0 2
    Starter 5,000 $9 $99 5
    Pro 50,000 $29 $289 10
    Business 150,000 $109 $1,099 20
  • Chinese locale UI shows CNY list prices (fixed, not live FX).
  • Online checkout is coming; for now an admin activates your plan after payment.
  • Higher volume, private deploy, or source licensing: [email protected].

  • Conventions

    Topic Rule
    Datetime Local civil time string, prefer YYYY-MM-DDTHH:mm:ss (no offset); timezone is IANA, e.g. Asia/Shanghai
    Coordinates Decimal degrees; north / east positive
    house_system Common: regiomontanus (default), placidus, alcabitius, whole_sign, koch, campanus, equal
    terms Product default egyptian
    Body JSON object; unknown fields are typically stripped
    Long jobs timing/focus and electional/scan may run up to ~120s — raise client timeouts

    Shared objects

    Person

    Used at the top level or nested as natal / chart_a / chart_b:

    Field Type Required Notes
    datetime string yes Local birth/event time (≥ 10 chars)
    timezone string yes IANA timezone
    latitude number yes
    longitude number yes
    label string no Display label
    place_name string no Place name
    {
      "datetime": "1990-05-15T14:30:00",
      "timezone": "Asia/Shanghai",
      "latitude": 31.23,
      "longitude": 121.47,
      "label": "A",
      "place_name": "Shanghai"
    }

    aspect_settings (optional)

    Supported on most compute endpoints:

    Field Type Notes
    method "moiety" \ "aspect" Orb method
    body_moiety object Per-body moiety map
    aspect_orbs object Per-aspect orb map
    include_minor boolean Minor aspects
    include_outer boolean Outer planets, etc.
    include_nodes boolean Nodes
    include_angles boolean Angles in aspects

    Omit to use engine defaults.


    Endpoint reference

    Unless noted, all are authenticated POST endpoints returning JSON.

    Samples below are abbreviated: arrays usually keep 1–2 items; values are illustrative. Treat live responses as source of truth. Optional fields may appear in later engine versions.

    POST /natal — Natal chart · weight 1

    Classical natal: planets, houses, aspects, dignities, lots, firdaria, profections, and more.

    Body: Person fields + optional house_system, terms, aspect_settings.

    curl -s -X POST https://tradastro.com/api/v1/natal \
      -H "Authorization: Bearer ta_live_xxx" \
      -H "Content-Type: application/json" \
      -d '{
        "datetime": "1990-05-15T14:30:00",
        "timezone": "Asia/Shanghai",
        "latitude": 31.23,
        "longitude": 121.47,
        "house_system": "regiomontanus",
        "terms": "egyptian"
      }'

    Response: { "snapshot": NatalSnapshot }

    {
      "snapshot": {
        "meta": {},
        "label": "Natal",
        "birth": {
          "datetime": "1990-05-15T14:30:00",
          "timezone": "Asia/Shanghai"
        },
        "settings": {
          "house_system": "regiomontanus",
          "aspect_matrix_order": ["sun", "moon", "mercury"]
        },
        "angles": { "asc": 182.45, "mc": 97.12 },
        "chart_ruler": { "planet": "venus" },
        "houses": [
          { "house": 1, "longitude": 182.45, "sign": "libra" }
        ],
        "planets": [
          {
            "id": "sun",
            "symbol": "☉",
            "longitude": 54.32,
            "sign": "taurus",
            "sign_symbol": "♉",
            "degree": 24,
            "minute": 19,
            "position": "24°19′ Taurus",
            "house": 8,
            "house_whole_sign": 8,
            "houses_ruled": [11],
            "houses_exalted": [],
            "speed": 0.96,
            "retrograde": false,
            "dignities": { "domicile": false, "exaltation": false },
            "dignity_score": null,
            "sect": "day",
            "orientality": null,
            "speed_class": "average",
            "solar_phase": null
          }
        ],
        "aspects": [
          {
            "body_a": "sun",
            "body_b": "moon",
            "type": "trine",
            "angle": 120,
            "orb": 1.42,
            "orb_deg": 1,
            "orb_min": 25,
            "orb_display": "1°25′",
            "applying": true,
            "separating": false,
            "phase": "A"
          }
        ],
        "lots": [{ "id": "fortune", "longitude": 210.1, "sign": "scorpio", "house": 2 }],
        "features": [],
        "firdaria": {
          "sect": "day",
          "current": { "major_lord": "venus", "sub_lord": "mercury" }
        },
        "profections": {
          "method": "annual",
          "current": { "house": 1, "lord": "venus", "sign": "libra" }
        }
      }
    }

    Optional extras may include house_scores, core_life_themes, personality_profile, and planet condition_summary / power.


    POST /synastry — Synastry · weight 2

    Two-chart synastry (cross aspects and relationship-oriented results).

    Field Type Required Notes
    chart_a Person yes
    chart_b Person yes
    inner "a" \ "b" no Which chart fixes houses
    house_system string no
    terms string no
    locale string no Affects some copy
    aspect_settings object no
    curl -s -X POST https://tradastro.com/api/v1/synastry \
      -H "Authorization: Bearer ta_live_xxx" \
      -H "Content-Type: application/json" \
      -d '{
        "chart_a": {
          "datetime": "1990-05-15T14:30:00",
          "timezone": "Asia/Shanghai",
          "latitude": 31.23,
          "longitude": 121.47
        },
        "chart_b": {
          "datetime": "1992-08-20T09:00:00",
          "timezone": "Asia/Shanghai",
          "latitude": 39.90,
          "longitude": 116.40
        },
        "inner": "a"
      }'

    Sample response:

    {
      "snapshot": {
        "meta": {},
        "inner": "a",
        "chart_a": {
          "label": "Person A",
          "angles": { "asc": 182.45, "mc": 97.12 },
          "planets": [{ "id": "venus", "sign": "gemini", "house": 9 }],
          "houses": []
        },
        "chart_b": {
          "label": "Person B",
          "angles": { "asc": 24.1, "mc": 278.6 },
          "planets": [{ "id": "mars", "sign": "aries", "house": 1 }],
          "houses": []
        },
        "cross_aspects": [
          {
            "inner_body": "venus",
            "outer_body": "mars",
            "type": "trine",
            "angle": 120,
            "orb": 1.2,
            "orb_deg": 1,
            "orb_min": 12,
            "orb_display": "1°12′",
            "applying": true,
            "separating": false,
            "phase": "A"
          }
        ],
        "relationship_scoring": {
          "version": "current",
          "symmetric": {
            "attraction": { "score": 78, "label": "Clear attraction" },
            "stability": { "score": 64, "label": "Fairly stable" },
            "tension": { "score": 38, "label": "Moderate tension" },
            "compatibility": { "score": 72, "label": "Good fit" }
          },
          "directional": {
            "a_to_b": { "score": 70, "label": "Clear investment" },
            "b_to_a": { "score": 66, "label": "Steady response" }
          },
          "summary": {
            "relationship_type": {
              "id": "balanced_attraction",
              "label": "Attraction with stability",
              "reasons": ["Interaction feels natural and attention tends to persist."]
            },
            "highlights": ["Emotional expression is often received well."],
            "risks": ["Pace differences may show up under pressure."],
            "suggestions": ["Keep both direct communication and personal space."]
          }
        },
        "settings": {
          "house_system": "regiomontanus",
          "terms": "egyptian",
          "inner_label": "Person A",
          "outer_label": "Person B",
          "include_outer_planets": true
        }
      }
    }

    relationship_scoring may be absent. Public responses expose scores and qualitative labels, not formula internals.


    POST /composite — Composite · weight 2

    Davison composite with structure-oriented results. Same body as synastry without inner.

    Sample response:

    {
      "snapshot": {
        "meta": {},
        "chart": {
          "label": "Davison Composite",
          "angles": { "asc": 113.2, "mc": 15.8 },
          "planets": [{ "id": "sun", "sign": "cancer", "house": 7 }],
          "aspects": [],
          "houses": [],
          "lots": [],
          "features": []
        },
        "chart_a": { "label": "Person A", "angles": { "asc": 182.45, "mc": 97.12 }, "planets": [] },
        "chart_b": { "label": "Person B", "angles": { "asc": 24.1, "mc": 278.6 }, "planets": [] },
        "composite_scoring": {
          "version": "current",
          "indices": {
            "structure": { "score": 74, "label": "Solid structure" },
            "attraction": { "score": 80, "label": "Clear attraction" },
            "stability": { "score": 68, "label": "Fairly stable" },
            "conflict": { "score": 35, "label": "Manageable conflict" },
            "total": { "score": 73, "label": "Overall harmony" }
          },
          "summary": {
            "relationship_type": {
              "id": "stable_growth",
              "label": "Steady growth",
              "reasons": ["The bond has room for ongoing construction."]
            },
            "highlights": ["Shared goals form relatively easily."],
            "risks": ["Major decisions may need more alignment."],
            "suggestions": ["Clarify long-term plans and responsibility boundaries."]
          }
        },
        "settings": {
          "house_system": "regiomontanus",
          "terms": "egyptian",
          "method": "davison",
          "chart_a_label": "Person A",
          "chart_b_label": "Person B",
          "composite_label": "Davison Composite",
          "include_outer_planets": true,
          "davison": {
            "datetime": "1991-07-02T23:45:00",
            "timezone": "UTC",
            "latitude": 35.565,
            "longitude": 118.935
          }
        }
      }
    }

    POST /transit — Transits · weight 1

    Field Type Required Notes
    natal Person yes
    transit_datetime string yes Transit moment
    transit_timezone string no
    transit_label string no
    house_system / terms / aspect_settings no
    {
      "natal": { "datetime": "1990-05-15T14:30:00", "timezone": "Asia/Shanghai", "latitude": 31.23, "longitude": 121.47 },
      "transit_datetime": "2026-07-18T12:00:00",
      "transit_timezone": "Asia/Shanghai"
    }

    Sample response (transit chart in transit; cross aspects in cross_aspects):

    {
      "snapshot": {
        "meta": {},
        "natal": {
          "label": "Natal",
          "angles": { "asc": 182.45, "mc": 97.12 },
          "planets": [{ "id": "sun", "sign": "taurus", "house": 8 }]
        },
        "transit": {
          "label": "Transits 2026-07-18",
          "angles": { "asc": 210.3, "mc": 124.8 },
          "planets": [{ "id": "jupiter", "sign": "cancer", "house": 10, "retrograde": false }]
        },
        "cross_aspects": [
          {
            "inner_body": "sun",
            "outer_body": "jupiter",
            "type": "sextile",
            "angle": 60,
            "orb": 0.75,
            "orb_deg": 0,
            "orb_min": 45,
            "orb_display": "0°45′",
            "applying": true,
            "separating": false,
            "phase": "A"
          }
        ],
        "settings": {
          "house_system": "regiomontanus",
          "terms": "egyptian",
          "natal_label": "Natal",
          "transit_label": "Transits 2026-07-18",
          "transit_datetime": "2026-07-18T12:00:00",
          "transit_timezone": "Asia/Shanghai",
          "include_outer_planets": true,
          "include_minor_aspects": false
        }
      }
    }

    Directed techniques (shared request body)

    These five endpoints share one request shape:

    Field Type Required Notes
    natal Person yes
    directed_datetime string yes Target directed moment
    directed_timezone string no
    directed_label string no
    house_system / terms / aspect_settings no
    {
      "natal": { "datetime": "1990-05-15T14:30:00", "timezone": "Asia/Shanghai", "latitude": 31.23, "longitude": 121.47 },
      "directed_datetime": "2026-07-18T12:00:00",
      "directed_timezone": "Asia/Shanghai"
    }

    #### POST /solar-arc — Solar arc · weight 1

    Same envelope as /transit (directed chart in transit). settings may include solar_arc_degrees and progressed_datetime.

    {
      "snapshot": {
        "natal": { "label": "Natal", "angles": { "asc": 182.45, "mc": 97.12 }, "planets": [] },
        "transit": { "label": "Solar Arc 2026", "angles": { "asc": 218.1, "mc": 132.7 }, "planets": [] },
        "cross_aspects": [],
        "settings": {
          "house_system": "regiomontanus",
          "transit_datetime": "2026-07-18T12:00:00",
          "transit_timezone": "Asia/Shanghai",
          "solar_arc_degrees": 36.18,
          "progressed_datetime": "1990-06-20T08:12:00"
        }
      }
    }

    #### POST /secondary-progressions — Secondary (single) · weight 1

    {
      "snapshot": {
        "meta": {},
        "natal_ref": {
          "label": "Natal",
          "birth": { "datetime": "1990-05-15T14:30:00", "timezone": "Asia/Shanghai" },
          "place_name": "Shanghai"
        },
        "chart": {
          "label": "Secondary Progressions 2026",
          "angles": { "asc": 220.4, "mc": 135.2 },
          "planets": [{ "id": "moon", "sign": "leo", "house": 9 }],
          "aspects": [],
          "houses": []
        },
        "settings": {
          "house_system": "regiomontanus",
          "terms": "egyptian",
          "directed_datetime": "2026-07-18T12:00:00",
          "directed_timezone": "Asia/Shanghai",
          "progressed_datetime": "1990-06-20T08:12:00",
          "age_years": 36.18
        }
      }
    }

    #### POST /secondary-progressions/comparison — Secondary vs natal · weight 1

    Same shape as /transit (progressed chart in transit); settings includes age_years, progressed_datetime, etc.

    #### POST /tertiary-progressions — Tertiary (single) · weight 1

    Same shape as secondary single; settings may also include age_lunar_months.

    {
      "snapshot": {
        "natal_ref": { "label": "Natal", "birth": {}, "place_name": "Shanghai" },
        "chart": {
          "label": "Tertiary Progressions 2026",
          "angles": { "asc": 248.7, "mc": 162.3 },
          "planets": []
        },
        "settings": {
          "directed_datetime": "2026-07-18T12:00:00",
          "age_lunar_months": 447.5,
          "age_years": 36.18
        }
      }
    }

    #### POST /tertiary-progressions/comparison — Tertiary vs natal · weight 1

    Same shape as /transit; settings may include age_lunar_months and age_years.


    POST /solar-return — Solar return · weight 1

    Field Type Required Notes
    natal Person yes
    return_year int yes
    return_latitude / return_longitude number no Return location
    return_timezone string no
    return_place_name string no
    house_system / terms / aspect_settings no
    {
      "natal": { "datetime": "1990-05-15T14:30:00", "timezone": "Asia/Shanghai", "latitude": 31.23, "longitude": 121.47 },
      "return_year": 2026,
      "return_latitude": 31.23,
      "return_longitude": 121.47,
      "return_timezone": "Asia/Shanghai"
    }

    Sample response:

    {
      "snapshot": {
        "meta": {},
        "natal_ref": {
          "label": "Natal",
          "birth": {},
          "sun_longitude": 54.32,
          "place_name": "Shanghai"
        },
        "return_chart": {
          "label": "Solar Return 2026",
          "angles": { "asc": 143.8, "mc": 46.1 },
          "planets": [{ "id": "sun", "sign": "taurus", "house": 10 }],
          "aspects": [],
          "houses": []
        },
        "settings": {
          "return_year": 2026,
          "house_system": "regiomontanus",
          "terms": "egyptian",
          "exact_return_datetime": "2026-05-15T20:18:42+08:00",
          "return_timezone": "Asia/Shanghai",
          "next_return_datetime": "2027-05-16T02:06:00+08:00",
          "return_period_start": "2026-05-15T20:18:42+08:00",
          "return_period_end": "2027-05-16T02:06:00+08:00",
          "return_latitude": 31.23,
          "return_longitude": 121.47,
          "return_place_name": "Shanghai",
          "location_from_natal": false
        }
      }
    }

    POST /lunar-return — Lunar return · weight 1

    Solar-return fields plus required return_month (1–12).

    Sample response:

    {
      "snapshot": {
        "natal_ref": {
          "label": "Natal",
          "moon_longitude": 287.9,
          "place_name": "Shanghai"
        },
        "return_chart": {
          "label": "Lunar Return July 2026",
          "angles": { "asc": 88.4, "mc": 351.2 },
          "planets": [{ "id": "moon", "sign": "capricorn", "house": 5 }]
        },
        "settings": {
          "return_year": 2026,
          "return_month": 7,
          "natal_moon_longitude": 287.9,
          "exact_return_datetime": "2026-07-09T14:42:00+08:00",
          "next_return_datetime": "2026-08-05T23:10:00+08:00",
          "return_period_start": "2026-07-09T14:42:00+08:00",
          "return_period_end": "2026-08-05T23:10:00+08:00",
          "return_timezone": "Asia/Shanghai"
        }
      }
    }

    POST /timing/focus — Life-topic timing · weight 3

    May be slow (up to ~120s).

    Field Type Required Notes
    topic enum yes relationship \ career_turn \ relocation \ wealth
    natal Person yes
    at_date YYYY-MM-DD no Anchor date
    house_system string no Default regiomontanus
    locale string no e.g. en, zh-CN
    target_location object no Relocation target
    {
      "topic": "relationship",
      "natal": { "datetime": "1990-05-15T14:30:00", "timezone": "Asia/Shanghai", "latitude": 31.23, "longitude": 121.47 },
      "at_date": "2026-07-18",
      "locale": "en"
    }

    Sample response (localized composition; raw facts removed):

    {
      "snapshot": {
        "topic": "relationship",
        "at_date": "2026-07-18",
        "headline": "Relationship themes show clearer forward windows ahead.",
        "paragraphs": [
          "Use timing windows as trend signals alongside real-world choices.",
          "This phase favors gradually clarifying how both people invest."
        ],
        "life_context": {
          "firdaria_period": { "lord": "venus", "start": "2024-03-10", "end": "2032-03-10" },
          "profection_year": { "house": 1, "lord": "venus", "start": "2026-05-15", "end": "2027-05-15" }
        },
        "windows": [
          {
            "start": "2026-09-03",
            "end": "2026-10-12",
            "strength": 82,
            "label": "Stronger window",
            "notes": ["Good for relationship confirmation and key conversations."]
          }
        ],
        "reasons": ["Interaction and commitment themes get clearer responses in this phase."],
        "risks": ["Avoid rushing expectations past practical pacing."]
      }
    }

    POST /electional/scan — Electional scan · weight 5

    Slow (up to ~120s).

    Field Type Required Notes
    event_type enum yes See values below
    anchor_date YYYY-MM-DD yes
    timezone string yes
    latitude / longitude number yes
    natal Person yes
    place_name string no
    house_system string no Default regiomontanus
    days_each_side int 1–30 no Default 15
    l2_threshold number 0–100 no
    sky_floor_weight number 0–0.1 no

    event_type: marriage, business_open, contract_sign, finance, travel, relocation, job_interview, medical_cosmetic.

    Special errors: 502 l1_unavailable, 503 electional_not_ready.

    Sample response (heatmap / hourly are long in production — abbreviated here):

    {
      "snapshot": {
        "meta": {},
        "event_type": "marriage",
        "anchor_date": "2026-10-10",
        "location": {
          "timezone": "Asia/Shanghai",
          "latitude": 31.23,
          "longitude": 121.47,
          "place_name": "Shanghai"
        },
        "score_summary": {
          "best": 86,
          "median": 61,
          "veto_pct": 18.5,
          "candidates_15m": 1450,
          "windows": 4
        },
        "heatmap": [
          {
            "ts": "2026-10-09T10:00:00+08:00",
            "score": 82,
            "level": "excellent",
            "breakdown": { "natal_cross": 80, "final": 82 }
          }
        ],
        "hourly": [
          {
            "ts": "2026-10-09T10:00:00+08:00",
            "vetoed": false,
            "reasons": [],
            "score": 82,
            "level": "excellent",
            "breakdown": { "natal_cross": 80, "final": 82 }
          }
        ],
        "windows": [
          {
            "start": "2026-10-09T09:30:00+08:00",
            "end": "2026-10-09T11:15:00+08:00",
            "score": 86,
            "peak_ts": "2026-10-09T10:15:00+08:00",
            "breakdown": { "natal_cross": 84, "final": 86 },
            "notes": ["Conditions align well for a formal ceremony."],
            "warnings": []
          }
        ],
        "l1_summary": {
          "scan_start": "2026-09-25",
          "scan_end": "2026-10-25",
          "total_hours": 744,
          "veto_count": 138,
          "veto_pct": 18.5,
          "eclipse_blackout_dates": []
        }
      }
    }

    POST /horoscope/daily — Daily horoscope · weight 1

    Field Type Required Notes
    natal Person yes No chartId
    date YYYY-MM-DD no Defaults to today
    timezone string no
    house_system / terms / aspect_settings no

    Sample response:

    {
      "snapshot": {
        "meta": {},
        "natal_label": "Natal",
        "daily": {
          "date": "2026-07-18",
          "timezone": "Asia/Shanghai",
          "variant_seed": "2026-07-18:Natal",
          "focus": {
            "house": 10,
            "near_angle": "mc",
            "moon_sign": "virgo",
            "moon_dignity": "neutral"
          },
          "mood": {
            "level": "steady",
            "moon_dignity": "neutral",
            "aspect": {
              "outer_body": "moon",
              "inner_body": "venus",
              "type": "trine",
              "orb_deg": 1,
              "orb_min": 8,
              "applying": true
            }
          },
          "relations": {
            "level": "supportive",
            "aspect": null,
            "seventh_ruler": "mars"
          },
          "action": {
            "level": "favorable",
            "void_of_course": false,
            "profection_lord_hit": {
              "lord": "venus",
              "trigger": "jupiter",
              "type": "sextile",
              "strength": "strong"
            }
          },
          "risk_window": null
        }
      }
    }

    POST /horoscope/monthly — Monthly horoscope · weight 1

    Field Type Required Notes
    natal Person yes
    at_date string no
    return_year / return_month int no
    house_system / terms / aspect_settings no

    Sample response:

    {
      "snapshot": {
        "meta": {},
        "natal_label": "Natal",
        "monthly": {
          "period_start": "2026-07-09T14:42:00+08:00",
          "period_end": "2026-08-05T23:10:00+08:00",
          "return_datetime": "2026-07-09T14:42:00+08:00",
          "variant_seed": "2026-07:Natal",
          "theme": {
            "lr_asc_in_natal_house": 10,
            "lr_moon_house": 3,
            "lr_chart_ruler": "mercury",
            "lr_chart_ruler_dignity": "neutral",
            "lr_moon_dignity": "strong"
          },
          "scores": {
            "career": { "value": 78, "max": 100, "factors": ["Career momentum feels clearer."] },
            "relationships": { "value": 66, "max": 100, "factors": ["Communication and response stay steadier."] }
          },
          "peak_days": [
            { "date": "2026-07-22", "signal": "Good day to push key conversations.", "weight": 0.86 }
          ]
        }
      }
    }

    scores keys are dynamic — do not hard-code only career / relationships.


    Theme interpretations · weight 2

    Path Theme
    /interpretations/love Love
    /interpretations/wealth Wealth
    /interpretations/career Career
    /interpretations/health Health
    /interpretations/social Social
    /interpretations/kin Kin / family
    /interpretations/fate Fate / fortune

    Body (one of): birth data (same as /natal) + optional format; or { "snapshot": <natal snapshot>, "format": "sections" }.

    format Response
    sections (default) { "sections": [ ... ] }
    report { "section": { ... } } (singular)
    curl -s -X POST https://tradastro.com/api/v1/interpretations/love \
      -H "Authorization: Bearer ta_live_xxx" \
      -H "Content-Type: application/json" \
      -d '{
        "datetime": "1990-05-15T14:30:00",
        "timezone": "Asia/Shanghai",
        "latitude": 31.23,
        "longitude": 121.47,
        "format": "sections"
      }'

    format: "sections" sample:

    {
      "sections": [
        {
          "key": "love_overview",
          "title_zh": "Love overview",
          "paragraphs": ["You value steady responses in relationships and also need room for personal space."],
          "facts_zh": [],
          "tone": "positive"
        },
        {
          "key": "love_romance",
          "title_zh": "Romance and attraction",
          "paragraphs": ["Attraction expresses naturally; warmth usually builds through ongoing interaction."],
          "facts_zh": [],
          "tone": "neutral"
        }
      ]
    }

    format: "report" sample:

    {
      "section": {
        "key": "love_fortune",
        "title_zh": "Love fortune",
        "paragraphs": [
          "【Love overview】",
          "You value steady responses in relationships and also need room for personal space.",
          "【Romance and attraction】",
          "Attraction expresses naturally; warmth usually builds through ongoing interaction."
        ],
        "facts_zh": [],
        "tone": "positive"
      }
    }

    Contract: facts_zh is always []; tone is positive / neutral / caution; paragraphs are conclusions only (no scoring rationale).


    Response structure notes

    Kind Top-level
    Most compute endpoints { "snapshot": ... }
    Interpretation sections { "sections": [...] }
    Interpretation report { "section": {...} }

    Natal cores: angles, houses, planets, aspects, lots, firdaria, profections. Comparison-style directed techniques put the outer chart in transit (transits, solar arc, secondary/tertiary comparison). Composite uses chart + chart_a / chart_b. Returns use return_chart plus period timestamps.

    Integration tip: call each target endpoint once and freeze the live JSON into client types; avoid depending on undocumented internal keys.


    Errors

    HTTP error Meaning
    401 missing_api_key No key provided
    401 invalid_api_key Invalid or revoked
    400 invalid_input Validation failed; may include details (Zod flatten)
    404 not_found Unknown /api/v1/... path
    409 key_limit Too many keys for plan (console API)
    429 quota_exceeded Monthly points exhausted; body may include used, quota
    429 rate_limited Per-key per-minute limit
    502 l1_unavailable Upstream unavailable (e.g. electional)
    502 (other string) Upstream failure may pass through a message
    503 electional_not_ready Electional module not ready

    Examples:

    { "error": "invalid_input", "details": { "formErrors": [], "fieldErrors": { "datetime": ["Required"] } } }
    { "error": "quota_exceeded", "used": 2000, "quota": 2000 }

    Catalog

    No auth required:

    GET https://tradastro.com/api/v1
    GET https://tradastro.com/api/v1/catalog

    Example shape:

    {
      "version": "v1",
      "auth": ["Authorization: Bearer <api_key>", "X-Api-Key: <api_key>"],
      "endpoints": [
        {
          "method": "POST",
          "path": "/api/v1/natal",
          "weight": 1,
          "summary_zh": "...",
          "summary_en": "..."
        }
      ]
    }

    Versioning

  • Public surface is v1, versioned by path (/api/v1/...).
  • Additive fields aim to be backward compatible; breaking changes will be announced when possible.
  • Interpretation copy and engine internals may iterate; avoid hard dependencies on undocumented internal keys.
  • No webhooks or official SDKs yet — use any HTTP client.

  • Onboarding & FAQ

    Suggested flow

  • Free signup → create a key → prove the path with /natal and /interpretations/love.
  • Wire the remaining endpoints your product needs.
  • Store secrets in a vault; rotate by revoking + creating keys.
  • Upgrade or email sales before hitting the monthly ceiling.
  • FAQ

    Q: Is monthly quota per key or per account?

    A: Per account (shared across keys). The 60/min limit is per key.

    Q: Can I pass a website chartId?

    A: Not on public v1. Send full birth data, or reuse a natal snapshot for interpretations.

    Q: How are synastry / interpretation scores calculated?

    A: Public API does not expose scoring formulas or weight breakdowns — only product-facing scores and conclusions.

    Q: Do you offer white-label / mini-program SDKs like some Chinese platforms?

    A: Today we ship an HTTP JSON API; white-label and private deploy are available via email.

    Q: What timeout should I use?

    A: Seconds for most calls; set ≥ 120s for timing/focus and electional/scan.


    Endpoint cheat sheet

    Method Path Weight
    POST /natal 1
    POST /synastry 2
    POST /composite 2
    POST /transit 1
    POST /solar-arc 1
    POST /secondary-progressions 1
    POST /secondary-progressions/comparison 1
    POST /tertiary-progressions 1
    POST /tertiary-progressions/comparison 1
    POST /solar-return 1
    POST /lunar-return 1
    POST /timing/focus 3
    POST /electional/scan 5
    POST /horoscope/daily 1
    POST /horoscope/monthly 1
    POST /interpretations/love 2
    POST /interpretations/wealth 2
    POST /interpretations/career 2
    POST /interpretations/health 2
    POST /interpretations/social 2
    POST /interpretations/kin 2
    POST /interpretations/fate 2
    GET / or /catalog 0 (no auth)