メインコンテンツへスキップ
Pro プラン10 minutes中級

API接続エラー

API接続の問題、認証の失敗、統合の問題をトラブルシューティングします。このトラブルシューティングガイドでAPIについて詳しく知る。

apierrorsauthenticationintegrationdebugging
最終更新日:

API接続エラー、認証失敗、統合の問題を診断して解決します。

Zenovay REST APIは有料プラン(Pro以上)で利用可能です。無料プランのキーは403 API_PAID_PLAN_REQUIREDレスポンスで拒否されます。APIキーを使用するにはアップグレードしてください。

認証エラー

"Invalid API Key" (401)

一般的な原因:

  1. キーの形式が間違っている

    • APIキーはzv_プレフィックスで始まる必要があります
    • このプレフィックスのないキーは無効です
    • ダッシュボードから完全なキーをコピーしたことを確認してください
  2. キーが取り消されている

    • 設定 → アカウント → セキュリティとアクセスに移動し、個人用APIキーセクションを開きます
    • 既存のキーが取り消された場合は、新しいキーを作成してください
  3. キーは1回だけ保存される

    • 完全なキーは作成時にのみ表示されます。その後はプレフィックスのみが保存されます
    • コピーしなかった場合は、新しいキーを作成してください

修正:

// 間違い - 無効な形式
const key = 'abc123_not_valid...';

// 正しい - Zenovay APIキー
const key = 'zv_xyz789abc...';

"API Key Not Found" (401)

ヘッダー形式を確認してください:

# 間違い
curl -H "Api-Key: zv_..."

# 正しい (外部API)
curl -H "X-API-Key: zv_..."

"API requires a paid plan" (403)

REST APIは有料機能です。無料プランで作成された(または現在バインドされている)キーは次を返します:

{
  "error": "The Zenovay API requires a paid plan. Upgrade to Pro or higher to use API keys.",
  "code": "API_PAID_PLAN_REQUIRED"
}

修正: チームをProまたはそれ以上にアップグレードしてから、設定 → アカウント → セキュリティとアクセス個人用APIキーでキーを作成します。

"Access denied to this website" (403)

個人用APIキーは作成時に2つのスコープを持ちます:

設定オプション
権限フルアクセス、または読み取り/書き込み/管理者のみ
チームアクセス属しているすべてのチーム、または選択したチームのみ

キーはそれが行動を許可されているチーム内のWebサイトにのみアクセスできます(かつ、それらのチームのメンバーである間のみ)。特定のWebサイトで403が返される場合、それを所有するチームはキーのチームアクセスの外側にあるか、またはそのチームに属していなくなっています。設定 → アカウント → セキュリティとアクセス個人用APIキーでキーを確認するか、必要なアクセス権を持つキーを作成してください。

接続エラー

"Connection Refused"

エンドポイントを確認してください:

正しい: https://api.zenovay.com/api/external/v1/
間違い:  http://api.zenovay.com/api/external/v1/  (HTTPSなし)
間違い:  https://zenovay.com/api/    (ドメイン違い)

"Connection Timeout"

原因:

  • ネットワークの問題
  • ファイアウォールがブロックしている
  • DNS解決の失敗

デバッグステップ:

  1. 接続性をテストします:

    curl -v https://api.zenovay.com/api/external/v1/usage
    
  2. DNSを確認します:

    nslookup api.zenovay.com
    
  3. ファイアウォールを確認します:

    • 発信HTTPS (443)を許可
    • api.zenovay.comドメインを許可

"SSL Certificate Error"

原因:

  • 古いルート証明書
  • 企業プロキシの干渉
  • サーバーの時間のズレ

修正:

# 証明書を更新 (Ubuntu)
sudo apt update && sudo apt install ca-certificates

# システム時間を確認
date

# Node.jsを使用している場合、検証を無効にしないでください:
// DON'T DO THIS IN PRODUCTION
// process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

レート制限エラー

"Rate Limit Exceeded" (429)

レスポンスヘッダー:

X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 2026-06-13T12:01:00.000Z
Retry-After: 42

APIは各レスポンスで月次使用量も返します:

X-Usage-Monthly: 4231
X-Usage-Limit: 10000

バックオフを実装します:

async function apiCallWithRetry(fn, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (error.status === 429) {
        const retryAfter = error.headers.get('Retry-After') || 60;
        await sleep(retryAfter * 1000);
        continue;
      }
      throw error;
    }
  }
}

REST APIレート制限

REST APIはキーごとにプランティアで制限されます。分単位のレートと月単位のリクエスト枠の両方:

プラン分単位月単位
Pro30 req/min10,000
Scale60 req/min100,000
Enterprise120 req/min1,000,000

分単位のレートを超えると429Retry-Afterが返されます。月単位の枠を超えると429が返され、翌月初にリセットされます(X-Usage-Monthly / X-Usage-Limitヘッダーを参照)。

トラッキングと公開エンドポイントの制限

トラッキング取り込みと他の公開エンドポイントはIPごと(プランごとではない)に制限され、REST APIキー制限とは無関係です:

コンテキスト制限
トラッキング (バースト)60 req/10 sec per IP
トラッキング (持続)5,000 req/hour per IP
公開エンドポイント30 req/min per IP
認証エンドポイント30 req/min per IP

リクエストエラー

"Bad Request" (400)

よくある問題:

  1. 無効なJSON:

    // 間違い - 末尾のコンマ
    { "name": "Test", }
    
    // 正しい
    { "name": "Test" }
    
  2. クエリパラメータが不足しているか、形式が悪い:

    # 間違い - 無効な日付範囲
    GET /api/external/v1/analytics/{websiteId}?from=yesterday
    
    # 正しい - ISO日付
    GET /api/external/v1/analytics/{websiteId}?from=2026-06-01&to=2026-06-13
    
  3. リクエストボディのデータ型が間違っている:

    // 間違い - 数字の代わりに文字列
    { "page": "1" }
    
    // 正しい
    { "page": 1 }
    

"Not Found" (404)

確認してください:

  • エンドポイントURLが正しい
  • リソースIDが存在する
  • リソースがあなたのアカウントに属している
# エンドポイントを確認 (/api/external/v1プレフィックスと複数形の「websites」に注意)
GET /api/external/v1/websites/{websiteId}  # 正しい
GET /api/external/v1/website/{websiteId}   # 間違い (単数)

"Unprocessable Entity" (422)

検証が失敗しました。レスポンスボディを確認してください:

{
  "error": "validation_error",
  "details": {
    "url": "Invalid URL format",
    "name": "Name too long (max 100 characters)"
  }
}

SDKエラー

JavaScript SDK

"Zenovay not defined":

<!-- スクリプトが読み込まれたことを確認してください -->
<script src="https://api.zenovay.com/z.js"
        data-tracking-code="YOUR_TRACKING_CODE"></script>

<!-- 読み込み後に確認してください -->
<script>
  window.addEventListener('load', () => {
    if (typeof zenovay !== 'undefined') {
      console.log('Zenovay loaded');
    }
  });
</script>

サーバーサイドAPIコール

トラッキングエンドポイントの接続問題:

// トラッキングエンドポイントでfetchを使用します - npmパッケージは不要です。
// 取り込みエンドポイントはペイロードを検証するため、完全なイベントを送信します:
// session_id (最小8文字)、絶対URL、user_agent、および
// デバイスフィールド(device_type、browser、os)はすべて必須です。
const response = await fetch('https://api.zenovay.com/e/YOUR_TRACKING_CODE', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    event_type: 'pageview',
    url: 'https://example.com/home',
    session_id: 'srv-session-abcdef',
    user_agent: 'MyServer/1.0',
    device_type: 'desktop',
    browser: 'Server',
    os: 'Linux',
  }),
});

if (!response.ok) {
  console.error('Zenovay tracking error:', response.status);
}

タイムアウトエラー:

// タイムアウト制御にAbortControllerを使用します
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30000);

const response = await fetch('https://api.zenovay.com/e/YOUR_TRACKING_CODE', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    event_type: 'pageview',
    url: 'https://example.com/home',
    session_id: 'srv-session-abcdef',
    user_agent: 'MyServer/1.0',
    device_type: 'desktop',
    browser: 'Server',
    os: 'Linux',
  }),
  signal: controller.signal,
});

clearTimeout(timeout);

デバッグのヒント

デバッグモードを有効にする

サーバーサイドのコール:

// 外部APIコールの詳細ログを有効にします
const response = await fetch('https://api.zenovay.com/api/external/v1/websites', {
  headers: { 'X-API-Key': 'zv_...' },
});
console.log('Status:', response.status);
console.log('Response:', await response.json());

トラッキングスクリプト:

<script data-tracking-code="YOUR_TRACKING_CODE"
        data-debug="true"
        src="..."></script>

APIステータスを確認

  1. status.zenovay.comを訪問
  2. APIエンドポイントのステータスを確認
  3. インシデント履歴を確認

キーアクティビティを確認

ダッシュボード:

  1. 設定 → アカウント → セキュリティとアクセスに移動し、個人用APIキーを見つけます
  2. キーを選択してその詳細ビューを開きます
  3. アクティビティを確認します — 過去24時間、7日間、および全期間の受け入れられたイベント数、およびキーが最後に使用された時刻

cURLでテスト

# 使用量エンドポイントでAPIキーをテスト
curl -H "X-API-Key: zv_..." \
     https://api.zenovay.com/api/external/v1/usage

# Webサイトを一覧表示
curl -H "X-API-Key: zv_..." \
     https://api.zenovay.com/api/external/v1/websites

# 詳細な出力付き
curl -v -H "X-API-Key: zv_..." \
     https://api.zenovay.com/api/external/v1/websites

よくあるエラーコード

コード意味解決策
400不正なリクエストリクエストボディを確認
401認証されていないAPIキーを確認
403禁止権限を確認
404見つかりませんエンドポイント/IDを確認
422検証失敗フィールド値を確認
429レート制限バックオフを実装
500サーバーエラー再試行し、サポートに連絡
502不正なゲートウェイ1分後に再試行
503利用不可ステータスページを確認

サポートに連絡

APIの問題を報告するときは、以下を含めてください:

  1. リクエストの詳細:

    • エンドポイントURL
    • HTTPメソッド
    • リクエストヘッダー (APIキーは編集)
    • リクエストボディ
  2. レスポンスの詳細:

    • ステータスコード
    • レスポンスボディ
    • レスポンスヘッダー
  3. コンテキスト:

    • タイムスタンプ
    • リクエストID (ヘッダーから)
    • SDKバージョン(該当する場合)

メール: [email protected]

次のステップ

この記事は役に立ちましたか?