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.
link_invalid 404
The download link was altered or is not ours.
Fix: GET /v1/reports/{id} returns a fresh signed link.
link_expired 410
Download links last 24 hours.
Fix: GET /v1/reports/{id} returns a fresh link while the file is kept (7 days).
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.
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.
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_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.