Contents
Pexels API の概要と利用規約
結論:Pexels API は、無料で商用利用が可能な高品質画像・動画をプログラムから取得できる公式サービスです。
- ロゴの表示は UI(ページヘッダーやフッター等)に限り許可されていますが、アプリケーションのアイコンやブランドマークとしての使用は禁止されています。
- 画像・動画自体は「著作者表記不要(Attribution not required)」ですが、再配布や加工した素材を販売することは利用規約で禁じられています。
ポイント:商用サイトにそのまま掲載しても問題ありませんが、二次的な販売目的での利用は必ず避けてください。
1. ロゴ使用とクレジット表記に関する詳細
| 項目 | 許可される範囲 | 禁止事項 |
|---|---|---|
| ロゴ | UI の一部(例:検索結果ページのヘッダー、フッター)として表示可能 | アプリやサービスのアイコン・ブランドマークへの使用 |
| クレジット表記 | 原則不要。ただし、画像の改変後に再配布する場合は必ず著作者情報を付与する必要あり | 画像・動画そのものを販売したり、サブスクリプション等で提供すること |
公式ガイドライン(Pexels のロゴ利用について)に沿って、ロゴは 白版/黒版 を推奨サイズで配置し、リンク先は Pexels 公式ページに設定してください。
2. API キー取得手順(2024 年時点)
- アカウント作成 / ログイン
-
https://www.pexels.com/ja-jp/api/ にアクセスし、
Sign upまたはLog inボタンから無料アカウントを作成/ログインします。 -
開発者ページへ遷移
-
右上メニューの Developers → Your API Keys をクリック。
-
キー生成
-
Create a new keyボタンを押し、アプリ名と簡単な説明(例:MyProject)を入力してGenerateを実行。 -
安全に保管
- 表示された文字列が API キーです。
.envファイルやクラウドシークレットマネージャに保存し、コードリポジトリへ直接埋め込まないよう徹底してください。
注意:API キーは ベアラートークン として
Authorization: Bearer {YOUR_API_KEY}ヘッダーに必ず含めます。キーが漏洩した場合は即座に開発者ページから再生成し、古いキーを無効化してください。
3. 認証ヘッダーと主要エンドポイント
3‑1. 共通認証方式
|
1 2 |
Authorization: Bearer {YOUR_API_KEY} |
- ヘッダーは 全リクエスト に必須です。
Bearerの後にスペースを入れ、キー文字列だけを記載してください。
3‑2. 写真検索エンドポイント
| 項目 | 内容 |
|---|---|
| URL | https://api.pexels.com/v1/search |
| 必須ヘッダー | Authorization: Bearer {API_KEY} |
| 主なクエリパラメータ | query(必須)per_page(最大 80、デフォルトは 15)page(ページ番号)orientation(landscape / portrait / square)size(large / medium / small)locale(例:ja-JP) |
cURL の実行例
|
1 2 3 |
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.pexels.com/v1/search?query=mountain&per_page=30&orientation=landscape" |
3‑3. 動画検索エンドポイント
| 項目 | 内容 |
|---|---|
| URL | https://api.pexels.com/videos/search |
| 主なクエリパラメータ | query(必須)per_page(最大 80)page、locale、orientation(動画は基本的に横長が多い) |
動画の最適品質取得例(Python)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import requests, os def get_best_video_url(query: str, api_key: str) -> str | None: url = "https://api.pexels.com/videos/search" headers = {"Authorization": f"Bearer {api_key}"} params = {"query": query, "per_page": 1} resp = requests.get(url, headers=headers, params=params) resp.raise_for_status() data = resp.json() # video_files は複数の解像度・フォーマットが混在 for vf in data["videos"][0]["video_files"]: if vf["width"] >= 1920 and vf["format"] == "mp4": return vf["link"] return None # 使用例 print(get_best_video_url("ocean", os.getenv("PEXELS_API_KEY"))) |
ポイント:
width ≥ 1920(=1080p)かつformat = mp4のものを優先すれば、ほとんどのモダンブラウザでスムーズに再生できます。
4. 実装サンプル(Node.js・Python)
以下は 認証 → 検索 → ダウンロード を最小コード量で実現した例です。エラーハンドリングやリトライロジックは別途追加してください。
4‑1. Node.js(fetch / native)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
// npm i node-fetch ← Node <18 の場合のみ必要 import fetch from 'node-fetch'; import { createWriteStream, mkdirSync } from 'fs'; import { basename, resolve } from 'path'; const API_KEY = process.env.PEXELS_API_KEY; const QUERY = 'forest'; const PER_PAGE = 10; // 写真検索 async function searchPhotos() { const url = new URL('https://api.pexels.com/v1/search'); url.searchParams.set('query', QUERY); url.searchParams.set('per_page', PER_PAGE); const res = await fetch(url, { headers: { Authorization: `Bearer ${API_KEY}` }, }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json(); return data.photos.map(p => p.src.original); } // ダウンロード async function downloadImages() { const dir = resolve('images'); mkdirSync(dir, { recursive: true }); for (const imgUrl of await searchPhotos()) { const resp = await fetch(imgUrl); if (!resp.ok) continue; // エラーはスキップ const fileName = basename(new URL(imgUrl).pathname); const dest = createWriteStream(`${dir}/${fileName}`); await new Promise((resolve, reject) => { resp.body.pipe(dest); resp.body.on('error', reject); dest.on('finish', resolve); }); console.log(`✅ Saved ${fileName}`); } } downloadImages().catch(err => console.error('❌', err)); |
4‑2. Python(requests)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import os, requests from pathlib import Path API_KEY = os.getenv("PEXELS_API_KEY") QUERY = "cityscape" PER_PAGE = 12 BASE_URL = "https://api.pexels.com/v1/search" def search_photos() -> list[str]: headers = {"Authorization": f"Bearer {API_KEY}"} params = {"query": QUERY, "per_page": PER_PAGE} r = requests.get(BASE_URL, headers=headers, params=params) r.raise_for_status() return [p["src"]["original"] for p in r.json()["photos"]] def download_images(): out_dir = Path("images") out_dir.mkdir(exist_ok=True) for url in search_photos(): resp = requests.get(url, stream=True) resp.raise_for_status() file_path = out_dir / Path(url).name with open(file_path, "wb") as f: for chunk in resp.iter_content(8192): f.write(chunk) print(f"✅ Saved {file_path}") if __name__ == "__main__": download_images() |
共通のベストプラクティス
| 項目 | 推奨内容 |
|---|---|
| 認証情報 | 環境変数・シークレットマネージャに保存し、コード中にハードコーディングしない。 |
| エラーハンドリング | raise_for_status()(Python)や if (!res.ok)(JS)で HTTP エラーを捕捉し、ロギング・再試行を実装。 |
| タイムアウト設定 | requests.get(..., timeout=10) や fetch(..., {signal: AbortSignal.timeout(10000)}) を使用。 |
| ディレクトリ構造 | 画像は images/, 動画は videos/ と分け、ファイル名は URL のベースネームで保存すると管理が楽です。 |
5. レートリミットとエラーハンドリングの実務的対策
5‑1. 現行レートリミット(2024 年 10 月時点)
| 項目 | 上限 |
|---|---|
| リクエスト数 | 1 時間あたり 200 リクエスト(無料プラン) |
| 同時接続数 | 明示的な制限はなし。ただし短時間に多数のリクエストを送ると 429 が返ります。 |
重要:Pexels の公式ドキュメントは随時更新されます。実装前に必ず最新情報(https://www.pexels.com/api/documentation/)をご確認ください。
5‑2. 429 エラーへの対処例(Python)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import time, requests, os API_KEY = os.getenv("PEXELS_API_KEY") HEADERS = {"Authorization": f"Bearer {API_KEY}"} MAX_RETRIES = 6 def get_json_with_retry(url: str, params: dict | None = None) -> dict: delay = 1.0 for attempt in range(1, MAX_RETRIES + 1): resp = requests.get(url, headers=HEADERS, params=params) if resp.status_code == 200: return resp.json() if resp.status_code == 429: # Rate limit exceeded print(f"[{attempt}] Rate limit hit → wait {delay}s") time.sleep(delay) delay *= 2 # Exponential backoff continue resp.raise_for_status() raise RuntimeError("Maximum retries exceeded") |
5‑3. リクエスト間隔の目安
- 安全側の計算:200 件 / 3600 秒 ≈ 18 秒に 1 回 が理論上の最大許容頻度です。
- 実務的な推奨:12〜15 秒に 1 リクエスト 程度であれば、突発的なピーク時でも余裕があります。
キャッシュ活用:同一キーワード・ページ番号の結果は数分~数時間単位でキャッシュし、不要なリクエストを削減しましょう。
6. 商用利用時に留意すべきポイント
6‑1. ロゴガイドライン(再掲)
- 表示位置:フッター・検索結果ヘッダー等、ユーザーが目にする UI の一部。
- サイズ:ロゴの高さは 30px 以上、幅は自動調整 が望ましい。
- カラー:公式が提供する白版/黒版を使用し、背景色とコントラストを確保。
6‑2. パフォーマンス最適化手法
| 手法 | 効果 | 実装ヒント |
|---|---|---|
| ブラウザキャッシュ | 同一リソースの再取得回数削減(最大 30 日) | Cache-Control: public, max-age=2592000 を CDN またはオリジンサーバで設定 |
| サーバ側キャッシュ (Redis / Memcached) | API 応答自体を保存し、同一クエリの二重呼び出しを防止 | キー例:pexels:search:{query}:{page} |
| CDN 配信 | 地理的に近いエッジサーバから高速配信 | 画像・動画は S3 / Cloud Storage に保存後、CloudFront/Cloudflare へプッシュ |
| 画像最適化 (WebP, AVIF) | ファイルサイズを 30‑50% 削減 | sharp(Node)や Pillow + webp(Python)で変換し、srcset を活用 |
| 動画ストリーミング | 初回バッファ時間短縮・帯域削減 | HLS/DASH 形式に変換できる場合は CloudFront の「Media Package」等を併用 |
6‑3. 法的リスクの最小化
- 利用規約の定期確認
-
Pexels はサービス内容や制限を随時変更する可能性があります。プロジェクト開始前と major update 前に必ず公式ドキュメントをチェックしてください。
-
二次的販売の禁止徹底
-
「素材そのもの」や「加工後の素材」を有料で提供しないこと。例外として、画像を UI の一部として埋め込んだウェブページ全体を SaaS 形態で提供する場合は問題ありません(ただし、素材自体だけをダウンロード可能にしてはいけません)。
-
プライバシー・肖像権
- 人物が写っている画像はモデルリリースが付与されていることが前提ですが、商用広告等で使用する際は必ず「人物の明示的な同意」や「適切なクレジット表記」が求められるケースがあります。疑問がある場合は Pexels のサポートへ問い合わせましょう。
7. よくある質問(FAQ)
| 質問 | 回答 |
|---|---|
| API キーは何件まで作成できますか? | 無料プランでも複数キーを発行可能です。プロジェクトごとにキーを分けると、アクセス解析やレートリミットの管理がしやすくなります。 |
| 画像のサイズ指定は必須ですか? | 必須ではありません。size パラメータを省略するとデフォルトで large が返されます。ただし、帯域節約の観点から必要に応じて medium や small を選択してください。 |
| 動画はどの解像度が取得できますか? | 720p(1280×720)〜 4K(3840×2160)まで、複数の video_files が同時に返されます。最適品質を自前で選択するロジックを実装してください(上記 Python サンプル参照)。 |
| レートリミット超過時に自動的に待機させる仕組みはありますか? | 現行の API には「バックオフ」機能はありません。クライアント側で 429 を検知した際に Retry-After ヘッダー(存在すれば)を参照し、待機時間を調整してください。 |
| 商用利用時にロゴのサイズや配置に制限がありますか? | ロゴは UI の一部として「目立ち過ぎない」ことが求められます。具体的なピクセル数の規定はありませんが、ページ全体のデザインバランスを考慮し、推奨サイズは 30‑50px 高さ程度です。 |
8. まとめ(要点)
- Pexels API は無料で商用利用可能な画像・動画取得手段。ロゴは UI に限定して表示可、アプリアイコンへの使用は禁止。
- API キーは開発者ページから即時取得し、
.env等に安全保管するのがベストプラクティス。 - すべてのリクエストは
Authorization: Bearer {API_KEY}ヘッダーを必ず付与。写真検索は/v1/search、動画検索は/videos/searchを利用。 - レートリミットは 1 時間あたり 200 リクエスト(無料プラン)。429 エラーは指数バックオフで再試行し、12‑15 秒以上の間隔を目安にすると安全です。
- サンプルコード(Node.js・Python) を参考にすれば、認証・検索・ダウンロードまで数十行で完結できる。実装時はタイムアウト設定とエラーハンドリングを必ず追加してください。
- 商用サイトでは ロゴ使用規定を遵守しつつ、ブラウザキャッシュ、サーバ側キャッシュ、CDN 配信、画像・動画の最適化(WebP/AVIF、HLS)でパフォーマンス向上を図りましょう。
- 利用規約は随時変更される可能性があるため、開発開始前と大幅な機能追加前に公式ドキュメントを再確認する習慣をつけてください。
これらの手順とベストプラクティスに従うことで、Pexels API を自社サービスやクリエイティブプロジェクトへ安全・効率的に組み込むことができます。 Happy coding!