コンテンツにスキップ
AstroWay/api v2.254.12 · ja
すべてのシステムが正常です

エラー

すべてのエラーは統一された形式、つまり 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 UnauthorizedX-Api-Key がない、または無効
402 Payment Required上位のプランやパックが必要、またはサブスクリプションが無効
403 Forbiddenキーは有効だが権限がない (scope、origin、suspended)
404 Not Foundリソース、キー、またはジョブが存在しない
422 Unprocessable Entity入力は有効だが、エンジンが計算できなかった
429 Too Many Requestsレート制限の超過、クレジットの枯渇、または spend-cap への到達
500 Internal Server Error内部エラー、こちら側の問題です。request_id を伝えてください
503 Service UnavailableAI ゲートウェイまたはキューが一時的に利用できない
コード意味
MISSING_API_KEYX-Api-Key ヘッダーが送られていない
INVALID_API_KEYキーが存在しない、または revoke 済み
MISSING_BEARERAuthorization: Bearer スキームが選ばれているが、トークンがない
WRONG_AUTH_METHOD/v1/me/* (Bearer のみ) に X-Api-Key が送られた。キーの確認には GET /v1/auth/keys/me、API の呼び出しには X-Api-Key 付きの任意の /v1/* を使います
コード意味
INSUFFICIENT_SCOPEキーにこの操作の権限がない
DOMAIN_MISMATCH / FORBIDDEN_ORIGINリクエストのオリジンがキーの allow-list にない
ENDPOINT_NOT_IN_SCOPEキーがエンドポイントの一覧 (allowed_endpoints) で制限されており、このパスは一覧にない。details に一覧が入ります
KEY_SUSPENDEDキーが停止されている
コード意味
PLAN_UPGRADE_REQUIREDエンドポイントに上位のプランまたはアドオンパックが必要
PLAN_PACK_MISMATCHエンドポイントがキーにないパックに含まれている
SUBSCRIPTION_EXPIRED支払い済みの期間が 3 日以上前に終了した。終了後の最初の 3 日間は、リクエストは引き続きプランどおりに処理され、X-Subscription-Grace-Ends ヘッダーが付きます。details には expired_at、grace_ended_at、renew_url が含まれます
コード意味
RATE_LIMITRPM の制限を超過した。レスポンスには Retry-After: <sec> ヘッダーが含まれます
CREDITS_EXHAUSTED月間のクレジット予算を使い切った
SPEND_CAP_REACHEDAI エンドポイントの支出上限に達した
KEY_BUDGET_EXHAUSTEDキーが自身の予算 (credits_cap_cycle) を使い切った。アカウントにはクレジットが残っている場合があります。制限はこのキーだけに適用されます
コード意味
INVALID_INPUT1 つ以上のフィールドが 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" }
]
}
}

チャート系のエンドポイントは、完全なフィールド名だけを受け付けます。短縮形は黙って読まれるのではなく、400 で拒否されます。

送られたもの正規のフィールド期待される値
latlatitude10 進数の度、北が正
lng, lon, longlongitude10 進数の度、東が正
数値の tz、tzOffset、utcOffset、timezone_offsettimezoneOffsetUTC からの時間数、例: 5.75
名前の tz、timeZone、time_zonetimezoneIANA のゾーン名、例: 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 ではどちらのチャートかがわかります。単なる lat ではなく chart1.lat です。

timezone を解釈できない場合にも同じコードが返ります。空の値、EST のような略称 (これは 1 年中 -5 固定なので、7 月のニューヨークは 1 時間ずれます)、タイムゾーンのデータベースにない名前、+03:00 のように文字列で書かれたオフセット、latitude と longitude のない auto などです。メッセージは代わりに何を送るべきかを示し、path は chart2.timezone のようにオブジェクトを指します。

注意すべき点が 2 つあります。

これは非推奨化ではありません。 短縮形の名前が契約に含まれたことは一度もなく、/openapi.json にもボディのフィールドとして載っていませんでした。2026-08-01 までは機能しておらず、黙って無視されていました。座標のデフォルトが 0 なので、チャートは UTC の 0°N 0°E で計算されていたのです。アセンダント、ハウス、そこから導かれるものはすべて誤っており、レスポンスはそれを知らせませんでした。そのため短縮形を再び受け付けることはしません。1 つのフィールドに 2 つの名前を永久に持つことになり、しかも tz は曖昧です (数値なのかゾーン名なのか)。

入れ子の point は別物です。 /v1/acg-zones、/v1/acg/by-category、/v1/ccg-analysis、/v1/eclipse-analysis のオブジェクト point: { lat, lng } は宣言済みのフィールド名であり、そのまま通ります。

座標がない場合: 2026-11-09 から 400

Section titled “座標がない場合: 2026-11-09 から 400”

正しいフィールド名は半分にすぎません。latitude と longitude の ない ボディも 200 を返していました。座標のデフォルトが 0 だったため、レスポンスは 0°N 0°E を記述していたのです。

2026-11-09 まではこのようなリクエストも動作しますが、レスポンスには Deprecation: true、Sunset、Warning ヘッダーと、ボディの _warning フィールドが付きます。2026-11-09 からは latitude is required, in decimal degrees を伴う 400 INVALID_INPUT になります。

明示的な latitude: 0, longitude: 0 は引き続き有効です。問題はフィールドがないことであり、値ではありません。timezoneOffset はデフォルトの 0 を保持します。そこでは 0 が UTC を意味するからです。city は座標の代わりにはなりません。誰もジオコーディングしないからです。このチェックは、date と time を両方持つオブジェクトにだけ適用されます。

コード意味
CALCULATION_ERROR入力は有効だが、エンジンが計算できなかった (例: Placidus での極地の緯度)。Whole Sign / Equal か、別の日付を試してください。
コードHTTP意味
INTERNAL_ERROR500予期しないエラー。スタックトレース付きで記録しています。request_id を伝えてください
GATEWAY_UNAVAILABLE / AI_UNAVAILABLE / LLM_UNAVAILABLE503AI ゲートウェイが利用できない。指数バックオフでリトライしてください
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})` : ''}`);
}
}

分岐は message ではなく code で行ってください。公式 SDK (@astroway/sdk、astroway) は HTTP ステータスに応じて型付きのエラーサブクラス (AuthenticationError、RateLimitError、BadRequestError …) を投げるため、処理コードを書く必要はありません。

問い合わせの際は support@astroway.info に次の情報を送ってください。

  1. レスポンスの request_id (5xx の場合)
  2. エンドポイントと、短くした JSON ボディ (秘密情報は除く)
  3. 期待した動作と実際の動作
  4. タイムゾーンとおおよそのリクエスト時刻 (UTC)

回答はプランの SLA の範囲内で行います (Starter は 48 時間、Pro は 24 時間、Enterprise は個別)。

参考になりましたか?
編集を提案

最終更新日: