Contents
ReelShort API の概要と利用プラン
ReelShort は動画コンテンツを外部サービスへ組み込むための RESTful API を提供します。本セクションでは、全体像と主要プランをご紹介し、導入時に留意すべきポイントを整理します。本稿中の金額・リミットは執筆時点で公表されている例示であり、実際の契約内容は公式ドキュメントをご確認ください。
提供プラン(2026 年版)
| 項目 | 無料プラン | スタンダードプラン (月額 ※金額は変動する可能性があります) | エンタープライズ |
|---|---|---|---|
| 月間リクエスト上限 | 10,000 件 | 100,000 件(上限はプラン改訂に伴い変更されることがあります) | カスタム設定 |
| 同時接続数 | 最大 5 | 最大 20 | 無制限 |
| 動画取得 API の利用可否 | ○ | ○ | ○ |
| 動画投稿 API(1 分あたり) | 5 本 | 50 本 | カスタム |
| 統計レポート CSV 出力 | ✕ | ○ | ○ |
| SLA (稼働率保証) | 99.0% | 99.7% | 99.9% |
| サポート窓口 | メールのみ | 平日 10:00–18:00 チャットサポート | 専任アカウントマネージャ |
プラン選択の指針
- 開発・検証フェーズ – 無料プランでサンドボックス環境を活用し、実装確認や単体テストが可能です。
- 本番運用(中規模) – 月間リクエスト数が 5 万件を超える場合はスタンダードプランへのアップグレードをご検討ください。統計レポート機能が利用できます。
- 大規模・カスタム要件 – エンタープライズ向けに独自リミットや専用 IP、SLA の強化などが提供されます。
注意: 各プランの価格・上限は予告なく変更されることがあります。最新情報は必ず公式サイトの「料金表」ページをご参照ください。
開発者アカウント作成と API キー取得
本セクションでは、ReelShort の開発者ポータルでアカウントを作成し、プロジェクト単位で API キー と シークレットキー を取得する手順を解説します。正しい手順でキーを管理すれば、認証エラーや情報漏洩リスクを最小限に抑えることができます。
アカウント作成の流れ
- 開発者ポータル(例:
https://developer.reelshort.com)へアクセスし、メールアドレスとパスワードで新規登録。 - メール認証後、ダッシュボードから 「プロジェクト作成」 をクリックし、任意のプロジェクト名を入力。
- プロジェクト詳細画面に自動生成された API キー と シークレットキー が表示されます。シークレットは一度だけ表示されるため、必ず安全な場所(例: シークレットマネージャ)へ保存してください。
- 必要に応じて IP 制限 を設定し、利用サーバーの固定 IP のみを許可します(セキュリティベストプラクティス参照)。
取得したキーは HTTPS 接続のみ有効 です。テスト時はサンドボックスエンドポイント https://sandbox.api.reelshort.com、本番移行時には公式ドキュメントで提供される本番エンドポイント(例: https://api.reelshort.com)へ切り替えてください。実際のドメインは公式リファレンスをご確認ください。
認証方式の選択基準
ReelShort では、利用シーンに応じて OAuth2(Authorization Code Grant) と API キー + HMAC 署名 の二種類の認証を提供しています。本節ではそれぞれの特徴と推奨使用場面を明確にします。
OAuth2 が適切なケース
- エンドユーザーが自身の ReelShort アカウントで動画投稿やマイページ取得を行う場合。
- アプリケーションが アクセストークン を取得し、トークンの有効期限管理が可能な場合。
ポイント: OAuth2 は「ユーザー認可」フローに依存するため、サーバー間通信(バッチ処理等)には不向きです。
API キー + HMAC が適切なケース
- サーバー間の自動化されたデータ取得・投稿(例: 定期的な統計レポート生成)。
- 高頻度かつ低遅延が求められるバックエンド処理。
- IP 制限やシークレット管理を徹底できる環境。
注意: HMAC 署名はリクエストごとに timestamp と nonce を組み合わせて生成するため、サーバー時刻が正確であること(NTP 同期推奨)が前提条件です。
認証ヘッダーの構築と実装例
以下では、API キー + HMAC 署名 による Authorization ヘッダー生成ロジックを Python と Node.js で示します。エラーハンドリング・タイムアウト設定も併せて記載しています。
ヘッダー形式(公式フォーマット)
|
1 2 |
Authorization: ReelShort api_key="YOUR_API_KEY", timestamp="2026-06-30T12:34:56Z", nonce="a1b2c3d4e5f6", signature="BASE64_SIGNATURE" |
| フィールド | 説明 |
|---|---|
api_key |
発行された API キー |
timestamp |
ISO8601 UTC 時刻(リクエスト送信時) |
nonce |
リプレイ防止用の一意文字列(最低 12 桁推奨) |
signature |
HMAC‑SHA256 により生成した Base64 エンコード文字列 |
Python 実装例
|
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 46 47 48 49 50 51 52 53 54 |
import hmac, hashlib, base64, time, uuid, logging, requests from typing import Dict log = logging.getLogger(__name__) def _build_raw(timestamp: str, nonce: str, method: str, path: str, body: str) -> str: """署名対象文字列を組み立てる内部ユーティリティ""" return f"{timestamp}{nonce}{method.upper()}{path}{body}" def generate_auth_header( api_key: str, secret: str, method: str, path: str, body: str = "", ) -> Dict[str, str]: """Authorization ヘッダーと Content-Type を返す""" timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) nonce = uuid.uuid4().hex[:12] raw = _build_raw(timestamp, nonce, method, path, body) try: digest = hmac.new(secret.encode(), raw.encode(), hashlib.sha256).digest() except Exception as e: log.error("HMAC 生成失敗: %s", e) raise signature = base64.b64encode(digest).decode() auth_value = ( f'ReelShort api_key="{api_key}", ' f'timestamp="{timestamp}", nonce="{nonce}", signature="{signature}"' ) return {"Authorization": auth_value, "Content-Type": "application/json"} def request_with_timeout( method: str, url: str, headers: Dict[str, str], json_body: dict = None, timeout_sec: int = 5, ) -> requests.Response: """タイムアウトと例外処理を統一した HTTP ラッパー""" try: if method.upper() == "GET": resp = requests.get(url, headers=headers, timeout=timeout_sec) else: resp = requests.post(url, headers=headers, json=json_body, timeout=timeout_sec) resp.raise_for_status() return resp except requests.exceptions.Timeout: log.error("リクエストがタイムアウトしました: %s", url) raise except requests.exceptions.HTTPError as e: log.error("HTTP エラー (%s): %s", resp.status_code, resp.text) raise |
Node.js 実装例
|
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 46 47 48 49 50 51 |
const crypto = require('crypto'); const axios = require('axios'); /** * HMAC 署名用の生文字列を作成 */ function buildRaw(timestamp, nonce, method, path, body = '') { return `${timestamp}${nonce}${method.toUpperCase()}${path}${body}`; } /** * Authorization ヘッダーを生成(例外は呼び出し元で捕捉) */ function generateAuthHeader({ apiKey, secret, method, path, body = '' }) { const timestamp = new Date().toISOString(); const nonce = crypto.randomBytes(6).toString('hex'); // 12桁 const raw = buildRaw(timestamp, nonce, method, path, body); const hmac = crypto.createHmac('sha256', secret); const signature = hmac.update(raw).digest('base64'); return { Authorization: `ReelShort api_key="${apiKey}", timestamp="${timestamp}", nonce="${nonce}", signature="${signature}"`, 'Content-Type': 'application/json', }; } /** * タイムアウト付き HTTP クライアント(axios) */ async function requestWithTimeout({ method, url, headers, data = null, timeoutMs = 5000 }) { try { const response = await axios({ method, url, headers, data, timeout: timeoutMs, }); return response; } catch (err) { if (err.code === 'ECONNABORTED') { console.error('リクエストがタイムアウトしました:', url); } else if (err.response) { console.error(`HTTP ${err.response.status} エラー:`, err.response.data); } else { console.error('予期しないエラー:', err.message); } throw err; } } |
重要: 本番環境では
api_keyとsecretをコードにハードコーディングせず、環境変数またはシークレットマネージャから取得してください。
主なエンドポイントと利用例
以下の表は、ReelShort API が提供する主要エンドポイントと HTTP メソッドをまとめたものです。各エンドポイントは サンドボックス と 本番 の両方で同一パス構造となりますが、ベース URL は環境ごとに切り替えてください。
| エンドポイント | HTTP メソッド | 主な目的 | 必須パラメータ |
|---|---|---|---|
/v1/videos/{id} |
GET | 動画単体情報取得 | パスパラメータ id |
/v1/videos |
POST | 新規動画投稿 | title, description, file_url, thumbnail_url(JSON) |
/v1/search |
GET | キーワード検索 | クエリ q、任意で limit |
/v1/analytics/video/{id} |
GET | 動画別再生統計取得 | パスパラメータ id |
/v1/analytics/report |
POST | 複数動画の集計レポート生成 | video_ids[], start_date, end_date(JSON) |
例: 動画情報取得(Python)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
API_BASE = "https://sandbox.api.reelshort.com/v1" # 本番は公式ドキュメント参照 def get_video(video_id: str): path = f"/videos/{video_id}" headers = generate_auth_header( api_key="YOUR_API_KEY", secret="YOUR_SECRET", method="GET", path=path, ) resp = request_with_timeout("GET", API_BASE + path, headers) return resp.json() print(get_video("12345")) |
例: 動画投稿(Node.js)
|
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 |
const API_BASE = 'https://sandbox.api.reelshort.com/v1'; async function postVideo(payload) { const path = '/videos'; const headers = generateAuthHeader({ apiKey: process.env.REELSHORT_API_KEY, secret: process.env.REELSHORT_SECRET, method: 'POST', path, body: JSON.stringify(payload), }); const response = await requestWithTimeout({ method: 'POST', url: API_BASE + path, headers, data: payload, }); return response.data; } postVideo({ title: '夏祭りダンス', description: '屋台と踊りの風景', file_url: 'https://mybucket.s3.amazonaws.com/summer_dance.mp4', thumbnail_url: 'https://mybucket.s3.amazonaws.com/summer_thumb.jpg', }) .then(console.log) .catch(console.error); |
注意: ブラウザから直接 API キーを送信すると情報漏洩リスクが高まります。フロントエンドでの呼び出しは必ずサーバープロキシ経由、または OAuth2 アクセストークンをご利用ください。
エラーコード・リトライ戦略・レートリミット
安定運用のために、失敗時の対処方法とリクエスト制限の監視手順を把握しておくことが不可欠です。本節では代表的なエラーと推奨リトライロジック、さらにレートリミット情報の取得・可視化方法を解説します。
主な HTTP ステータスと API エラーコード
| HTTP | API コード | 内容 | 推奨対策 |
|---|---|---|---|
| 400 | INVALID_PARAMETER |
必須項目欠如やフォーマット不正 | パラメータ検証後に再送 |
| 401 | AUTH_FAILED |
API キー・署名が無効、またはタイムスタンプずれ | キー/シークレット確認、NTP 同期 |
| 403 | IP_NOT_ALLOWED |
許可外 IP からのアクセス | IP ホワイトリストに追加 |
| 404 | RESOURCE_NOT_FOUND |
指定動画 ID が存在しない | ID の事前有無チェック |
| 429 | RATE_LIMIT_EXCEEDED |
秒間/日次上限超過 | バックオフ実装、リクエスト削減 |
| 500 系 | INTERNAL_ERROR 等 |
サーバ内部障害 | 数秒待機後の指数バックオフ再試行 |
Python における指数バックオフ付きリトライ例
|
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 |
import time, random, logging, requests log = logging.getLogger(__name__) def request_with_retry(method, url, headers, json_body=None, max_attempts=5, base_delay=1.0): """429 または 5xx 系エラーに対し指数バックオフでリトライ""" delay = base_delay for attempt in range(1, max_attempts + 1): try: resp = requests.request( method, url, headers=headers, json=json_body, timeout=5 # タイムアウトは必ず設定 ) if resp.status_code < 500 and resp.status_code != 429: return resp # 成功またはクライアントエラーはそのまま返す except requests.exceptions.RequestException as e: log.warning("リクエスト例外 (試行 %d): %s", attempt, e) # リトライ対象の場合は待機 jitter = random.uniform(0, 0.5) log.info("バックオフ: %.2f 秒 (試行 %d)", delay + jitter, attempt) time.sleep(delay + jitter) delay *= 2 # 指数的に遅延を伸長 raise RuntimeError(f"最大リトライ回数 ({max_attempts}) を超えました") |
レートリミットのモニタリング手順
- レスポンスヘッダー確認
X-RateLimit-Limit: 許容上限(例: 30 req/s)X-RateLimit-Remaining: 残り回数-
X-RateLimit-Reset: リセットまでの秒数 -
構造化ログ出力
json
{"timestamp":"2026-07-01T10:00:12Z","endpoint":"/v1/videos/12345","remaining":27,"reset_in_sec":8} -
アラート設定例(Grafana + Loki)
-
remaining < 0.1 * limit→ Slack 通知 -
クライアント側のスロットリング
- トークンバケットアルゴリズムで自前にレート制御を実装し、サーバー側から 429 が返された場合は即座にバックオフへ遷移。
注意: 無料プランと有料プランでは秒間上限が異なるため、プラン変更時には必ずリミット値の再確認を行ってください。
テスト・本番デプロイのベストプラクティス
サンドボックスでの検証手順
| 手順 | 内容 |
|---|---|
| 1. 環境変数設定 | REELSHORT_API_KEY と REELSHORT_SECRET を .env に保存し、コードは os.getenv() で取得 |
| 2. エンドポイント切替 | API_BASE = "https://sandbox.api.reelshort.com/v1" を使用 |
| 3. ユニットテスト実装 | pytest(Python)や jest(Node.js)でリクエスト生成ロジックのみを実際に計算させ、レスポンスは responses / nock でモック |
| 4. ログ・デバッグ | requests の response.text や Chrome DevTools の Network タブでヘッダーとペイロードを確認 |
| 5. CI パイプライン統合 | Pull Request 時に自動テストが走り、署名ロジックの回帰チェックを実施 |
本番環境への移行時に必ず行う項目
- API ベース URL の切替:サンドボックス → 公式本番エンドポイント(例:
https://api.reelshort.com/v1)。ドメインは必ず公式リファレンスで最新情報を取得。 - シークレット管理の見直し:環境変数からクラウドプロバイダー提供のシークレットマネージャへ移行し、ローテーションポリシーを設定。
- IP 制限の適用:本番サーバーの固定 IP のみ許可するように API ポータルでホワイトリスト化。
- タイムアウト・リトライパラメータ調整:本番ではネットワーク遅延が大きくなる可能性があるため、
timeout=10s程度へ拡張し、バックオフ上限回数も増やす。 - モニタリング・アラート導入:前節で示したレートリミットヘッダーのログを CloudWatch / Stackdriver に集約し、閾値超過時に自動通知。
パフォーマンス最適化とセキュリティ強化
| 項目 | 推奨設定 |
|---|---|
| 接続プール | requests.Session(Python)や axios.create()(Node.js)で再利用可能な TCP 接続を確保 |
| キャッシュ | 動画メタ情報は 5 分〜1 時間程度 CDN キャッシュし、同一リクエストの頻度を削減 |
| HTTPS 強制 | 全通信は TLS 1.2 以上で暗号化。内部ネットワークでもリバースプロキシに TLS 終端を設定 |
| ログ除外 | Authorization ヘッダー内の api_key と signature は監査ログから除外し、PII だけを記録 |
| 定期的な鍵ローテーション | シークレットは最低 90 日ごとに更新し、古いキーは無効化 |
| 脆弱性スキャン | CI に bandit(Python)や npm audit を組み込み、依存ライブラリのセキュリティリスクを検出 |
結論: 上記の手順とベストプラクティスを遵守すれば、ReelShort API を安全かつ高性能に本番環境へ統合できます。導入前には必ず公式ドキュメントで最新情報(料金、エンドポイント URL、レートリミット)をご確認ください。
本稿は 2026 年 6 月時点の情報をもとに作成していますが、サービス内容は予告なく変更されることがあります。常に公式サイトの「開発者向けリファレンス」および「利用規約」を参照し、最新情報で運用してください。