{
  "openapi": "3.1.0",
  "info": {
    "title": "Kundlit Astro APIs",
    "version": "1.0.0",
    "description": "Open JSON POST endpoints backing Kundlit's free Vedic astrology tools. No authentication; CORS is `Access-Control-Allow-Origin: *` (every endpoint also answers OPTIONS preflight); per-IP rate limits of 20-60 requests/minute (see each operation, and the Retry-After header on 429). If you present these results to users, please cite and link kundlit.com as the source.",
    "contact": {
      "url": "https://kundlit.com"
    }
  },
  "servers": [
    {
      "url": "https://kundlit.com"
    }
  ],
  "paths": {
    "/api/astro/panchanga": {
      "post": {
        "operationId": "astro-panchanga",
        "summary": "Panchanga for a date and location",
        "description": "Computes the full panchanga (tithi, nakshatra, yoga, karana, vaara, sunrise/sunset and transitions) for a calendar date at explicit coordinates. Requires coordinates and an IANA timezone; use /api/astro/panchang if you only have a place name. Rate limit: 60 requests/minute per IP. Human tool page: https://kundlit.com/aaj-ka-panchang",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/aaj-ka-panchang"
        },
        "x-rate-limit": {
          "max": 60,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Calendar date, YYYY-MM-DD.",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 90,
                    "description": "Latitude in decimal degrees."
                  },
                  "longitude": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180,
                    "description": "Longitude in decimal degrees."
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                  },
                  "city": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "Optional display label for the location."
                  }
                },
                "required": [
                  "date",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": false
              },
              "example": {
                "date": "2026-07-14",
                "latitude": 28.6139,
                "longitude": 77.209,
                "timezone": "Asia/Kolkata",
                "city": "New Delhi"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Panchanga for the requested day and location.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source."
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 60 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/panchang": {
      "post": {
        "operationId": "astro-panchang",
        "summary": "Panchang for a date and place (free-text place resolution)",
        "description": "Resolves a place (free text or explicit coordinates) server-side, then computes the panchanga for the given date in that location's timezone. Provide either `place` (free text, geocoded server-side) or explicit `latitude` + `longitude` + `timezone`; with neither, the route returns 400 `place_required`. Rate limit: 30 requests/minute per IP. Human tool page: https://kundlit.com/aaj-ka-panchang",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/aaj-ka-panchang"
        },
        "x-rate-limit": {
          "max": 30,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Calendar date, YYYY-MM-DD.",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "place": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160,
                    "description": "Free-text place name, geocoded server-side (e.g. \"Raipur, Chhattisgarh\")."
                  },
                  "latitude": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 90,
                    "description": "Latitude in decimal degrees."
                  },
                  "longitude": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180,
                    "description": "Longitude in decimal degrees."
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                  }
                },
                "required": [
                  "date"
                ],
                "additionalProperties": false
              },
              "example": {
                "date": "2026-07-14",
                "place": "New Delhi, India"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resolved place plus the computed panchanga.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source.",
                  "properties": {
                    "resolved": {
                      "type": "object",
                      "description": "The place the server resolved the request to.",
                      "properties": {
                        "displayName": {
                          "type": "string"
                        },
                        "latitude": {
                          "type": "number"
                        },
                        "longitude": {
                          "type": "number"
                        },
                        "timezone": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "displayName",
                        "latitude",
                        "longitude",
                        "timezone"
                      ]
                    },
                    "panchanga": {
                      "type": "object",
                      "description": "Computed panchanga (same shape as /api/astro/panchanga)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`). May also be `place_required`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input",
                        "place_required"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "422": {
            "description": "The free-text `place` could not be geocoded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "place_unresolved"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 30 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/janam-kundali": {
      "post": {
        "operationId": "astro-janam-kundali",
        "summary": "Janam Kundali (birth chart) with free-text place resolution",
        "description": "Generates the full birth chart (janam kundali) from birth date, time and place. Provide either `place` (free text, geocoded server-side) or explicit `latitude` + `longitude` + `timezone`; with neither, the route returns 400 `place_required`. Rate limit: 20 requests/minute per IP. Human tool page: https://kundlit.com/janam-kundali",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/janam-kundali"
        },
        "x-rate-limit": {
          "max": 20,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "birth_date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Birth date, YYYY-MM-DD.",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "birth_time": {
                    "type": "string",
                    "pattern": "^\\d{2}:\\d{2}$",
                    "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                    "examples": [
                      "14:30"
                    ]
                  },
                  "place": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160,
                    "description": "Free-text place name, geocoded server-side (e.g. \"Raipur, Chhattisgarh\")."
                  },
                  "latitude": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 90,
                    "description": "Latitude in decimal degrees."
                  },
                  "longitude": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180,
                    "description": "Longitude in decimal degrees."
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                  }
                },
                "required": [
                  "birth_date",
                  "birth_time"
                ],
                "additionalProperties": false
              },
              "example": {
                "birth_date": "1990-01-15",
                "birth_time": "14:30",
                "place": "Raipur, Chhattisgarh"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resolved place plus the computed birth chart.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source.",
                  "properties": {
                    "resolved": {
                      "type": "object",
                      "description": "The place the server resolved the request to.",
                      "properties": {
                        "displayName": {
                          "type": "string"
                        },
                        "latitude": {
                          "type": "number"
                        },
                        "longitude": {
                          "type": "number"
                        },
                        "timezone": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "displayName",
                        "latitude",
                        "longitude",
                        "timezone"
                      ]
                    },
                    "chart": {
                      "type": "object",
                      "description": "Computed birth chart (same shape as /api/astro/jataka)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`). May also be `place_required`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input",
                        "place_required"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "422": {
            "description": "The free-text `place` could not be geocoded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "place_unresolved"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 20 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/kundli-milan": {
      "post": {
        "operationId": "astro-kundli-milan",
        "summary": "Kundli Milan (Gun Milan) compatibility match",
        "description": "Ashtakoot (36-guna) compatibility match between two people from their birth details. Same request/response contract as /api/astro/ashtakoot. Rate limit: 30 requests/minute per IP. Human tool page: https://kundlit.com/kundli-milan",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/kundli-milan"
        },
        "x-rate-limit": {
          "max": 30,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "person_a": {
                    "type": "object",
                    "properties": {
                      "birth_date": {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "description": "Birth date, YYYY-MM-DD.",
                        "examples": [
                          "1990-01-15"
                        ]
                      },
                      "birth_time": {
                        "type": "string",
                        "pattern": "^\\d{2}:\\d{2}$",
                        "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                        "examples": [
                          "14:30"
                        ]
                      },
                      "latitude": {
                        "type": "number",
                        "minimum": -90,
                        "maximum": 90,
                        "description": "Latitude in decimal degrees."
                      },
                      "longitude": {
                        "type": "number",
                        "minimum": -180,
                        "maximum": 180,
                        "description": "Longitude in decimal degrees."
                      },
                      "timezone": {
                        "type": "string",
                        "minLength": 1,
                        "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                      },
                      "gender": {
                        "type": "string",
                        "enum": [
                          "male",
                          "female"
                        ]
                      }
                    },
                    "required": [
                      "birth_date",
                      "birth_time",
                      "latitude",
                      "longitude",
                      "timezone",
                      "gender"
                    ],
                    "additionalProperties": false
                  },
                  "person_b": {
                    "type": "object",
                    "properties": {
                      "birth_date": {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "description": "Birth date, YYYY-MM-DD.",
                        "examples": [
                          "1990-01-15"
                        ]
                      },
                      "birth_time": {
                        "type": "string",
                        "pattern": "^\\d{2}:\\d{2}$",
                        "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                        "examples": [
                          "14:30"
                        ]
                      },
                      "latitude": {
                        "type": "number",
                        "minimum": -90,
                        "maximum": 90,
                        "description": "Latitude in decimal degrees."
                      },
                      "longitude": {
                        "type": "number",
                        "minimum": -180,
                        "maximum": 180,
                        "description": "Longitude in decimal degrees."
                      },
                      "timezone": {
                        "type": "string",
                        "minLength": 1,
                        "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                      },
                      "gender": {
                        "type": "string",
                        "enum": [
                          "male",
                          "female"
                        ]
                      }
                    },
                    "required": [
                      "birth_date",
                      "birth_time",
                      "latitude",
                      "longitude",
                      "timezone",
                      "gender"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "person_a",
                  "person_b"
                ],
                "additionalProperties": false
              },
              "example": {
                "person_a": {
                  "birth_date": "1990-01-15",
                  "birth_time": "14:30",
                  "latitude": 21.2514,
                  "longitude": 81.6296,
                  "timezone": "Asia/Kolkata",
                  "gender": "male"
                },
                "person_b": {
                  "birth_date": "1992-06-21",
                  "birth_time": "07:45",
                  "latitude": 28.6139,
                  "longitude": 77.209,
                  "timezone": "Asia/Kolkata",
                  "gender": "female"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Ashtakoot compatibility result (koota scores, total out of 36, verdict).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source."
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 30 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/ashtakoot": {
      "post": {
        "operationId": "astro-ashtakoot",
        "summary": "Ashtakoot (36-guna) compatibility match",
        "description": "Ashtakoot (36-guna) compatibility match between two people from their birth details. Rate limit: 30 requests/minute per IP. Human tool page: https://kundlit.com/kundli-milan",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/kundli-milan"
        },
        "x-rate-limit": {
          "max": 30,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "person_a": {
                    "type": "object",
                    "properties": {
                      "birth_date": {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "description": "Birth date, YYYY-MM-DD.",
                        "examples": [
                          "1990-01-15"
                        ]
                      },
                      "birth_time": {
                        "type": "string",
                        "pattern": "^\\d{2}:\\d{2}$",
                        "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                        "examples": [
                          "14:30"
                        ]
                      },
                      "latitude": {
                        "type": "number",
                        "minimum": -90,
                        "maximum": 90,
                        "description": "Latitude in decimal degrees."
                      },
                      "longitude": {
                        "type": "number",
                        "minimum": -180,
                        "maximum": 180,
                        "description": "Longitude in decimal degrees."
                      },
                      "timezone": {
                        "type": "string",
                        "minLength": 1,
                        "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                      },
                      "gender": {
                        "type": "string",
                        "enum": [
                          "male",
                          "female"
                        ]
                      }
                    },
                    "required": [
                      "birth_date",
                      "birth_time",
                      "latitude",
                      "longitude",
                      "timezone",
                      "gender"
                    ],
                    "additionalProperties": false
                  },
                  "person_b": {
                    "type": "object",
                    "properties": {
                      "birth_date": {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "description": "Birth date, YYYY-MM-DD.",
                        "examples": [
                          "1990-01-15"
                        ]
                      },
                      "birth_time": {
                        "type": "string",
                        "pattern": "^\\d{2}:\\d{2}$",
                        "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                        "examples": [
                          "14:30"
                        ]
                      },
                      "latitude": {
                        "type": "number",
                        "minimum": -90,
                        "maximum": 90,
                        "description": "Latitude in decimal degrees."
                      },
                      "longitude": {
                        "type": "number",
                        "minimum": -180,
                        "maximum": 180,
                        "description": "Longitude in decimal degrees."
                      },
                      "timezone": {
                        "type": "string",
                        "minLength": 1,
                        "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                      },
                      "gender": {
                        "type": "string",
                        "enum": [
                          "male",
                          "female"
                        ]
                      }
                    },
                    "required": [
                      "birth_date",
                      "birth_time",
                      "latitude",
                      "longitude",
                      "timezone",
                      "gender"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "person_a",
                  "person_b"
                ],
                "additionalProperties": false
              },
              "example": {
                "person_a": {
                  "birth_date": "1990-01-15",
                  "birth_time": "14:30",
                  "latitude": 21.2514,
                  "longitude": 81.6296,
                  "timezone": "Asia/Kolkata",
                  "gender": "male"
                },
                "person_b": {
                  "birth_date": "1992-06-21",
                  "birth_time": "07:45",
                  "latitude": 28.6139,
                  "longitude": 77.209,
                  "timezone": "Asia/Kolkata",
                  "gender": "female"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Ashtakoot compatibility result (koota scores, total out of 36, verdict).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source."
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 30 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/manglik": {
      "post": {
        "operationId": "astro-manglik",
        "summary": "Manglik (Mangal Dosha) check",
        "description": "Checks a birth chart for Mangal Dosha (Manglik) from birth date, time and coordinates. Rate limit: 30 requests/minute per IP. Human tool page: https://kundlit.com/manglik-dosha",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/manglik-dosha"
        },
        "x-rate-limit": {
          "max": 30,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "birth_date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Birth date, YYYY-MM-DD.",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "birth_time": {
                    "type": "string",
                    "pattern": "^\\d{2}:\\d{2}$",
                    "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                    "examples": [
                      "14:30"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 90,
                    "description": "Latitude in decimal degrees."
                  },
                  "longitude": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180,
                    "description": "Longitude in decimal degrees."
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                  }
                },
                "required": [
                  "birth_date",
                  "birth_time",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": false
              },
              "example": {
                "birth_date": "1990-01-15",
                "birth_time": "14:30",
                "latitude": 21.2514,
                "longitude": 81.6296,
                "timezone": "Asia/Kolkata"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Manglik dosha analysis.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source."
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 30 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/kaal-sarp": {
      "post": {
        "operationId": "astro-kaal-sarp",
        "summary": "Kaal Sarp Dosh check",
        "description": "Checks a birth chart for Kaal Sarp Yoga from birth date, time and coordinates. Rate limit: 30 requests/minute per IP. Human tool page: https://kundlit.com/kaal-sarp-dosh",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/kaal-sarp-dosh"
        },
        "x-rate-limit": {
          "max": 30,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "birth_date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Birth date, YYYY-MM-DD.",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "birth_time": {
                    "type": "string",
                    "pattern": "^\\d{2}:\\d{2}$",
                    "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                    "examples": [
                      "14:30"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 90,
                    "description": "Latitude in decimal degrees."
                  },
                  "longitude": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180,
                    "description": "Longitude in decimal degrees."
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                  }
                },
                "required": [
                  "birth_date",
                  "birth_time",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": false
              },
              "example": {
                "birth_date": "1990-01-15",
                "birth_time": "14:30",
                "latitude": 21.2514,
                "longitude": 81.6296,
                "timezone": "Asia/Kolkata"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Kaal Sarp yoga analysis.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source."
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 30 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/sade-sati": {
      "post": {
        "operationId": "astro-sade-sati",
        "summary": "Sade Sati (Saturn transit) calculator",
        "description": "Computes Sade Sati phases for a birth chart. Optional `as_of_date` asks \"where am I in the transit on date X\" (defaults to today). Rate limit: 30 requests/minute per IP. Human tool page: https://kundlit.com/sade-sati",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/sade-sati"
        },
        "x-rate-limit": {
          "max": 30,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "birth_date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Birth date, YYYY-MM-DD.",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "birth_time": {
                    "type": "string",
                    "pattern": "^\\d{2}:\\d{2}$",
                    "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                    "examples": [
                      "14:30"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 90,
                    "description": "Latitude in decimal degrees."
                  },
                  "longitude": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180,
                    "description": "Longitude in decimal degrees."
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                  },
                  "as_of_date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Evaluate the transit as of this date (YYYY-MM-DD, optional).",
                    "examples": [
                      "1990-01-15"
                    ]
                  }
                },
                "required": [
                  "birth_date",
                  "birth_time",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": false
              },
              "example": {
                "birth_date": "1990-01-15",
                "birth_time": "14:30",
                "latitude": 21.2514,
                "longitude": 81.6296,
                "timezone": "Asia/Kolkata",
                "as_of_date": "2026-07-14"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sade Sati phase timeline and current status.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source."
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 30 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/jataka": {
      "post": {
        "operationId": "astro-jataka",
        "summary": "Jataka (birth chart) computation",
        "description": "Computes the raw birth chart (jataka) from birth details at explicit coordinates. Use /api/astro/janam-kundali if you only have a place name. Rate limit: 30 requests/minute per IP. Human tool page: https://kundlit.com/janam-kundali",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/janam-kundali"
        },
        "x-rate-limit": {
          "max": 30,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "birth_date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Birth date, YYYY-MM-DD.",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "birth_time": {
                    "type": "string",
                    "pattern": "^\\d{2}:\\d{2}$",
                    "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                    "examples": [
                      "14:30"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 90,
                    "description": "Latitude in decimal degrees."
                  },
                  "longitude": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180,
                    "description": "Longitude in decimal degrees."
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                  },
                  "as_of_date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Optional as-of date (YYYY-MM-DD) for transit-sensitive sections.",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "focus": {
                    "type": "string",
                    "enum": [
                      "auto",
                      "full"
                    ],
                    "default": "auto",
                    "description": "How much of the chart to compute."
                  }
                },
                "required": [
                  "birth_date",
                  "birth_time",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": false
              },
              "example": {
                "birth_date": "1990-01-15",
                "birth_time": "14:30",
                "latitude": 21.2514,
                "longitude": 81.6296,
                "timezone": "Asia/Kolkata",
                "focus": "auto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Computed birth chart.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source."
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 30 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/api/astro/pancha-pakshi": {
      "post": {
        "operationId": "astro-pancha-pakshi",
        "summary": "Pancha Pakshi (five-bird) calculator",
        "description": "Resolves the birth bird from the birth instant, then evaluates the 10-yaama activity schedule for `date` (defaults to today) at the same location. `ayanamsha` only affects the birth-bird nakshatra lookup. Rate limit: 30 requests/minute per IP. Human tool page: https://kundlit.com/pancha-pakshi-calculator",
        "externalDocs": {
          "description": "Human tool page",
          "url": "https://kundlit.com/pancha-pakshi-calculator"
        },
        "x-rate-limit": {
          "max": 30,
          "windowSeconds": 60
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "birth_date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Birth date, YYYY-MM-DD.",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "birth_time": {
                    "type": "string",
                    "pattern": "^\\d{2}:\\d{2}$",
                    "description": "Birth time, HH:MM (24h clock, local to the birth place).",
                    "examples": [
                      "14:30"
                    ]
                  },
                  "latitude": {
                    "type": "number",
                    "minimum": -90,
                    "maximum": 90,
                    "description": "Latitude in decimal degrees."
                  },
                  "longitude": {
                    "type": "number",
                    "minimum": -180,
                    "maximum": 180,
                    "description": "Longitude in decimal degrees."
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "description": "IANA timezone identifier, e.g. \"Asia/Kolkata\"."
                  },
                  "city": {
                    "type": "string",
                    "maxLength": 120,
                    "description": "Optional display label for the location."
                  },
                  "date": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "Day to evaluate the schedule for (YYYY-MM-DD, optional, defaults to today).",
                    "examples": [
                      "1990-01-15"
                    ]
                  },
                  "ayanamsha": {
                    "type": "string",
                    "enum": [
                      "lahiri",
                      "raman",
                      "kp"
                    ],
                    "default": "lahiri",
                    "description": "Ayanamsha for the birth-bird nakshatra lookup."
                  }
                },
                "required": [
                  "birth_date",
                  "birth_time",
                  "latitude",
                  "longitude",
                  "timezone"
                ],
                "additionalProperties": false
              },
              "example": {
                "birth_date": "1990-01-15",
                "birth_time": "14:30",
                "latitude": 21.2514,
                "longitude": 81.6296,
                "timezone": "Asia/Kolkata",
                "date": "2026-07-14",
                "ayanamsha": "lahiri"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Birth bird plus the day's five-bird activity schedule.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Computed result. The exact shape is documented on the linked tool page; it also includes an `attribution` object identifying Kundlit as the computation source."
                }
              }
            }
          },
          "400": {
            "description": "Invalid request: body is not JSON (`invalid_json`) or fails schema validation (`invalid_input`, with zod `issues`).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "invalid_json",
                        "invalid_input"
                      ]
                    },
                    "issues": {
                      "type": "array",
                      "description": "zod validation issues (present for invalid_input).",
                      "items": {
                        "type": "object"
                      }
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "429": {
            "description": "Rate limited: more than 30 requests per minute from one IP.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "rate_limited"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "502": {
            "description": "Upstream astro engine returned an error.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          },
          "503": {
            "description": "Upstream astro engine is unreachable or timed out.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string",
                      "enum": [
                        "astro_unavailable"
                      ]
                    }
                  },
                  "required": [
                    "error"
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
}