旅行チームは、各市場の祝日、次の祝日、ヒジュラ暦を取得することで、祝日を踏まえた計画を立てられます。Narwhal は国と年ごとにそれらの日付を提供し、短いスクリプトで連休にまとめられます。
市場の次の祝日を調べる
予約チームは、市場が休みになる日や混雑する日を踏まえて計画します。Narwhal API には需要、予約、価格のデータはなく、提供するのは日付です。まず、ある日付以降の最初の祝日を返す next エンドポイントから始めます。このリクエストは 2026年11月3日以降のインドネシアを尋ね、national_public の scope だけを残します。
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/calendars/holidays/IDN/next?from_date=2026-11-03&scope=national_public"{
"country": "IDN",
"coverage": [
{
"scope": "national_public",
"subdivision_codes": []
}
],
"holiday": {
"date": "2026-12-25",
"name": "Christmas Day",
"holiday_key": "christmas_day",
"local_name": "Kelahiran Yesus Kristus",
"scope": "national_public",
"subdivision_codes": []
}
}holiday オブジェクトには、date、英語の name、local_name、scope が入っています。coverage リストは、フィルターが残した scope を示します。scope フィルターを外すと、同じリクエストは代わりに 2026年12月24日のクリスマス集団休暇を返します。インドネシアは collective_leave の日も公表しているためです。
1年分を取得して連休を見つける
祝日が週末とつながると旅行の需要が高まります。年のエンドポイントは、ある国のすべての祝日を返し、短いスクリプトでそれを週末と結合して、4日以上連続する休みを見つけられます。このスクリプトは scope フィルターなしでインドネシアの 2026年を読むので、集団休暇の日も休みとして数えます。
import json
import os
import urllib.request
from datetime import date, timedelta
def get(path):
req = urllib.request.Request(
"https://api.narwhalapi.com" + path,
headers={"Authorization": "Bearer " + os.environ["NARWHAL_API_KEY"]},
)
with urllib.request.urlopen(req, timeout=30) as r:
return json.load(r)
def long_breaks(country, year, min_days=4):
names = {}
for h in get(f"/v1/calendars/holidays/{country}/{year}")["holidays"]:
names.setdefault(date.fromisoformat(h["date"]), []).append(h["name"])
day, end, runs = date(year, 1, 1), date(year, 12, 31), []
while day <= end:
if day.weekday() >= 5 or day in names:
start = day
while day <= end and (day.weekday() >= 5 or day in names):
day += timedelta(days=1)
if (day - start).days >= min_days and any(d in names for d in
(start + timedelta(n) for n in range((day - start).days))):
runs.append((start, day - timedelta(days=1)))
else:
day += timedelta(days=1)
return runs, names
runs, names = long_breaks("IDN", 2026)
for first, last in runs:
days = [first + timedelta(n) for n in range((last - first).days + 1)]
print(first, last, len(days), "days:", "; ".join(dict.fromkeys(n for d in days for n in names.get(d, []))))
インドネシアの 2026年について、4つの連休が出力されます。
| 変換前 | 変換後 | 日数 | 連休に含まれる祝日 |
|---|---|---|---|
| 2026-02-14 | 2026-02-17 | 4 | 春節の集団休暇、春節 |
| 2026-03-18 | 2026-03-24 | 7 | Nyepi の集団休暇、Nyepi、Eid al-Fitr の集団休暇、Eid al-Fitr |
| 2026-05-14 | 2026-05-17 | 4 | イエス・キリストの昇天、イエス・キリストの昇天の集団休暇 |
| 2026-12-24 | 2026-12-27 | 4 | クリスマスの集団休暇、クリスマス |
国コードと年を変えれば、別の市場にも同じ確認ができます。このスクリプトでは週末を土曜と日曜としているので、週の稼働日が異なる国ではそのルールを変えてください。複数の市場を扱うチームは、国と年ごとに年のエンドポイントを1回ずつ呼び、国別の連休を1つの表にまとめます。
ムスリム人口の多い市場向けにヒジュラ暦を合わせる
これらの市場の祝日の多くはヒジュラ暦に従うため、グレゴリオ暦の日付は毎年動きます。Hijri エンドポイントはヒジュラ暦の年(AH)を受け取り、12か月と各月の初日を返します。対象はインドネシア、サウジアラビア、マレーシア、トルコ、エジプト、パキスタンです。AH 1447 は 2026年のラマダンを含み、このリクエストは第9月と第10月だけを残します。
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/calendars/hijri/IDN/1447"{
"country": "IDN",
"year": 1447,
"months": [
{
"month": 9,
"calculated_start": "2026-02-18",
"official_start": "2026-02-19",
"status": "published",
"source": "kemenag_table",
"source_url": "https://aceh.kemenag.go.id/storage/berita_informasi/01K7GE96M0ZVRJ62Z520RMYG1B.pdf",
"authority": "Kementerian Agama (Kemenag), Sidang Isbat for Ramadan, Shawwal and Dhu al-Hijjah",
"announced_on": null,
"decision_expected_on": "2026-02-17",
"revised": false,
"updated_at": "2026-11-02T16:31:12.025432Z"
},
{
"month": 10,
"calculated_start": "2026-03-20",
"official_start": "2026-03-21",
"status": "published",
"source": "kemenag_table",
"source_url": "https://aceh.kemenag.go.id/storage/berita_informasi/01K7GE96M0ZVRJ62Z520RMYG1B.pdf",
"authority": "Kementerian Agama (Kemenag), Sidang Isbat for Ramadan, Shawwal and Dhu al-Hijjah",
"announced_on": null,
"decision_expected_on": "2026-03-18",
"revised": false,
"updated_at": "2026-11-02T16:31:12.279058Z"
}
]
}calculated_start は天文学的な計算による初日です。official_start は国の機関が定めた日で、定められるまでは null です。このレスポンスでは、ラマダンの開始は計算で 2026年2月18日、インドネシアの表では 2026年2月19日です。第10月は 2026年3月21日に始まり、これはインドネシアの祝日リストにある Eid al-Fitr の日付です。status は日付がどこまで確定しているかを示します。
グレゴリオ暦の1年は、ヒジュラ暦の2つの年にまたがります。インドネシアの表では AH 1448 が 2026年6月16日に始まるため、2026年全体を計画するには 1447 と 1448 の両方のレスポンスが必要です。
ヒジュラ暦の日付はどこまで確定していますか。
status を読みます。calculated は API が計算上の日付だけを持ち、official_start が null であることを意味します。published は公式の年間表があることを意味しますが、その表も変わる可能性があります。announced は、月の観測または isbat の会合を経た最終決定です。
AH 1447 について、サウジアラビアのレスポンスは第9月と第10月に calculated を返し、インドネシアとマレーシアは published を返します。calculated や published の Eid は計画用の日付として扱い、旅行が近づいたらもう一度確認してください。
API に学校の休暇はありますか。
いいえ。API に学校のカレンダーはありません。祝日の scope は national_public、regional_public、bank、federal_government、central_government、collective_leave、public_sector、private_sector で、どれも学期ではありません。祝日と連休の日付をカレンダー上の目安として使い、学校の日程は自分で用意した情報源から取ってください。
同じ祝日に属する行をまとめるには。
holiday_key を使います。インドネシアの 2026年のレスポンスでは、春節が 2月16日に集団休暇、2月17日に国民の祝日として現れ、どちらの行にもキー lunar_new_year が付いています。このキーでグループ化すれば祝日を1回として数えられ、各行の scope から、祝日そのものの日と前後の追加の日を区別できます。
集団休暇は旅行にとって何を意味しますか。
インドネシアは国民の祝日のほかに、集団休暇(cuti bersama)の日を collective_leave scope で掲載しています。祝日の隣に置かれ、休みを延ばします。そのため、上の表では 2026年3月21日の Eid al-Fitr が7日間の連休に入っています。
その日を除外するには scope=national_public を付けます。休み全体を見たいときは、上のスクリプトのようにフィルターを付けないでください。
公開。