{
  "benchmark_id": "astrolinkers-free-tier-2026-08-27",
  "title": "Astrolinkers Free Tier: Sanitized Benchmark Evidence",
  "publisher": "FreeAstroAPI",
  "author": "Gabriel",
  "test_date": "2026-08-27",
  "published_date": "2026-08-27",
  "region": {
    "city": "Paris",
    "country": "France",
    "timezone": "Europe/Paris",
    "utc_offset": "+02:00"
  },
  "transport": {
    "http_version": "HTTP/2",
    "authentication": "Astrolinkers live API key; removed from this artifact",
    "data_policy": "Synthetic birth data only. API keys, tenant identifiers, chart identifiers and report identifiers were removed or replaced with placeholders."
  },
  "scope": {
    "plan_observed": "free",
    "advertised_daily_requests": 1000,
    "advertised_monthly_requests": 10000,
    "advertised_rate_bucket_capacity": 60,
    "advertised_rate_bucket_refill_per_second": 2,
    "recorded_tenant_requests_after_test": 199,
    "recorded_tenant_errors_after_test": 5,
    "feature_and_setup_calls": 27,
    "rate_test_calls": 120,
    "report_status_polls": 19,
    "monthly_cap_exhausted": false,
    "daily_cap_exhausted": false
  },
  "methodology": {
    "summary": "Authenticated scripted requests were sent from Paris over HTTP/2 on one day. Reusable synthetic Western and Vedic charts were created first. Deterministic, predictive, relationship, interpretation, report, rectification and Muhurta endpoints were then exercised. A stored-chart GET was used for repeat latency and rate-limit tests so calculation complexity would not dominate the throughput result.",
    "latency_measurement": "Client-observed wall-clock time from request start until the complete response body was received, reported in milliseconds.",
    "percentile_method": "Percentiles are the observed run summaries produced by the benchmark client. Values are rounded to one decimal millisecond.",
    "accuracy_reference": "Local pyswisseph 2.10.03 using Swiss Ephemeris at the J2000 test instant.",
    "rate_test_target": "GET /v1/charts/<synthetic-western-chart-id>",
    "stop_condition": "Testing stopped after the practical sustained rate ceiling was established. The 10,000-request monthly allowance was not deliberately exhausted.",
    "safety": "No destructive calls, real-person birth data or paid LLM workloads were used."
  },
  "request_templates": [
    {
      "name": "create_western_chart_a",
      "method": "POST",
      "path": "/v1/charts",
      "body": {
        "birth": {
          "moment": "1990-04-15T02:00:00+00:00",
          "latitude": 28.6139,
          "longitude": 77.209
        },
        "system": "western",
        "house_system": "placidus",
        "ayanamsha": null
      }
    },
    {
      "name": "create_vedic_chart_a",
      "method": "POST",
      "path": "/v1/charts",
      "body": {
        "birth": {
          "moment": "1990-04-15T02:00:00+00:00",
          "latitude": 28.6139,
          "longitude": 77.209
        },
        "system": "vedic",
        "house_system": "whole_sign",
        "ayanamsha": "lahiri"
      }
    },
    {
      "name": "create_second_synthetic_chart",
      "method": "POST",
      "path": "/v1/charts",
      "body": {
        "birth": {
          "moment": "1992-09-21T14:30:00+00:00",
          "latitude": 19.076,
          "longitude": 72.8777
        },
        "system": "vedic",
        "house_system": "whole_sign",
        "ayanamsha": "lahiri"
      }
    },
    {
      "name": "compatibility_full",
      "method": "POST",
      "path": "/v1/compatibility",
      "body": {
        "chart_a_id": "<synthetic-vedic-chart-a-id>",
        "chart_b_id": "<synthetic-vedic-chart-b-id>",
        "axis": "romantic",
        "include_ashtakoota": true,
        "include_synastry": true
      }
    },
    {
      "name": "muhurta_search_heavy",
      "method": "POST",
      "path": "/v1/vedic/muhurta/search",
      "body": {
        "natal_chart_id": "<synthetic-vedic-chart-id>",
        "activity_type": "business",
        "window_start": "2027-05-31T00:00:00+05:30",
        "window_end": "2027-06-01T00:00:00+05:30",
        "latitude": 28.6139,
        "longitude": 77.209,
        "timezone": "Asia/Kolkata",
        "interval_minutes": 5,
        "top_n": 50
      }
    },
    {
      "name": "rectification_grid_fine_heavy",
      "method": "POST",
      "path": "/v1/rectification/grid",
      "body": {
        "window_start": "1990-04-15T00:00:00+05:30",
        "window_end": "1990-04-15T04:00:00+05:30",
        "latitude": 28.6139,
        "longitude": 77.209,
        "step_minutes": 1,
        "detail": "fine",
        "ayanamsha": "lahiri",
        "transit_dates": [
          "2010-01-15",
          "2011-06-14",
          "2012-09-01",
          "2014-03-20",
          "2016-11-08",
          "2018-05-24",
          "2019-12-02",
          "2021-07-10",
          "2023-02-18",
          "2025-08-01"
        ]
      }
    },
    {
      "name": "pdf_report",
      "method": "POST",
      "path": "/v1/reports",
      "body": {
        "chart_id": "<synthetic-western-chart-id>",
        "kind": "talent_lens",
        "format": "pdf",
        "locale": "en",
        "tone": "plain"
      }
    }
  ],
  "accuracy_check": {
    "instant": "2000-01-01T12:00:00Z",
    "reference": "Swiss Ephemeris via pyswisseph 2.10.03",
    "bodies_compared": 10,
    "precision_compared_decimal_places": 6,
    "maximum_absolute_longitude_delta_degrees": 0.0,
    "mean_absolute_longitude_delta_degrees": 0.0,
    "observed_tropical_longitudes_degrees": {
      "sun": 280.36892,
      "moon": 223.323775,
      "mercury": 271.889275,
      "venus": 241.565798,
      "mars": 327.963313,
      "jupiter": 25.25303,
      "saturn": 40.395639,
      "uranus": 314.809223,
      "neptune": 303.192981,
      "pluto": 251.454709
    }
  },
  "latency_distributions_ms": [
    {
      "workload": "stored_chart_get_sequential",
      "sample_size": 12,
      "status_counts": { "200": 12 },
      "minimum": 171.4,
      "median_p50": 191.1,
      "p95": 237.7,
      "maximum": 241.4,
      "mean": 194.9
    },
    {
      "workload": "stored_chart_get_concurrent_12",
      "sample_size": 12,
      "status_counts": { "200": 12 },
      "median_p50": 2704.1,
      "p95": 2721.2,
      "maximum": 2721.7,
      "wall_time": 2752.2,
      "effective_completed_requests_per_second": 4.36
    },
    {
      "workload": "chart_creation_batch",
      "sample_size": 5,
      "status_counts": { "201": 5 },
      "minimum": 206.2,
      "median_p50": 241.2,
      "maximum": 313.3,
      "mean": 245.6
    },
    {
      "workload": "stored_chart_get_burst_60",
      "sample_size": 60,
      "status_counts": { "200": 60 },
      "median_p50": 10498.2,
      "p95": 10550.5,
      "maximum": 10555.0,
      "wall_time": 10561.0,
      "effective_completed_requests_per_second": 5.68
    },
    {
      "workload": "stored_chart_get_scheduled_4_rps",
      "sample_size": 40,
      "status_counts": { "200": 36, "429": 4 },
      "median_p50_successes": 214.2,
      "p95_successes": 243.5,
      "maximum_success": 260.4,
      "wall_time": 9989.0,
      "retry_after_seconds": 1
    },
    {
      "workload": "stored_chart_get_scheduled_2_rps_after_prior_test",
      "sample_size": 20,
      "status_counts": { "200": 19, "429": 1 },
      "median_p50_successes": 223.8,
      "p95_successes": 269.6,
      "maximum_success": 465.6,
      "wall_time": 9965.9,
      "retry_after_seconds": 1
    },
    {
      "workload": "pdf_report_status_polling",
      "sample_size": 19,
      "final_state": "running",
      "elapsed_before_stop": 41834.5,
      "median_poll_latency": 195.5
    }
  ],
  "raw_sanitized_results": [
    { "name": "health_cold", "method": "GET", "path": "/healthz", "status": 200, "latency_ms": 186.3 },
    { "name": "ready", "method": "GET", "path": "/readyz", "status": 200, "latency_ms": 43.8 },
    { "name": "version", "method": "GET", "path": "/version", "status": 200, "latency_ms": 41.8 },
    { "name": "authenticated_plan", "method": "GET", "path": "/v1/tenant/plan", "status": 200, "latency_ms": 217.8 },
    { "name": "create_western_a", "method": "POST", "path": "/v1/charts", "status": 201, "latency_ms": 866.2, "response_bytes": 4713 },
    { "name": "create_western_b", "method": "POST", "path": "/v1/charts", "status": 201, "latency_ms": 217.9, "response_bytes": 4726 },
    { "name": "create_vedic_a", "method": "POST", "path": "/v1/charts", "status": 201, "latency_ms": 215.9, "response_bytes": 4761 },
    { "name": "create_vedic_b", "method": "POST", "path": "/v1/charts", "status": 201, "latency_ms": 225.5, "response_bytes": 4745 },
    { "name": "western_summary", "method": "GET", "path": "/v1/western/charts/<chart-id>/summary", "status": 200, "latency_ms": 264.3, "response_bytes": 6117 },
    { "name": "western_aspects", "method": "GET", "path": "/v1/western/charts/<chart-id>/aspects", "status": 200, "latency_ms": 238.3, "response_bytes": 5168 },
    { "name": "western_fixed_stars", "method": "GET", "path": "/v1/western/charts/<chart-id>/fixed-stars", "status": 200, "latency_ms": 213.3, "response_bytes": 291 },
    { "name": "talent_profile", "method": "GET", "path": "/v1/charts/<chart-id>/profile/talent", "status": 200, "latency_ms": 2980.9, "response_bytes": 2245 },
    { "name": "career_profile_500", "method": "GET", "path": "/v1/charts/<chart-id>/profile/career", "status": 200, "latency_ms": 568.4, "response_bytes": 320643, "returned_professions": 436 },
    { "name": "template_interpretation", "method": "POST", "path": "/v1/interpretations", "status": 201, "latency_ms": 631.0, "response_bytes": 1345, "returned_statements": 3 },
    { "name": "llm_rewrite_on_free", "method": "POST", "path": "/v1/llm/interpretations", "status": 500, "latency_ms": 783.5, "response_bytes": 182, "error_code": "internal_error", "error_message": "Internal server error" },
    { "name": "western_transits", "method": "GET", "path": "/v1/western/charts/<chart-id>/transits", "status": 200, "latency_ms": 209.6, "response_bytes": 6780, "returned_hits": 51 },
    { "name": "western_annual_forecast", "method": "GET", "path": "/v1/western/charts/<chart-id>/annual-forecast", "status": 200, "latency_ms": 1835.8, "response_bytes": 3012 },
    { "name": "zodiacal_releasing_advanced", "method": "GET", "path": "/v1/western/charts/<chart-id>/zodiacal-releasing/advanced", "status": 200, "latency_ms": 219.2, "response_bytes": 10945, "returned_periods": 48 },
    { "name": "western_relationships", "method": "POST", "path": "/v1/western/relationships", "status": 200, "latency_ms": 216.1, "response_bytes": 27685 },
    { "name": "compatibility_full", "method": "POST", "path": "/v1/compatibility", "status": 201, "latency_ms": 255.9, "response_bytes": 9309 },
    { "name": "vedic_d60", "method": "GET", "path": "/v1/vedic/charts/<chart-id>/divisional/D60", "status": 200, "latency_ms": 223.7, "response_bytes": 571 },
    { "name": "vedic_vimshottari_full", "method": "GET", "path": "/v1/vedic/charts/<chart-id>/dashas/vimshottari", "status": 200, "latency_ms": 312.7, "response_bytes": 93265 },
    { "name": "vedic_ashtakavarga_corrected", "method": "GET", "path": "/v1/vedic/charts/<chart-id>/ashtakavarga/corrected", "status": 200, "latency_ms": 256.6, "response_bytes": 4439 },
    { "name": "vedic_shadbala_kala_full", "method": "GET", "path": "/v1/vedic/charts/<chart-id>/shadbala/kala-full", "status": 200, "latency_ms": 229.1, "response_bytes": 729 },
    { "name": "vedic_influence_network", "method": "GET", "path": "/v1/vedic/charts/<chart-id>/influence-network", "status": 200, "latency_ms": 226.7, "response_bytes": 15521 },
    { "name": "vedic_probability_career", "method": "GET", "path": "/v1/vedic/charts/<chart-id>/probability/career", "status": 200, "latency_ms": 233.2, "response_bytes": 1657 },
    { "name": "vedic_varshaphala", "method": "GET", "path": "/v1/vedic/charts/<chart-id>/varshaphala/<age-years>", "status": 200, "latency_ms": 246.2, "response_bytes": 211 },
    { "name": "vedic_muhurta_search", "method": "POST", "path": "/v1/vedic/muhurta/search", "status": 200, "latency_ms": 5540.9, "response_bytes": 65903, "returned_candidates": 50 },
    { "name": "vedic_panchanga_day", "method": "POST", "path": "/v1/vedic/panchanga", "status": 200, "latency_ms": 199.6, "response_bytes": 5506 },
    { "name": "rectification_grid_fine", "method": "POST", "path": "/v1/rectification/grid", "status": 200, "latency_ms": 1158.5, "response_bytes": 2355897 },
    { "name": "pdf_report_enqueue", "method": "POST", "path": "/v1/reports", "status": 202, "latency_ms": 327.0, "response_bytes": 289 }
  ],
  "usage_audit": {
    "total_requests": 199,
    "total_errors": 5,
    "errors_4xx": 5,
    "errors_5xx": 0,
    "maximum_reported_bucket_p95_ms": 6659,
    "note": "The observed HTTP 500 from the free-plan LLM rewrite was not reflected in the tenant 5xx counter when usage was queried. This may indicate metrics lag or a classification difference."
  },
  "interpretation": {
    "calculation_quality": "The tested deterministic calculations were responsive and the J2000 longitude check matched the local Swiss Ephemeris reference to six decimal places.",
    "throughput": "The service accepted a 60-request burst but drained it over about 10.56 seconds. Four of 40 requests scheduled at 4 RPS returned 429. Tests support treating roughly 2 RPS plus Retry-After handling as the practical sustained ceiling for this tenant at this time.",
    "production_risk": "This benchmark does not establish an SLA, commercial-use right, future quota, retention policy or production support commitment. Paid Astrolinkers tiers and self-service billing were not live when checked."
  },
  "limitations": [
    "One tenant, one Paris region and one test day.",
    "Synthetic inputs only; this is not a correctness audit of every calculation or house-system edge case.",
    "The published 1,000/day and 10,000/month limits were observed in authenticated plan data, but neither cap was exhausted.",
    "Latency depends on route, client network, caching, concurrent tenant load and service changes after the test date.",
    "The scheduled 2 RPS run followed the 4 RPS run, so its single 429 may reflect residual token-bucket state.",
    "The raw section contains the retained sanitized endpoint observations; secrets, identifiers and response bodies were intentionally excluded."
  ]
}
