天気予報を取得するAPIはいくつかあるのですが、無料というものは少ないようです。
Apple Developer Programの登録者であれば追加料金不要で使えるWeatherKitを触ってみましたので、そちらをご紹介します。AppleのAPIなのですが、SwiftなどのネイティブAPIに加え、REST APIも用意されているのが個人的には驚きでした。
あらまし
以前、気象庁の天気予報をもとに蓄電池の充電時間を調整するという記事を書きました。
このとき課題に感じたのが、天気の「晴れ」「曇り」だけでは太陽光発電の出力をうまく見積もれないことです。
発電量は「どれだけ日が差すか」が重要なので、天気予報で言えば、空にどのくらい雲が出ているか、つまり「雲量」が分かると嬉しいわけです。
無料で使える天気APIをいくつか探してみましたが、雲量を取得できるサービスはほとんどが有料プランでの提供でした。
そんな中で、AppleがWeatherKitというAPIを提供していることを知りました。
Apple Developer Programの登録者であれば、月に50万回まで無料で利用できます。公式ドキュメントを見ると雲量を含む豊富な項目が取得できるとのことだったので、試してみました。
WeatherKitとは?
Appleが提供する天気APIで、iOSやmacOSのアプリから利用できるネイティブAPIだけでなく、REST APIも用意されています。
そのため、PythonやNode.jsなどを使ったCLIツールやウェブサービスからもアクセスできます。
特にデータソースを見ると、JMA、つまり日本の気象庁を含む複数のデータソースが使われており、日本国内でも実用的な精度が期待できそうです(以前の記事はOpenWeatherMapの精度が不安、と言及しました)。
WeatherKitを利用するための事前準備
WeatherKitのREST APIを使うには、JWT(JSON Web Token)ベースの認証が必要です。
そのためには、Apple Developerアカウントにログインした上で「Private Key」と「Service ID」を作成しておく必要があります。

こちらの記述に従って作成していきましょう。
Apple Developer Programに登録
まず前提として、Apple Developer Program(年額99USDまたは現地通貨の同等額)に加入しておく必要があります。
Identifier (Service ID)の作成
- Apple Developer Center の中の、Identifiersページにアクセス
- 「+」をクリック

- 「Service IDs」を選択して「Continue」

- 任意の「Identifier(例: com.example.weatherkit-client)」と表示名を入力して「Continue」

- 「Register」で確定
このService ID(Identifierに入力したもの)は、あとでJWTを発行する際に iss
(issuer)や sub
(subject)として使います。
Key(Private Key)の作成
- Keys ページ にアクセス
- 「+」をクリックして新しいKeyを作成

- Key名を入力し、「WeatherKit」を有効にチェック

- 「Continue」→「Register」→「Download」で
.p8
ファイルを保存
⚠️ この .p8
ファイル(Private Key)は一度しかダウンロードできないため、必ず安全な場所に保存しておきましょう。
このとき発行された Key ID(kid)
や Team ID
は、JWT生成時に必要になります。
4. 必要な情報の一覧
JWTの生成に必要となる情報は以下の通りです:
パラメータ | 用途 | 取得元 |
---|---|---|
key_id | JWTヘッダーに記載 | Key作成時に表示される値 |
team_id | Apple DeveloperのTeam情報 | Apple Developerのプロフィール画面 |
service_id (sub ) | JWTのサブジェクト | 作成したService ID |
private_key (.p8) | JWT署名に使用 | 作成時にダウンロードしたファイル |
Pythonなどからこの情報を使ってJWTを生成すれば、REST APIの呼び出しが可能になります。
GitHubのサンプルコードではこのJWT生成処理も含めてありますので、ぜひそちらも参考にしてください。
サンプルコード
百聞は一見にしかず。コードをGitHubに公開しました。
準備
.env.exampleファイルをコピーし、.envファイルを作成します。
その内容を、上記のPrivate KeyやService IDの情報に更新します。
# Apple Developer Account Settings
TEAM_ID=YOUR_TEAM_ID
KEY_ID=YOUR_KEY_ID
SERVICE_ID=YOUR_SERVICE_ID
KEY_FILE=AuthKey_YOUR_KEY_ID.p8
また、ダウンロードしたPrivate Keyをこのプロジェクトのルートディレクトリに保管します。
実行方法
以下のコマンドを実行すると、WeatherKitで取得できる情報をコンソールに出力します。
(uvコマンドは必要に応じてインストールください)
% uv run python weatherkit_sample.py 35.68 139.76
=== データセット利用可能性の確認 ===
対象地点: (35.680000, 139.760000)
利用可能なデータセット: ['currentWeather', 'forecastDaily', 'forecastHourly', 'forecastNextHour']
取得するデータセット: currentWeather,forecastDaily,forecastHourly,forecastNextHour
=== 現在の天気 ===
気温: 26.1°C
体感温度: 26.1°C
天候: MostlyCloudy
雲量: 84%
湿度: 85%
風速: 16.8 m/s
=== 今後12時間の予報(日本時間) ===
=== 利用可能なフィールド分析(最初の時間データ) ===
Required fields:
✅ cloudCover: 0.81
✅ conditionCode: MostlyCloudy
✅ forecastStart: 2025-07-18T13:00:00Z
✅ humidity: 0.82
✅ precipitationChance: 0.0
✅ precipitationType: clear
✅ pressure: 1017.62
✅ temperature: 26.1
✅ temperatureApparent: 28.78
✅ uvIndex: 0
✅ visibility: 25018.0
✅ windSpeed: 16.51
Optional fields:
✅ daylight: False
✅ pressureTrend: rising
✅ temperatureDewPoint: 22.79
✅ windDirection: 182
✅ windGust: 31.33
✅ precipitationAmount: 0.0
✅ snowfallIntensity: 0.0
==================================================
07/18 22:00: 26.1°C, MostlyCloudy, 雲量: 81%
07/18 23:00: 25.8°C, MostlyCloudy, 雲量: 82%
07/19 00:00: 25.43°C, MostlyCloudy, 雲量: 82%
07/19 01:00: 25.29°C, MostlyCloudy, 雲量: 83%
07/19 02:00: 25.18°C, MostlyCloudy, 雲量: 78%
07/19 03:00: 24.95°C, PartlyCloudy, 雲量: 59%
07/19 04:00: 24.97°C, PartlyCloudy, 雲量: 57%
07/19 05:00: 25.18°C, MostlyCloudy, 雲量: 77%
07/19 06:00: 25.83°C, MostlyCloudy, 雲量: 79%
07/19 07:00: 27.06°C, MostlyCloudy, 雲量: 80%
07/19 08:00: 28.55°C, MostlyCloudy, 雲量: 75%
07/19 09:00: 29.88°C, Cloudy, 雲量: 92%
=== 今後7日間の予報 ===
=== 利用可能なフィールド分析(最初の日データ) ===
Required fields:
✅ conditionCode: MostlyCloudy
✅ forecastEnd: 2025-07-19T15:00:00Z
✅ forecastStart: 2025-07-18T15:00:00Z
✅ maxUvIndex: 7
✅ moonPhase: waningCrescent
✅ precipitationAmount: 0.0
✅ precipitationChance: 0.0
✅ precipitationType: clear
✅ snowfallAmount: 0.0
✅ temperatureMax: 32.49
✅ temperatureMin: 24.93
Optional fields:
✅ daytimeForecast: {...} (ネストされたオブジェクト)
✅ overnightForecast: {...} (ネストされたオブジェクト)
✅ moonrise: 2025-07-19T14:43:40Z
✅ moonset: 2025-07-19T04:22:59Z
✅ solarMidnight: 2025-07-19T14:47:29Z
✅ solarNoon: 2025-07-19T02:47:17Z
✅ sunrise: 2025-07-18T19:39:20Z
✅ sunset: 2025-07-19T09:55:07Z
✅ sunriseAstronomical: 2025-07-18T17:55:43Z
✅ sunriseCivil: 2025-07-18T19:10:12Z
✅ sunriseNautical: 2025-07-18T18:34:42Z
✅ sunsetAstronomical: 2025-07-19T11:38:34Z
✅ sunsetCivil: 2025-07-19T10:24:12Z
✅ sunsetNautical: 2025-07-19T10:59:39Z
==================================================
07/19 (Sat): 32.49°C / 24.93°C, MostlyCloudy
07/20 (Sun): 32.95°C / 24.84°C, PartlyCloudy
07/21 (Mon): 33.16°C / 24.81°C, PartlyCloudy
07/22 (Tue): 32.5°C / 25.28°C, PartlyCloudy
07/23 (Wed): 32.62°C / 25.03°C, Thunderstorms
07/24 (Thu): 31.86°C / 25.11°C, Thunderstorms
07/25 (Fri): 32.05°C / 24.89°C, Thunderstorms
=== 次1時間の詳細予報 ===
データポイント数: 88分間
最初のデータ: 降水確率 0%, 降水強度 0.0mm/h
Private Keyを使ってJWTも自動生成しますので、敷居は高くないと思います。
どんな情報が取得できるか?
WeatherKitのAPIで取得できるデータはドキュメントに載っていますが、実際に返ってくるフィールドは地域によって異なるようです。おそらくデータソースが国によって異なるからでしょう。
東京(35.68, 139.76)で確認した結果を、「時間単位」と「日単位」それぞれについて、取得できた項目/できなかった項目に分けて表形式で整理しました。
結論としては、optionalなフィールド(以下の太字部分)も全て取得できました。気象庁優秀、ということなのでしょうかね?
時間別データ(HourlyWeatherConditions)
カテゴリ | フィールド名 | 状態 | 備考(値例など) |
---|---|---|---|
天候 | conditionCode | ✅ 取得可 | MostlyCloudy |
時刻・日中判定 | forecastStart , daylight | ✅ 取得可 | 13:00 UTC, False |
気温・湿度 | temperature , temperatureApparent , temperatureDewPoint , humidity | ✅ 取得可 | 26.1°C など |
雲量 | cloudCover | ✅ 取得可 | 0.81 |
降水・降雪 | precipitationChance , precipitationIntensity , precipitationType , precipitationAmount , snowfallIntensity , snowfallAmount | ✅ 取得可 | clear, 0.0 など |
気圧・気圧傾向 | pressure , pressureTrend | ✅ 取得可 | 1017.6 hPa, rising |
視程 | visibility | ✅ 取得可 | 約25km |
風情報 | windSpeed , windDirection , windGust | ✅ 取得可 | 16.5 km/h など |
UV指数 | uvIndex | ✅ 取得可 | 0 |
日別データ(DayWeatherConditions)
カテゴリ | フィールド名 | 状態 | 備考(値例など) |
---|---|---|---|
天候 | conditionCode | ✅ 取得可 | MostlyCloudy |
時刻関連 | forecastStart , forecastEnd | ✅ 取得可 | ISO8601形式 |
気温 | temperatureMax , temperatureMin | ✅ 取得可 | 32.4°C / 25.0°C |
降水・降雪 | precipitationChance , precipitationAmount , precipitationType , snowfallAmount | ✅ 取得可 | 0.0, clearなど |
風情報 | windSpeedAvg , windSpeedMax , windGustSpeedMax | ✅ 取得可 | 15.4 / 19.7 / 40.0 km/h |
日照・月相 | sunrise , sunset , moonPhase , moonrise , moonset | ✅ 取得可 | waningCrescentなど |
太陽情報(高度) | solarNoon , solarMidnight | ✅ 取得可 | 時刻形式 |
市民・航海・天文時 | sunriseCivil , sunriseNautical , sunriseAstronomical , sunsetCivil , sunsetNautical , sunsetAstronomical | ✅ 取得可 | — |
ネスト構造 | daytimeForecast , overnightForecast , restOfDayForecast | ✅ 取得可 | オブジェクト形式 |
まとめ
Appleが提供するAPIということでネイティブアプリ向けの印象が強かったのですが、ご覧の通りREST APIを通じてサーバサイドやスクリプトからも柔軟に使うことができます。
特に日本国内でも雲量やUVインデックス、降水量といった詳細なデータが取得できるのは魅力です。
WeatherKitのためだけにApple Developer Programに登録するということはないと思いますが、すでに登録している方はぜひ活用してみてください。
今後はこのデータを活用して、発電量予測の精度を上げたり、蓄電池制御のロジックを改善したりしてみようと思います。
コメント