目次

CrestRate API リファレンス

通貨をまたいで受け取り・支払いを行う企業のための、複数ソース集約型のレートAPIです。レートをどちら側に有利にするかを選べ、スプレッドはAPIキーごとに設定でき、見積書はレートとスプレッドの両方をロックします。

  • ベースURL — https://api.crestrate.com。レートのエンドポイントはすべて /v1 の下にあります(例:https://api.crestrate.com/v1/rate)
  • はじめての導入 — まずクイックスタートへ。コピーできる4つのコードで最初のリクエストが通ります
  • 機械可読な仕様 — OpenAPI 3.1
  • プラン・クォータ・レート制限 — 料金
  • サービス稼働状況 — https://crestrate.com/ja/status

用途

ある通貨で価格を決め、別の通貨で決済するなら使えます。業種で対象を絞ってはいません。主な用途は次のとおりです。

  • 越境EC — 商品価格を顧客の通貨に換算
  • SaaS・サブスクリプション — 顧客ごとに現地通貨で請求
  • 訪日客の消費 — ホテル、小売、免税店、POSシステムは円で価格を設定し、訪日客は香港ドル、人民元、米ドル、ユーロで支払い
  • B2B輸出入 — 買い手の通貨で請求書を発行し、オファーの有効期間中は見積書でレートを固定
  • プラットフォーム・マーケットプレイス — 購入者からの受け取りは strategy=max、出品者への支払いは strategy=min
  • 旅行・留学・ビザ代行 — 顧客の通貨で見積もり
  • ゲーム・デジタル商品 — 地域別の価格設定

対応通貨

次の通貨はリアルタイムデータを提供しており、base と quote を自由に組み合わせられます。

通貨 コード 金額の最小単位
米ドル USD 0.01
日本円 JPY 1
ユーロ EUR 0.01
香港ドル HKD 0.01
人民元 CNY 0.01

現在リアルタイムデータを提供できません: TWD、SGD、GBP、AUD、KRW、MYR、THB。データが安定し次第提供します。

それまでは、これらのコードを使ったリクエストは HTTP 422 currency_not_available を返し、supported に利用可能な通貨の一覧が入ります。まったく認識できないコードは HTTP 400 unsupported_currency を返します。リクエストの通貨コードは大文字・小文字を区別せず、レスポンスでは常に大文字です。

レートの選び方

リクエストのたびに、単一のフィードではなく、その時点で正常なすべてのソースを同時に使って価格を算出します。

  1. 各ソースのレート表を共通の基準に正規化し、指定された通貨ペアをクロスレートとして算出します
  2. データが古いソースと、その通貨ペアを扱っていないソースを先に除外します
  3. 利用可能な中で最も鮮度の高い階層(リアルタイム → 毎時 → 日次)のソースの中央値をアンカーとします。 これが現在の市場価格の最も信頼できる推定値です
  4. アンカーから障害しきい値を超えて乖離しているソースは、破損データとして除外します
  5. 残ったソースから strategy に従ってレートを選びます。max は最も高いもの、min は最も低いもの、median は中央値に最も近いものです。 その後、両方向に制限をかけます。上限 cap_rate を超えれば引き下げ、下限 floor_rate を下回れば引き上げます
  6. 最後に、お客様の立場の方向へスプレッドを適用します。受け取る側なら上乗せ、支払う側なら差し引きです

レスポンスには、最終レートがどのソースから来たか、他の各ソースがいくらを提示したか、除外されたソースとその機械可読な理由(excluded_code)が必ず含まれます。ソースは source_a のような安定した匿名IDで示されます。 有効なソースが足りない場合は、保証できない数字を返す代わりに HTTP 503 no_rate を返します。

レートをどちら側に有利にするか

同じ通貨ペアでも、受け取るときはレートが高いほど、支払うときは低いほど有利です。strategy でお客様の立場を指定してください。レスポンスの side に、どちらの立場で計算したかが示されます。

strategy side 有利になる側 主な用途
max(デフォルト) charge 受け取る側:最も高いレートを選び、同じ価格でより多く受け取れます EC、SaaS、ホテル、B2B請求
min pay 支払う側:最も低いレートを選び、同じ支払額をより少なく済ませます マーケットプレイスの出品者への支払い、海外サプライヤーへの支払い
median charge 中立:全ソースの中央値に最も近いレート 会計記帳、社内レポート

strategy は大文字・小文字を区別せず、それ以外の値は HTTP 400 bad_request を返します。side はスプレッドの方向と端数処理の方向も決めます。

項目 charge(受け取る側) pay(支払う側)
スプレッド レートが上がり、顧客の支払いが増えます レートが下がり、お客様の支払いが減ります
payable の端数処理 通貨の最小単位に切り上げ 通貨の最小単位に切り捨て
gain_vs_mid payable - mid_payable(多く受け取れた額) mid_payable - payable(支払いを抑えられた額)

両方向に保護があります。 選ばれたレートは鮮度アンカー anchor_rate と比較されます。上限 cap_rate を超えれば戻され(capped: true)、下限 floor_rate を下回れば引き上げられます(floored: true)。受け取る側では実勢レートを大きく上回らず、支払う側では大きく下回りません。相手が公開レートと照合しても説明がつきます。スプレッドはお客様が明示的に設定するもので、この制限の後に適用されます。

スプレッド

スプレッドは、選ばれたレートに上乗せする幅です。単位はベーシスポイント(bps)で、100 bps = 1% です。

項目 説明
設定場所 ダッシュボードのAPIキー一覧です。キーごとに個別に設定します
既定のスプレッド そのキーがすべての通貨で使うスプレッドです
通貨ごとの設定 quote 通貨ごとに既定値を上書きできます。例:HKD は 120 bps、JPY は 200 bps。リアルタイムデータを提供している通貨のみ設定できます
設定範囲 0〜1000 bps(0%〜10%)。0 は「スプレッドを加えない」という明示的な設定です
反映タイミング 保存するとすぐに反映され、次のリクエストから新しい値が使われます
見積書 スプレッドは見積書の作成時に固定されます。後から変更しても、発行済みの見積書には影響しません

優先順位は次のとおりです(上ほど優先)。どれが使われたかはレスポンスの markup_source に示されます。

  1. そのキーの通貨ごとの設定 → key_currency
  2. そのキーの既定のスプレッド → key_default
  3. プラットフォームの既定値 → platform

同一通貨のペア(例:USD → USD)は換算が発生しないため、スプレッドは適用されず、markup_source は none になります。

方向と端数処理は side に従うため、結果は常にお客様に有利です。 受け取る側:raw_rate × (1 + markup_bps/10000)、金額は切り上げ。支払う側:raw_rate × (1 - markup_bps/10000)、金額は切り捨て。

計算例(数値は説明用で、実際のレートではありません。比較しやすいよう、どちらの場合も選ばれたレートを 7.8000 とします):1,000 米ドルの注文を香港ドルで決済し、スプレッドは 150 bps(1.5%)。

ケース スプレッドなし スプレッド 150 bps 差額
受け取る場合(strategy=max) レート 7.8000、顧客の支払い HK$7,800.00 レート 7.9170、顧客の支払い HK$7,917.00 HK$117.00 多く受け取り
支払う場合(strategy=min) レート 7.8000、お客様の支払い HK$7,800.00 レート 7.6830、お客様の支払い HK$7,683.00 HK$117.00 支払いを削減

保存前にプレビューできます。 ダッシュボードでスプレッドを設定すると、値を調整するたびに、顧客の支払いがいくら増えるか、お客様の支払いがいくら減るかがその場で表示されます。

開示について。 スプレッドの開示が求められる地域(例:EUにおける消費者向け決済)では、お客様の顧客に対してスプレッドを開示してください。

見積書によるロック

見積書は、顧客に提示した価格を有効期限まで固定します。表示から支払いまでの間にレートが動いても、金額の食い違いは起きません。

  • POST /v1/quotes は、作成時点の最終レート rate、適用中のスプレッド markup_bps、決済金額 payable を固定します
  • その後ダッシュボードでキーのスプレッドを変更しても、発行済みの見積書は変わりません
  • 見積書の有効時間は ttl_seconds です(現在は 900 秒、つまり 15 分)。値はハードコードせず、レスポンスから読み取ってください
  • quote_id を保存し、顧客の支払い時に GET /v1/quotes/{quote_id} で取得してください。expires_at を過ぎると 404 になるため、新しい見積書を作成してください

ウェブサイトのデモ

トップページのライブデモは試用のためのものであり、組み込み用のAPIではありません。

  • データは 1 時間遅れです。各ソースの 1 時間前の最新スナップショットで計算し、結果の横にデータ時刻を表示します
  • すべてのリクエストで、操作不要の人間確認(Cloudflare Turnstile)を行います
  • プラットフォームの既定スプレッドを使い、ネットワーク単位と全体でレート制限があり、混雑時は「混雑中」と表示されることがあります
  • APIキーは受け付けず、どのアカウントの利用量としても計量されません

リアルタイムのデータが必要な場合は、ダッシュボードで無料のAPIキーを作成してください。

APIリファレンス

認証

すべての /v1 エンドポイントでAPIキーが必要です。匿名アクセスはありません。

ヘッダー 例
X-API-Key X-API-Key: <お客様のキー>
Authorization Authorization: Bearer <お客様のキー>
  • どちらか一方を送ってください。両方ある場合は X-API-Key が使われます
  • キーの作成・失効はダッシュボードで行います。事前にメールアドレスの確認が必要で、1 アカウントが同時に持てる有効なキーは最大 10 個です。平文のキーは一度だけ表示されます
  • 失効したキーは直ちに使えなくなります(HTTP 401 invalid_api_key)
  • APIはお客様のサーバーから呼び出してください。/v1 のレスポンスには CORS ヘッダーが付かず、ウェブページやモバイルアプリに埋め込んだキーは誰でも取り出せます
  • GET /health と GET /openapi.json はキー不要です

共通仕様

項目 説明
レートと金額は必ず文字列 JSONのnumberではありません。JSONのnumberはIEEE 754倍精度であり、0.05117904 のような値は解析時に精度が落ち、金額が狂います。Decimal(Python)/ BigDecimal(Java)/ decimal.js(JS)で解析してください。レートは小数点以下 8 桁です
時刻 常にISO 8601のUTC文字列です(例:2026-09-14T10:38:01Z)。演算が必要な箇所では *_unix(Unix秒、小数)も併せて返します
パーセント 文字列で、単位は % です(小数ではありません)。"0.1791" は0.1791%を意味し、17.91%ではありません
通貨コード ISO 4217。リクエストでは大文字・小文字を区別せず、レスポンスでは大文字です。上記「対応通貨」を参照してください
base / quote base = 価格を決める通貨、quote = 決済通貨(受け取る場合は顧客の支払通貨、支払う場合はお客様が支払う通貨)。レートの意味は常に「base 1単位が quote いくらに相当するか」です
キャッシュと Cookie レートのレスポンスには Cache-Control: no-store が付きます。APIが Cookie を設定することはありません

レート制限と月間クォータ

各プランには、レート制限(一定の速度と短時間のバースト)と月間リクエストクォータがあり、料金ページに掲載しています。

  • どちらもキー単位ではなくアカウント単位で数えます。 同一アカウントのすべてのAPIキーが、1 つのレート制限と 1 つの月間クォータを共有します。キーを増やしても上限は増えません。X-Quota-* ヘッダーはアカウント全体の合計を示します
  • 月間クォータは各暦月の開始時(UTC)にリセットされます
  • 認証と上限のチェックを通過したリクエストは、結果にかかわらずクォータに数えられます(400、404、422、503 を含む)。401、403、429 で拒否されたリクエストは数えられません
  • /v1 エンドポイントへの HEAD リクエストは GET とまったく同じように処理され(レート計算がすべて実行されます)、クォータとレート制限にも同じように数えられます
  • 存在しないパスは 404 not_found を返し、計量されません

すべての /v1 レスポンス(エラーを含む)に次のヘッダーが付きます。

ヘッダー 意味
X-RateLimit-Limit 最大バースト:連続して送れるリクエスト数
X-RateLimit-Remaining 待たずに今すぐ送れるリクエスト数
X-RateLimit-Reset 次のリクエスト枠が使えるようになる Unix 時刻(秒)
X-Quota-Limit アカウントの月間クォータ。0 は無制限
X-Quota-Used アカウントが今月使ったリクエスト数(今回を含む)
X-Quota-Remaining 今月の残りリクエスト数。X-Quota-Limit が 0(無制限)のときは常に 0 なので、先に上限を確認してください
X-Request-Id このリクエストのID。サポートへの問い合わせ時に添えてください
Retry-After 待つべき秒数。429 rate_limited のときだけ付きます

リクエストをアカウントに結び付けられない場合(キーがない・無効、アカウントが停止中またはメール未確認、ボディが大きすぎる、内部エラー)、レート制限とクォータのヘッダーはどのアカウントとも無関係な中立の既定値になります。

上限に達したとき

レスポンス 意味 対処
429 rate_limited 短時間にリクエストが多すぎる Retry-After 秒待ってから再試行(ボディにも retry_after があります)
429 quota_exceeded アカウントの月間クォータを使い切った。ハードブロックで、超過課金はなく、Retry-After も付きません 再試行しないでください。アップグレード(upgrade_url は料金ページの絶対URL)するか翌月を待ってください。ボディに used と quota が入ります

リクエストの処理順序

リクエストは次の順にチェックされ、最初に通らなかったチェックがレスポンスを決めます。

  1. ボディのサイズ:16 KiB を超える → 413 payload_too_large
  2. APIキーがない → 401 api_key_required、無効または失効済み → 401 invalid_api_key
  3. アカウント停止 → 403 account_disabled、メールアドレス未確認 → 403 email_not_verified
  4. レート制限 → 429 rate_limited、月間クォータ → 429 quota_exceeded
  5. パラメータ → 400 bad_request / 400 unsupported_currency / 422 currency_not_available(この時点でクォータに数えられています)
  6. 価格算出 → 有効ソース不足で 503 no_rate、データストアに一時的に接続できない場合は 503 storage_unavailable

GET /v1/rate

単一の通貨ペアの最終レートを、全データソースの内訳付きで返します。

クエリパラメータ

パラメータ 必須 説明
base はい 価格を決める通貨。別名 from
quote はい 決済通貨。別名 to
strategy いいえ レートをどちら側に有利にするか:max(デフォルト、受け取る側)/ min(支払う側)/ median(中立)。大文字・小文字を区別しません

同一通貨のペア(例:base=USD&quote=USD)はレート 1.00000000 を返し、chosen_provider と anchor_tier は identity になります。

レスポンス:トップレベルのフィールド

フィールド 型 説明
base string 価格を決める通貨
quote string 決済通貨
rate string 最終レート。金額計算にそのまま使うのはこれです。受け取る側(side=charge)は raw_rate × (1 + markup_bps/10000)、支払う側(side=pay)は raw_rate × (1 - markup_bps/10000) です。markup_bps が0のときは raw_rate と一致します
raw_rate string スプレッド適用前のレート。strategy に従って各ソースから選ばれ、上限または下限に達した場合は cap_rate / floor_rate に調整済みの値です
mid_rate string 有効ソースの中央値で、市場のミッドレートにほぼ相当します。市場からどれだけ高いかを測る基準に使えます
low_rate string 有効ソースの中で最も低いレート。strategy=min かつ下限未適用なら raw_rate と一致します
high_rate string 有効ソースの中で最も高いレート。strategy=max かつ上限未適用なら raw_rate と一致します
markup_bps int この呼び出しで実際に適用されたスプレッド(bps、100 bps = 1%)。同一通貨のペアでは常に 0
markup_source string スプレッドの出どころ:key_currency(そのキーの通貨ごとの設定)/ key_default(そのキーの既定値)/ platform(プラットフォームの既定値)/ none(同一通貨のペアで、スプレッドなし)
strategy string 使われた選択戦略:max / median / min
side string この呼び出しがどちら側に有利か:charge(受け取る側。max と median)/ pay(支払う側。min)。スプレッドの方向と端数処理はこれに従います
chosen_provider string 最終レートがどのソースから来たか。source_a のような匿名ID。同一通貨のペアでは identity
source_count int 価格算出に使われた有効なソースの数(除外されたものは含みません)
spread_vs_mid_pct string 最終レートの mid_rate からの乖離(%、小数点以下 4 桁)。受け取る側では通常プラス、支払う側では通常マイナス
anchor_rate string 鮮度アンカー。外れ値の除外も上限・下限もこれを基準にします。利用可能な最も新しい階層の中央値です
anchor_tier string アンカーの出どころの階層:realtime / hourly / daily / all / identity。daily や all に下がった場合は、新しいソースがすべて使えず、市場から乖離している可能性があります
anchor_notes string[] より新しい階層がアンカーに使われなかった理由(英語)。通常は空配列
cap_rate string | null 上限:anchor_rate に一定幅を加えた値。raw_rate がこれを超えることはありません。同一通貨のペアでは null
capped bool true は、選ばれたレートが上限を超えて引き下げられたことを示します。市場が動いているのに遅いソースが追いついていないサインで、アラートに値します
floor_rate string | null 下限:anchor_rate から同じ幅を引いた値。raw_rate がこれを下回ることはありません。同一通貨のペアでは null
floored bool true は、選ばれたレートが下限を下回って引き上げられたことを示します。strategy=min で多く見られます
sources object[] 除外されたものも含む、ソースごとの内訳。下表を参照
generated_at string このレスポンスの生成時刻(ISO 8601 UTC)
generated_at_unix float 同上、Unix秒

レスポンス:sources[] の各要素

フィールド 型 説明
provider string 安定した匿名のソースID(例:source_a)
label string 表示名(例:Source A)
data_freq string | null ソース自体のデータの更新頻度:realtime / hourly / daily
rate string | null このソースが示した base→quote のレート。null はこのソースがそのペアを扱っていないことを示します
vs_anchor_pct string | null anchor_rate からの乖離(%、プラスは高い)
fetched_at string 当社が取得した時刻(ISO 8601 UTC)
age_seconds float その取得からの経過秒数
source_time string | null ソース自身が主張するデータの時刻。null はソースがこれを公開していないことを示します
used bool 今回の価格算出に使われたか
chosen bool 選ばれたソースかどうか
excluded_code string | null 除外理由の機械可読コード。使われた場合は null。監視ではこれで照合してください
excluded_reason string | null 人が読むための英語の除外理由。使われた場合は null。文言は変わることがあるため、解析しないでください

excluded_code の値

excluded_code excluded_reason の例 意味 対処
missing_currency Source does not cover this currency pair そのソースがこのペアを扱っていない 正常です。他のソースが補います
snapshot_stale Snapshot is stale (9000s > 7200s) そのソースから長時間新しいデータを取得できていない 他のソースが補います。続く場合は稼働状況ページを確認してください
deviates_from_anchor Deviates 12.5% from the realtime tier anchor, beyond +/-5%; treated as a data fault ソースの値がアンカーから離れすぎている そのソースのデータが破損している可能性が高く、お客様側での対応は不要です

GET /v1/rates

複数の通貨ペアのレート表を 1 回で取得します。各行は GET /v1/rate の簡略版で、sources の内訳は含みません。

クエリパラメータ

パラメータ 必須 説明
base いいえ カンマ区切りの価格通貨(例:USD,EUR)。空の項目と重複は無視されます
quote いいえ カンマ区切りの決済通貨(例:JPY,HKD)

省略した場合はサービスの既定の通貨グリッドが使われます。正確な行に依存する場合は、両方を明示的に指定してください。 一覧に認識できないコードが含まれるとリクエスト全体が 400 unsupported_currency、リアルタイムデータを提供していない通貨が含まれると 422 currency_not_available を返します。base の一覧全体が quote より先にチェックされます。同じ一覧の中では認識できないコードがリアルタイムデータを提供していない通貨より優先されますが、base の問題が常に先に報告されるため、base にリアルタイムデータを提供していない通貨、quote=ZZZ を指定すると 422 を返します。

各行にはお客様のキーのスプレッドではなく、プラットフォームの既定スプレッドが適用されます。 ご自身のスプレッドを適用するには GET /v1/rate または GET /v1/convert を使ってください。

レスポンス

フィールド 型 説明
rows object[] base × quote の組み合わせごとに 1 行
generated_at / generated_at_unix string / float 生成時刻

rows[] の各要素

フィールド 型 説明
base / quote string 通貨ペア
final_rate string プラットフォームの既定スプレッドを適用した最終レート
raw_rate string スプレッド適用前
mid_rate string ソース間の中央値
chosen_provider string 選ばれたソース(匿名ID)
source_count int 有効なソースの数
markup_bps int 適用されたスプレッド(プラットフォームの既定値)
spread_pct string ミッドに対するプレミアム(%、小数点以下 3 桁)
anchor_tier string アンカーの階層
capped bool 上限に達したか
error string | null null でない場合、その行にはレートがありません。base、quote、error のみが入ります。典型的な原因はそのペアの有効ソース不足です。行を使う前に必ず null をチェックしてください

GET /v1/convert

価格通貨の金額を決済金額に換算します。金額は通貨の最小単位に丸められ(JPY は 1、USD・EUR・HKD・CNY は 0.01)、端数処理の方向は side に従います。受け取る側は切り上げ、支払う側は切り捨てなので、端数は常にお客様に有利です。

クエリパラメータ

パラメータ 必須 説明
base / quote はい GET /v1/rate と同じ(別名 from / to を含む)
amount はい 価格通貨での金額。10 進数の文字列で、0 より大きいこと。換算結果(payable、mid_payable)は決済通貨の最小単位に丸めた後、小数部を含めて最大 28 桁までで、これを超える金額は 400 bad_request を返します
strategy いいえ GET /v1/rate と同じ

レスポンス

フィールド 型 説明
base / quote string 通貨ペア
amount string 渡された金額(10 進数の文字列)
payable string 決済金額。受け取る側(side=charge)では顧客の支払額で切り上げ、支払う側(side=pay)ではお客様の支払額で切り捨て
rate string 使われた最終レート
mid_rate string 市場のミッドレート
mid_payable string ミッドレートでの金額(四捨五入)。比較用
gain_vs_mid string お客様に有利な差額。大きいほど良い。受け取る側:payable - mid_payable(多く受け取れた額)。支払う側:mid_payable - payable(支払いを抑えられた額)
markup_bps int 適用されたスプレッド
markup_source string スプレッドの出どころ。GET /v1/rate と同じ
side string charge / pay。GET /v1/rate と同じ
chosen_provider string レートの出どころのソース(匿名ID)
source_count int 有効なソースの数
anchor_tier string アンカーの階層
capped bool 上限に達したか
floored bool 下限に達したか

GET /v1/convert は換算するだけで、価格をロックしません。実際の注文には POST /v1/quotes を使ってください。


POST /v1/quotes

ロックされた見積書を作成します。レート、スプレッド、payable は ttl_seconds の間固定され、決済には payable を使います。

リクエストボディ(JSON オブジェクト、Content-Type: application/json、16 KiB 以下)

フィールド 必須 説明
base / quote はい 通貨ペア。別名 from / to
amount はい 価格通貨での金額。0 より大きいこと。10 進数の文字列を推奨しますが、JSON の number も受け付けます
reference いいえ お客様自身の注文番号(最大 128 文字)。保存され、照合用にそのまま返されます
strategy いいえ レートをどちら側に有利にするか。GET /v1/rate と同じ

ボディが正しい JSON でない、JSON オブジェクトでない、フィールドの型が違う場合は 400 bad_request を返します。

レスポンス(HTTP 201)

フィールド 型 説明
quote_id string 見積書ID(小文字の 16 進数 32 文字)。後の照会や照合のために保存してください
reference string | null 渡された注文番号をそのまま返します
base / quote string 通貨ペア
amount string 価格通貨での金額
payable string 決済金額、つまりロックされた値。有効期限まで変わりません。端数処理は side に従います
rate string ロックされた最終レート
raw_rate string スプレッド適用前のレート
mid_rate string 注文時点の市場のミッドレート(照合用)
markup_bps int 作成時に固定されたスプレッド。後でダッシュボードでスプレッドを変更しても、この見積書には影響しません
strategy string 選択戦略
side string charge / pay。GET /v1/rate と同じ
chosen_provider string レートの出どころのソース(匿名ID)。紛争や照合の際の根拠になります
source_count int その時点の有効なソースの数
created_at / created_at_unix string / float 作成時刻
expires_at / expires_at_unix string / float 有効期限。過ぎるとそのIDでの照会は 404 になります
ttl_seconds int ロック時間(秒)

見積書を保存できなかった場合は 503 storage_unavailable を返し、見積書は存在しません。リクエストを再試行してください。

GET /v1/quotes/{quote_id}

見積書を取得します。フィールドは作成時に返されたものとまったく同じで、1 つだけ追加されます。

フィールド 型 説明
expired bool 期限切れかどうか。見積書は期限切れと同時に削除されるため、通常は 404 になります。このフィールドが true になるのは削除直前のごく短い間だけです
  • quote_id が小文字の 16 進数 32 文字でない、または見積書が存在しない・期限切れ → 404 not_found
  • 503 storage_unavailable は今は確認できないという意味で、見積書が期限切れになったことを意味しません。再試行してください

GET /v1/sources

現在どのソースがレートを供給しているか、それぞれの鮮度はどうかを返します。あるレートをどこまで信頼できるかの判断に使います。

レスポンス

フィールド 型 説明
sources object[] 現在有効なソース
source_count int ソースの数
last_poll_at string | null 最後に取得した時刻(ISO 8601 UTC)

sources[] の各要素

フィールド 型 説明
provider string 匿名のソースID。GET /v1/rate の sources[].provider と対応します
label string ソースの表示名
data_freq string ソース自体のデータの更新頻度:realtime / hourly / daily
last_fetch_at string | null 当社がそのソースから最後に取得した時刻
last_fetch_age float | null 最後の取得からの経過秒数
source_time string | null ソース自身が主張するデータの時刻。null はソースがこれを公開していないことを示します
source_age_seconds float | null ソースのデータの経過秒数
currencies int そのソースが現在扱っている対応通貨の数

この 2 つの時刻はまったく意味が違います。 last_fetch_at は当社がデータを取得した時刻なので、常に新しい値です。 source_time はソース自身がデータの時刻だと主張しているものです。日次ソースは通常 12〜36 時間遅れ、 週末には 80 時間を超える日次ソースもありますが、それは正常です。 last_fetch_at だけで鮮度を判断すると大きく見誤ります。


GET /health

サービスのヘルスチェックです。APIキーは不要です。監視やロードバランサー向けです。

フィールド 型 意味
status string ok / degraded。「今レートを出せるか」だけを表します
sources_healthy int 現在、新しく使えるデータを持つソースの数
last_updated_at string | null 最も新しいソースデータを取得した時刻(ISO 8601 UTC)

HTTP ステータス:ok なら 200、degraded なら 503。

このエンドポイントは意図的に単一のヘルスシグナルだけを返し、内部の取得状況や上流のエラー詳細は返しません。 ソースごとの鮮度は GET /v1/sources か、稼働状況ページで確認してください。

GET /openapi.json

上記すべてのエンドポイントの OpenAPI 3.1 ドキュメントで、https://api.crestrate.com/openapi.json にあります。APIキーは不要で、ブラウザから取得でき(CORS 許可)、5 分間キャッシュされます。2 つの認証方式(X-API-Key と Bearer)の両方を宣言しているため、SDK ジェネレーターでそのまま使えます。

ウェブサイトの https://crestrate.com/openapi.json は、このアドレスへの HTTP 302 リダイレクトを返します。ツールにはAPIのアドレスを直接指定してください。

エラーレスポンス

エラーはすべてのエンドポイントで同じ形です。

フィールド 型 説明
error string 機械可読なエラーコード。message ではなくこれで照合してください
message string 人が読むための英語の説明。文言は変わることがあります
currency string 問題の通貨コード(unsupported_currency、currency_not_available)
supported string[] リアルタイムデータを提供している通貨(currency_not_available)
retry_after number 待つべき秒数(rate_limited)
used / quota int 今月の使用リクエスト数 / 月間クォータ(quota_exceeded)
upgrade_url string 料金ページの絶対URL(quota_exceeded)
HTTP error 意味 再試行
400 bad_request パラメータの欠落または不正:base/quote がない、amount がない・0 以下・数値でない・大きすぎる、不明な strategy、ボディが正しい JSON でない、reference が長すぎる 不可。リクエストを修正してください
400 unsupported_currency 認識できない通貨コード。currency が付きます 不可
401 api_key_required APIキーが送られていない 不可。X-API-Key か Authorization: Bearer を送ってください
401 invalid_api_key キーが無効、または失効済み 不可
403 account_disabled アカウントが停止されている。サポートにご連絡ください 不可
403 email_not_verified アカウントのメールアドレスが未確認 確認後に可
404 not_found 見積書が存在しない・期限切れ、または存在しないパス 不可
413 payload_too_large リクエストボディが 16 KiB を超えている 不可
422 currency_not_available この通貨は現在リアルタイムデータを提供できない。currency と supported が付きます 提供開始まで不可
429 rate_limited レート制限を超えた。Retry-After ヘッダーと retry_after フィールドが付きます 可。Retry-After の後で
429 quota_exceeded 月間クォータを使い切った。used、quota、upgrade_url が付きます 不可。アップグレードするか翌月まで待ってください
500 internal_error サーバー側の予期しないエラー 可(バックオフして)。続く場合は X-Request-Id を添えてサポートへ
503 no_rate 信頼できるレートを出すための有効なソースが足りない。message に各ソースの除外理由が入ります(匿名IDのみ) 可(時間をおいて)。その間はお客様自身のレートで代替してください
503 storage_unavailable サービスが一時的に利用できない。何も保存されていません 可(バックオフして)

例:

{
  "error": "currency_not_available",
  "message": "Real-time data for GBP is temporarily unavailable. Supported: USD, JPY, EUR, HKD, CNY.",
  "currency": "GBP",
  "supported": ["USD", "JPY", "EUR", "HKD", "CNY"]
}

503 no_rate は意図的なものです。 出どころの怪しい価格を返すくらいなら、価格を返しません。呼び出し側は時間をおいて再試行するか、自前のバックアップレートにフォールバックしてください。0 として扱わないでください。


ベストプラクティス

strategy で正しい側を選んでください。 顧客から受け取るときはデフォルトの max、出品者やサプライヤーに支払うときは min、median は記帳専用です。選び間違えると、レート選択・スプレッド・端数処理がすべて相手側に有利に働きます。

レートは10進数型で解析し、浮動小数点は決して使わないでください。 すべてのレートと金額が JSON の文字列なのはまさにそのためです。 IEEE-754 倍精度で解析すると 0.05117904 は精度を失い、合計が少しずつずれていきます。 Decimal / BigDecimal / decimal.js / bcmath を使ってください。

受け取る前に必ず価格をロックしてください。 顧客が価格を見てから支払うまでに時間があり、その間にレートは動きます。 POST /v1/quotes はレート・スプレッド・金額を TTL が切れるまで固定し、後の照合に使う quote_id を返します。 GET /v1/convert は表示と見積もり専用です。注文には使わないでください。

rate_limited は再試行する価値があり、quota_exceeded はありません。 前者は一時的なので、Retry-After に従って待ってから再試行してください。 後者はその暦月の残り期間のハードブロックで、アカウントのすべてのキーに共通です。アップグレードするか、翌月のリセットを待ってください。

503 no_rate を決して 0 として扱わないでください。 これは「有効なソースが少なすぎて、責任を持てる価格を出せない」という意味です。 自前のバックアップレートにフォールバックするか、注文フローを一時停止してください。0 を掛けないでください。

通貨はお客様側でも検証してください。 リアルタイムデータを提供していない通貨を使ったリクエストもクォータに数えられます。呼び出す前に対応通貨の一覧と照合してください。

お客様側でキャッシュしてください。 レートは当社の最速のソースより速くは変わりません。30〜60 秒キャッシュするだけで、精度をほとんど損なわずに利用量を大幅に減らせます。

capped、floored、anchor_tier を監視してください。 capped: true や floored: true は、市場が動いているのに遅いソースが追いついておらず、当社が実勢レート側へ価格を戻したことを示します。 anchor_tier が daily や all に下がった場合は、最も新しいソースが一時的に使えない状態です。レートは引き続き使えますが、通常より鮮度が落ちます。

監視は文言ではなく error と excluded_code で照合してください。 message と excluded_reason は人が読むためのもので、言い回しが変わることがあります。

バージョニング方針

これは v1 で、バージョンはパスの一部(/v1)です。フィールドの追加は予告なく行うため、防御的に解析し、知らないキーは無視してください。

既存フィールドの削除や用途変更、フィールドの型の変更、エラーコードの意味や HTTP ステータスの変更は、90 日以上前の予告なしには行いません。 予告は、最近利用のあるすべてのお客様のアカウントのメールアドレスに送ります。

サポート

ご質問や、このドキュメントと異なる動作を見つけた場合は、該当リクエストの X-Request-Id を添えて [email protected] までメールでご連絡ください。