AstroMool API

Errors

Errors are RFC 9457 problem details (application/problem+json). Match on code - it never changes. detail is written for people and may be reworded. Quote request_id when you write to us.

{"type": "https://developers.astromool.com/errors#bad_date", "title": "Date not understood", "status": 422,
 "detail": "date must be YYYY-MM-DD (1995-08-14) or DD-MM-YYYY (14-08-1995).", "code": "bad_date",
 "request_id": "req_...", "field": "date"}

Keys and plans

key_missing 401

No X-API-Key header, or the value does not look like an AstroMool key.

Fix: Send the key in the X-API-Key header. Keys start with am_live_, am_test_ or am_pub_.

key_invalid 401

The key does not exist or was revoked.

Fix: Create a new key in the dashboard. Revoked keys stop working within 30 seconds.

domain_not_allowed 403

A widget key (am_pub_) was used from a page whose Origin/Referer is not one of its domains.

Fix: Add the domain to the key in the dashboard, or call from the server with an am_live_ key.

detail_not_in_plan 403

detail=full was asked for on a plan below Growth.

Fix: Use detail=basic, or move to Growth or above.

rate_limited 429

More requests in one minute than the plan allows. retry_after (body) and the Retry-After header give the seconds to wait; X-RateLimit-Limit / -Remaining / -Reset come with every keyed response.

Fix: Wait retry_after seconds. Spread bursts, or move to a bigger plan.

quota_exceeded 429

The key's monthly units are used up (months follow the Indian calendar, IST).

Fix: Upgrade, or wait for the 1st. Test keys have no monthly quota.

Input

invalid_request 422

The JSON body or a query value failed validation. errors[] lists each field with its message.

Fix: Fix the fields named in errors[].

bad_date 422

date could not be read.

Fix: Use YYYY-MM-DD (1995-08-14) or DD-MM-YYYY (14-08-1995).

bad_time 422

time could not be read or is out of range.

Fix: Use 24-hour HH:MM[:SS] (14:30) or h:mm AM/PM (2:30 PM).

bad_tz_id 422

tz_id is not an IANA time zone name.

Fix: Use a name like Asia/Kolkata. /v1/geo/search returns it for a place.

bad_utc_offset 422

utc_offset is not in +HH:MM form or is beyond +/-14:00.

Fix: Send e.g. +05:30, or better send tz_id.

timezone_required 422

Neither tz_id nor utc_offset was sent. The API never assumes +05:30.

Fix: Send tz_id (preferred: handles DST and historical offsets) or utc_offset.

bad_ayanamsa 422

ayanamsa is not one of the supported ids.

Fix: GET /v1/meta/ayanamsas lists them; lahiri is the default.

bad_node 422

node is not mean or true.

Fix: Send node=mean (default) or node=true.

unknown_calculator 404

The slug in /v1/calculators/{slug} or /v1/reports/{slug} does not exist.

Fix: GET /v1/calculators lists every slug.

partner_required 422

A matching calculator was called without partner.

Fix: Send partner with the same fields as person (for matching: person = groom, partner = bride).

unknown_param 422

params has a key no calculator uses.

Fix: Remove it; the message lists the allowed params.

calculator_rejected_input 422

The calculator itself refused the input (the message says why, e.g. a number out of range).

Fix: Correct the input named in the message.

bad_idempotency_key 422

Idempotency-Key is longer than 100 characters or not printable.

Fix: Use up to 100 printable characters, unique per report.

bad_webhook_url 422

webhook_url is not https, does not resolve, or points to a private address.

Fix: Use a public https:// URL you control.

Reports

idempotency_conflict 409

The Idempotency-Key was already used for a report with different input.

Fix: Use a new key for a new report. The same key with the same input returns the first report.

report_limit 429

The key created its plan's number of reports for today (IST).

Fix: Try tomorrow or upgrade.

report_not_found 404

No report with that id belongs to this key.

Fix: Use the report_id returned when you created it, with the same key.

report_gone 410

Report files are deleted after 7 days.

Fix: Create the report again.

Server

internal_error 500

Something failed on our side. It is logged with the request_id.

Fix: Retry. If it repeats, send us the request_id.

calculator_failed 502

The calculation did not complete.

Fix: Retry. If it repeats, send us the request_id.

ephemeris_unavailable 503

Swiss Ephemeris data is not available for the date (supported 1200-2400 AD). Nothing is ever computed with a lower-precision fallback.

Fix: Use a date inside 1200-2400 AD.

Dashboard

csrf 403

A dashboard request came without the dashboard header or from another site.

Fix: Use the dashboard page itself.

not_signed_in 401

The dashboard session ended.

Fix: Sign in again with your email.

invite_only 403

The email has no invite during the private beta.

Fix: Ask for an invite at [email protected].

bad_code 401

The sign-in code is wrong or older than 10 minutes.

Fix: Ask for a new code.

too_many_attempts 429

Too many sign-in codes or attempts in a short time.

Fix: Wait a few minutes.

mail_unavailable 503

The sign-in email could not be sent.

Fix: Try again later.

domains_required 422

A widget key was created without a domain.

Fix: Give at least one domain, e.g. example.com.

too_many_keys 422

The account already has 20 active keys.

Fix: Revoke an unused key first.

key_not_found 404

No active key with that id in your account.

Fix: Refresh the key list.

bad_plan 422

The plan cannot be bought.

Fix: Choose starter, growth, pro or business.

payment_unavailable 502

Razorpay did not answer when the payment was started.

Fix: Try again in a minute.

payment_not_verified 400

The payment signature, ids, order or amount did not verify. The plan was not changed.

Fix: If money was taken, write to us with the payment id.

payment_pending 409

Razorpay has not yet reported the payment as captured.

Fix: Nothing to do: the plan switches on by itself when Razorpay confirms, usually within minutes.

order_not_found 404

The payment's order does not belong to the signed-in account.

Fix: Sign in with the account that started the payment.

webhook_not_configured 503

Razorpay webhook received while no webhook secret is set (operator setting).

Fix: Operator: set the secret.

bad_signature 400

A Razorpay webhook whose signature did not verify.

Fix: Razorpay and the server must share the same secret.

bad_json 400

A signed Razorpay webhook whose body was not JSON.

Fix: None needed from users.