Перейти до вмісту
AstroWay/api v2.254.12 · docs
усі системи в нормі

Помилки

Усі помилки повертаються у єдиному форматі - ok: false плюс об’єкт error:

{
"ok": false,
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid API key"
}
}
  • code: машиночитний UPPER_SNAKE_CASE код, стабільний, не змінюється без мажорного бампа. Свіч по ньому, не по message.
  • message: людиночитне пояснення, англійською. Текст може уточнюватись без бампа.
  • details: опціональний. Для INVALID_INPUT це масив { path, message } по кожному проваленому полю. Для INVALID_FIELD до кожного елемента додається expected з канонічним ім’ям поля.
  • docs: опціональний, посилання на розділ цієї сторінки, коли для коду є докладніше пояснення.
  • request_id: додається лише до 5xx та BAD_JSON відповідей; цитуй його при зверненні в підтримку.
СтатусЗначення
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, вичерпано кредити або spend-cap
500 Internal Server ErrorВнутрішня помилка - з нашого боку, цитуй request_id
503 Service UnavailableAI-шлюз / черга тимчасово недоступні
КодЗначення
MISSING_API_KEYHeader X-Api-Key не надіслано
INVALID_API_KEYКлюч не існує або revoked
MISSING_BEARERСхема Authorization: Bearer обрана, але токен відсутній
WRONG_AUTH_METHODНа /v1/me/* (Bearer-only) надіслано X-Api-Key. Для перевірки ключа - GET /v1/auth/keys/me; для викликів API - будь-який /v1/* з X-Api-Key
КодЗначення
INSUFFICIENT_SCOPEКлюч не має прав на цю дію
DOMAIN_MISMATCH / FORBIDDEN_ORIGINOrigin запиту не в allow-list ключа
ENDPOINT_NOT_IN_SCOPEКлюч обмежений списком ендпоінтів (allowed_endpoints), і цього шляху в списку немає. details називає список
KEY_SUSPENDEDКлюч призупинено
КодЗначення
PLAN_UPGRADE_REQUIREDЕндпоінт потребує вищого тарифу або add-on пака
PLAN_PACK_MISMATCHЕндпоінт входить у пак, якого немає на ключі
SUBSCRIPTION_EXPIREDОплачений період закінчився більше ніж 3 дні тому. Перші 3 дні після закінчення запити ще обслуговуються за тарифом і несуть заголовок X-Subscription-Grace-Ends. details містить expired_at, grace_ended_at і renew_url
КодЗначення
RATE_LIMITПеревищено ліміт RPM. Відповідь містить header Retry-After: <sec>
CREDITS_EXHAUSTEDМісячний бюджет кредитів вичерпано
SPEND_CAP_REACHEDДосягнуто ліміт витрат на AI-ендпоінти
KEY_BUDGET_EXHAUSTEDКлюч вичерпав власний бюджет (credits_cap_cycle). Кредити на акаунті при цьому можуть лишатись: обмеження стосується саме цього ключа
КодЗначення
INVALID_INPUTОдне або кілька полів провалили Zod-валідацію. details - масив { path, message }
INVALID_FIELDТіло містить коротке ім’я поля замість канонічного. Див. нижче
MISSING_FIELDSВідсутнє обов’язкове поле
BAD_JSONБитий JSON у тілі запиту

Приклад 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" }
]
}
}

Chart-ендпоінти приймають лише повні імена полів. Короткі форми відхиляються з 400, а не читаються мовчки:

НадісланоКанонічне полеЩо очікується
latlatitudeдесяткові градуси, північ додатна
lng, lon, longlongitudeдесяткові градуси, схід додатний
tz із числом, tzOffset, utcOffset, timezone_offsettimezoneOffsetчисло годин від UTC, напр. 5.75
tz із назвою, timeZone, time_zonetimezoneназва зони IANA, напр. Europe/Kyiv, або auto

Відповідь перелічує всі знайдені поля за один раз, у порядку тіла запиту, тож перейменування робиться одним проходом:

{
"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.

Дві речі, на які варто зважати.

Це не депрекація. Короткі імена ніколи не були в контракті й не фігурували в /openapi.json як поля тіла. До 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

Section titled “Відсутні координати: 400 з 2026-11-09”

Правильне ім’я поля це половина справи. Тіло без latitude і longitude теж давало 200, бо координати мали типовий нуль, і відповідь описувала 0°N 0°E.

До 2026-11-09 такий запит працює, але відповідь несе Deprecation: true, Sunset, Warning і поле _warning у тілі. З 2026-11-09 це 400 INVALID_INPUT з latitude is required, in decimal degrees.

Явні latitude: 0, longitude: 0 валідні й далі: питання у відсутньому полі, а не в значенні. timezoneOffset типовий нуль зберігає, бо нуль там означає UTC. city координат не замінює: його ніхто не геокодує. Перевірка застосовується лише до об’єктів, які несуть одночасно date і time.

Розрахункові помилки (422)

Section titled “Розрахункові помилки (422)”
КодЗначення
CALCULATION_ERRORВхід валідний, але рушій не зміг порахувати (наприклад, полярна широта для Placidus). Спробуй Whole Sign / Equal або іншу дату.
КодHTTPЗначення
INTERNAL_ERROR500Неочікувана помилка. Логуємо зі stack trace, цитуй request_id
GATEWAY_UNAVAILABLE / AI_UNAVAILABLE / LLM_UNAVAILABLE503AI-шлюз недоступний. Retry з експоненційним backoff
QUEUE_UNAVAILABLE503Черга фонових задач недоступна

Обробка в клієнтському коді

Section titled “Обробка в клієнтському коді”
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})` : ''}`);
}
}

Свіч по code, не по message. Офіційні SDK (@astroway/sdk, astroway) кидають типізовані підкласи помилок за HTTP-статусом (AuthenticationError, RateLimitError, BadRequestError …), тож код обробки писати не доведеться.

Для звернення надішли на support@astroway.info:

  1. request_id з відповіді (якщо це 5xx)
  2. Ендпоінт і скорочений JSON body (без секретів)
  3. Очікувана поведінка vs фактична
  4. Часовий пояс і приблизний час запиту (UTC)

Відповідь - у межах SLA твого плану (48 год Starter, 24 год Pro, власна для Enterprise).

Корисно?
Запропонувати правку

Останнє оновлення: