「今日は何の日」をアプリやボットに表示したくて API を探したことがある人向けの記事です。
個人の方が公開している API はいくつかありますが、移転や終了の告知をたびたび見かけます。静的なファイルを置いているだけで、止まる理由がほとんどないものを作りました。
- エンドポイント:
https://ultimatecrazy.jp/whatstoday/api/{MM-DD}.json - 登録不要・APIキー不要
- 商用可・クレジット表記は任意
- CORS 対応(ブラウザの JavaScript から直接呼べます)
- 366日ぶん(2月29日を含む)
説明ページ:https://ultimatecrazy.jp/whatstoday/api/
使ってみる
curl
curl -s https://ultimatecrazy.jp/whatstoday/api/12-24.json
ブラウザ(fetch)
const d = new Date();
const mmdd = String(d.getMonth() + 1).padStart(2, '0') + '-'
+ String(d.getDate()).padStart(2, '0');
const res = await fetch(`https://ultimatecrazy.jp/whatstoday/api/${mmdd}.json`);
const data = await res.json();
console.log(data.anniversaries[0].name); // 記念日の名前
Access-Control-Allow-Origin: * を返しているので、サーバーを挟まずにそのまま呼べます。
返ってくるもの
12月24日の例です(story と sources は長いので1件ずつに省略しています)。
{
"date": "12-24",
"anniversaries": [
{
"name": "クリスマス・イブ",
"why": "クリスマスの前夜。教会暦では日没から新しい日が始まるため、この夜からお祝いが始まります。",
"chourei": "きょうはクリスマス・イブです。教会の暦では、日没から新しい一日が始まります。夕方から、もうクリスマスは始まっているわけです。一年の締めくくりも、最後の日を待たずに、きょうから少しずつ整えていきましょう。",
"kaigo": "クリスマスにケーキを囲んだ思い出はありますか。どんなケーキでしたか?",
"otayori": "きょうはクリスマス・イブです。ご家族で過ごす楽しい夜になりますように。冬休みも、早寝早起きと、お手伝いを続けられるとよいですね。二学期もありがとうございました。",
"story": [
{
"heading": "夜から始まる一日",
"text": "クリスマス・イブは「クリスマスの前夜」と思われがちですが、正確には少し違います。…"
}
],
"sources": [
{ "title": "クリスマス・イヴ - Wikipedia", "url": "https://ja.wikipedia.org/wiki/…" }
],
"image": "https://ultimatecrazy.jp/whatstoday/images/12-24.png"
}
],
"page": "https://ultimatecrazy.jp/whatstoday/days/12-24.html",
"updated": "2026-09-25"
}
| キー | 中身 |
|---|---|
name |
記念日の名前 |
why |
由来の短い説明 |
chourei |
朝礼でそのまま読み上げられる文(80〜100字前後) |
kaigo |
介護レク・朝の会用の問いかけ(40字前後。ホワイトボードに書ける長さ) |
otayori |
学級通信・おたより用のひとこと(保護者向けのですます調) |
story |
くわしい解説(小見出しと本文の3段落) |
sources |
解説を書くときに参考にした資料 |
image |
その日のイラスト(オリジナル) |
page |
その日の解説ページ |
ほかの API と違うのは、chourei / kaigo / otayori の3本です。記念日の名前だけでなく「そのまま使える文」が入っているので、朝礼当番の支援ツールや、介護施設の朝の会の掲示、学級通信の作成補助などにそのまま流し込めます。
設計で決めたこと
anniversaries は必ず配列
いまは1日1件ですが、あとから同じ日に記念日を増やしても、使う側のコードが壊れないように最初から配列にしています。
中身のない項目はキーごと出さない
null や空文字を返すと、使う側で毎回分岐が要ります。値がないときはキー自体を出しません。
today.json は用意していない
「今日のぶん」を返すファイルは、日付が変わるたびに差し替えが要ります。差し替えが遅れると、利用者全員に前日の内容が返ってしまいます。事故を避けるため、日付は使う側で作って指定してもらう形にしました。上の fetch の例のとおり、数行で済みます。
なお、日付はブラウザや実行環境のタイムゾーンで決まります。日本の日付で出したい場合は、toLocaleDateString('ja-JP', { timeZone: 'Asia/Tokyo' }) などで作ってください。
静的ファイルだけで動かしている
中身は366本の JSON と一覧用の index.json だけです。サーバー側のプログラムがないので、落ちる要素がほとんどありません。CORS と Content-Type はディレクトリの .htaccess で付けています。
AddType application/json .json
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Cache-Control "public, max-age=3600"
</IfModule>
使える日付の一覧
curl -s https://ultimatecrazy.jp/whatstoday/api/index.json
dates に使える日付(01-01 〜 12-31)、version に仕様の版、updated に最終更新日が入っています。
仕様を変えるとき
キーを消したり名前を変えたりするときは、説明ページに追記して、index.json の version を上げます。キーを足すだけの変更は、使う側のコードに影響しないのでそのまま行います。
おわりに
同じ内容は、人が読む形でも公開しています。
使っていただけたら、リンクしてもらえるととても嬉しいです。不具合や要望はお問い合わせからどうぞ。