Μετάβαση στο περιεχόμενο
AstroWay/api v2.254.12 · el
όλες οι υπηρεσίες λειτουργούν κανονικά

Σφάλματα

Όλα τα σφάλματα επιστρέφονται σε ενιαία μορφή: ok: false μαζί με ένα αντικείμενο error:

{
"ok": false,
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid API key"
}
}
  • code: κωδικός UPPER_SNAKE_CASE αναγνώσιμος από μηχανές, σταθερός, δεν αλλάζει χωρίς major αναβάθμιση έκδοσης. Κάνε switch σε αυτόν, όχι στο message.
  • message: εξήγηση αναγνώσιμη από άνθρωπο, στα αγγλικά. Το κείμενο μπορεί να βελτιώνεται χωρίς αλλαγή έκδοσης.
  • details: προαιρετικό. Για το INVALID_INPUT είναι ένας πίνακας { path, message } για κάθε πεδίο που απέτυχε. Για το INVALID_FIELD σε κάθε στοιχείο προστίθεται το expected με το κανονικό όνομα του πεδίου.
  • docs: προαιρετικό, σύνδεσμος σε ενότητα αυτής της σελίδας, όταν για τον κωδικό υπάρχει πιο αναλυτική εξήγηση.
  • request_id: προστίθεται μόνο στις απαντήσεις 5xx και BAD_JSON. Ανάφερέ το όταν επικοινωνείς με την υποστήριξη.
StatusΣημασία
200 OKΕπιτυχία
400 Bad RequestΧαλασμένο JSON, πεδία που λείπουν ή αποτυχημένη επικύρωση Zod
401 UnauthorizedΛείπει ή δεν είναι έγκυρο το X-Api-Key
402 Payment RequiredΑπαιτείται ανώτερο πλάνο / πακέτο, ή η συνδρομή είναι ανενεργή
403 ForbiddenΤο κλειδί είναι έγκυρο, αλλά δεν έχει δικαιώματα (scope, origin, suspended)
404 Not FoundΟ πόρος, το κλειδί ή το job δεν υπάρχει
422 Unprocessable EntityΗ είσοδος είναι έγκυρη, αλλά η μηχανή δεν μπόρεσε να κάνει τον υπολογισμό
429 Too Many RequestsΞεπεράστηκε το rate limit, εξαντλήθηκαν τα credits ή το spend cap
500 Internal Server ErrorΕσωτερικό σφάλμα από τη μεριά μας, ανάφερε το request_id
503 Service UnavailableΤο AI gateway / η ουρά δεν είναι προσωρινά διαθέσιμα
ΚωδικόςΣημασία
MISSING_API_KEYΗ κεφαλίδα X-Api-Key δεν στάλθηκε
INVALID_API_KEYΤο κλειδί δεν υπάρχει ή έχει ανακληθεί
MISSING_BEARERΕπιλέχθηκε το σχήμα Authorization: Bearer, αλλά λείπει το token
WRONG_AUTH_METHODΣτάλθηκε X-Api-Key σε /v1/me/* (μόνο Bearer). Για έλεγχο του κλειδιού: GET /v1/auth/keys/me. Για κλήσεις του API: οποιοδήποτε /v1/* με X-Api-Key
ΚωδικόςΣημασία
INSUFFICIENT_SCOPEΤο κλειδί δεν έχει δικαιώματα για αυτή την ενέργεια
DOMAIN_MISMATCH / FORBIDDEN_ORIGINΤο origin του αιτήματος δεν είναι στο allow-list του κλειδιού
ENDPOINT_NOT_IN_SCOPEΤο κλειδί περιορίζεται σε λίστα endpoints (allowed_endpoints) και αυτή η διαδρομή δεν είναι στη λίστα. Το details αναφέρει τη λίστα
KEY_SUSPENDEDΤο κλειδί έχει ανασταλεί
ΚωδικόςΣημασία
PLAN_UPGRADE_REQUIREDΤο endpoint απαιτεί ανώτερο πλάνο ή add-on πακέτο
PLAN_PACK_MISMATCHΤο endpoint ανήκει σε πακέτο που δεν υπάρχει στο κλειδί
SUBSCRIPTION_EXPIREDΗ πληρωμένη περίοδος έληξε πριν από περισσότερες από 3 ημέρες. Τις πρώτες 3 ημέρες μετά τη λήξη τα αιτήματα εξυπηρετούνται ακόμη σύμφωνα με το πλάνο και φέρουν την κεφαλίδα X-Subscription-Grace-Ends. Το details περιέχει expired_at, grace_ended_at και renew_url
ΚωδικόςΣημασία
RATE_LIMITΞεπεράστηκε το όριο RPM. Η απάντηση περιέχει την κεφαλίδα Retry-After: <sec>
CREDITS_EXHAUSTEDΟ μηνιαίος προϋπολογισμός credits εξαντλήθηκε
SPEND_CAP_REACHEDΕπιτεύχθηκε το όριο δαπανών για τα AI endpoints
KEY_BUDGET_EXHAUSTEDΤο κλειδί εξάντλησε τον δικό του προϋπολογισμό (credits_cap_cycle). Στον λογαριασμό μπορεί να έχουν μείνει credits: ο περιορισμός αφορά μόνο αυτό το κλειδί
ΚωδικόςΣημασία
INVALID_INPUTΈνα ή περισσότερα πεδία απέτυχαν στην επικύρωση Zod. Το details είναι πίνακας { path, message }
INVALID_FIELDΤο body περιέχει σύντομο όνομα πεδίου αντί για το κανονικό. Βλ. παρακάτω
MISSING_FIELDSΛείπει υποχρεωτικό πεδίο
BAD_JSONΧαλασμένο JSON στο body του αιτήματος

Παράδειγμα 400:

{
"ok": false,
"error": {
"code": "INVALID_INPUT",
"message": "Validation failed: date: Invalid input: expected string, received undefined",
"details": [
{ "path": "date", "message": "Invalid input: expected string, received undefined" },
{ "path": "time", "message": "Invalid input: expected string, received undefined" }
]
}
}

Τα endpoints χαρτών δέχονται μόνο πλήρη ονόματα πεδίων. Οι σύντομες μορφές απορρίπτονται με 400 αντί να διαβάζονται σιωπηλά:

ΣτάλθηκεΚανονικό πεδίοΤι αναμένεται
latlatitudeδεκαδικές μοίρες, ο βορράς θετικός
lng, lon, longlongitudeδεκαδικές μοίρες, η ανατολή θετική
tz με αριθμό, tzOffset, utcOffset, timezone_offsettimezoneOffsetαριθμός ωρών από το UTC, π.χ. 5.75
tz με όνομα, timeZone, time_zonetimezoneόνομα ζώνης IANA, π.χ. Europe/Kyiv, ή auto

Η απάντηση απαριθμεί όλα τα πεδία που βρέθηκαν με τη μία, με τη σειρά του body του αιτήματος, ώστε η μετονομασία να γίνεται σε ένα πέρασμα:

{
"ok": false,
"error": {
"code": "INVALID_FIELD",
"message": "Unsupported fields: \"tz\", \"lat\", \"lng\". Rename them to \"timezoneOffset\", \"latitude\", \"longitude\". See details for what each one expects.",
"details": [
{ "path": "tz", "expected": "timezoneOffset", "message": "numeric hours from UTC, e.g. 5.75; a zone name goes in timezone" },
{ "path": "lat", "expected": "latitude", "message": "decimal degrees, north positive" },
{ "path": "lng", "expected": "longitude", "message": "decimal degrees, east positive" }
],
"docs": "https://api.astroway.info/en/errors/#invalid_field"
}
}

Το path δείχνει την πλήρη διαδρομή, οπότε στη synastry φαίνεται σε ποιον χάρτη αφορά: chart1.lat, όχι απλώς lat.

Ο ίδιος κωδικός επιστρέφεται όταν το timezone δεν μπορεί να αναλυθεί: κενή τιμή, συντομογραφία όπως EST (που είναι σταθερό -5 όλο τον χρόνο, οπότε η Νέα Υόρκη τον Ιούλιο θα βγει λάθος κατά μία ώρα), όνομα που δεν υπάρχει στη βάση ζωνών ώρας, απόκλιση γραμμένη ως κείμενο, όπως +03:00, ή auto χωρίς latitude και longitude. Το μήνυμα υποδεικνύει τι να στείλεις αντί γι’ αυτό, και το path δείχνει το αντικείμενο, για παράδειγμα chart2.timezone.

Δύο πράγματα που αξίζει να λάβεις υπόψη.

Αυτό δεν είναι deprecation. Τα σύντομα ονόματα δεν ήταν ποτέ μέρος του συμβολαίου και δεν εμφανίζονταν στο /openapi.json ως πεδία του body. Μέχρι τις 2026-08-01 δεν λειτουργούσαν, αλλά αγνοούνταν σιωπηλά: οι συντεταγμένες έχουν προεπιλογή το μηδέν, οπότε ο χάρτης υπολογιζόταν για 0°N 0°E σε UTC. Ο ωροσκόπος, οι οίκοι και ό,τι προκύπτει από αυτούς ήταν λάθος, και η απάντηση δεν το ανέφερε. Γι’ αυτό οι σύντομες μορφές δεν γίνονται ξανά δεκτές: δύο ονόματα για ένα πεδίο για πάντα, και το tz επιπλέον είναι αμφίσημο (αριθμός ή όνομα ζώνης).

Το εμφωλευμένο point είναι άλλο πράγμα. Στα /v1/acg-zones, /v1/acg/by-category, /v1/ccg-analysis και /v1/eclipse-analysis το αντικείμενο point: { lat, lng } έχει δηλωμένα ονόματα πεδίων, και αυτά περνούν.

Συντεταγμένες που λείπουν: 400 από τις 2026-11-09

Ενότητα με τίτλο «Συντεταγμένες που λείπουν: 400 από τις 2026-11-09»

Το σωστό όνομα πεδίου είναι το μισό ζητούμενο. Ένα body χωρίς latitude και longitude έδινε επίσης 200, γιατί οι συντεταγμένες είχαν προεπιλογή το μηδέν, και η απάντηση περιέγραφε το 0°N 0°E.

Μέχρι τις 2026-11-09 ένα τέτοιο αίτημα λειτουργεί, αλλά η απάντηση φέρει Deprecation: true, Sunset, Warning και το πεδίο _warning στο body. Από τις 2026-11-09 είναι 400 INVALID_INPUT με latitude is required, in decimal degrees.

Τα ρητά latitude: 0, longitude: 0 παραμένουν έγκυρα: το ζήτημα είναι το πεδίο που λείπει, όχι η τιμή. Το timezoneOffset κρατά την προεπιλογή μηδέν, γιατί εκεί το μηδέν σημαίνει UTC. Το city δεν αντικαθιστά τις συντεταγμένες: κανείς δεν το γεωκωδικοποιεί. Ο έλεγχος εφαρμόζεται μόνο σε αντικείμενα που φέρουν ταυτόχρονα date και time.

ΚωδικόςΣημασία
CALCULATION_ERRORΗ είσοδος είναι έγκυρη, αλλά η μηχανή δεν μπόρεσε να κάνει τον υπολογισμό (για παράδειγμα, πολικό γεωγραφικό πλάτος για Placidus). Δοκίμασε Whole Sign / Equal ή άλλη ημερομηνία.
ΚωδικόςHTTPΣημασία
INTERNAL_ERROR500Απρόσμενο σφάλμα. Το καταγράφουμε με stack trace, ανάφερε το request_id
GATEWAY_UNAVAILABLE / AI_UNAVAILABLE / LLM_UNAVAILABLE503Το AI gateway δεν είναι διαθέσιμο. Retry με εκθετικό backoff
QUEUE_UNAVAILABLE503Η ουρά εργασιών παρασκηνίου δεν είναι διαθέσιμη
type ApiError = {
ok: false;
error: {
code: string;
message: string;
details?: unknown;
request_id?: string;
};
};
async function chart(input: ChartInput) {
const res = await fetch('https://api.astroway.info/v1/chart', {
method: 'POST',
headers: {
'X-Api-Key': process.env.ASTROWAY_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify(input),
});
const body = await res.json();
if (!body.ok) {
throw new AstrowayError(body.error.code, body.error.message, body.error.request_id);
}
return body.data;
}
class AstrowayError extends Error {
constructor(
public code: string,
message: string,
public requestId?: string,
) {
super(`[${code}] ${message}${requestId ? ` (request_id=${requestId})` : ''}`);
}
}

Κάνε switch στο code, όχι στο message. Τα επίσημα SDK (@astroway/sdk, astroway) πετούν τυποποιημένες υποκλάσεις σφαλμάτων ανάλογα με το HTTP status (AuthenticationError, RateLimitError, BadRequestError …), οπότε δεν θα χρειαστεί να γράψεις κώδικα χειρισμού.

Για να επικοινωνήσεις, στείλε στο support@astroway.info:

  1. Το request_id από την απάντηση (αν είναι 5xx)
  2. Το endpoint και ένα συντομευμένο JSON body (χωρίς μυστικά)
  3. Αναμενόμενη συμπεριφορά σε σχέση με την πραγματική
  4. Ζώνη ώρας και κατά προσέγγιση ώρα του αιτήματος (UTC)

Η απάντηση δίνεται εντός του SLA του πλάνου σου (48 ώρες Starter, 24 ώρες Pro, ατομικό για Enterprise).

Χρήσιμο;
Προτείνετε διόρθωση

Τελευταία ενημέρωση: