APIリファレンス
この包括的なAPIリファレンスは、Traeで構築されたアプリケーション向けの利用可能なすべてのエンドポイント、認証方法、統合パターンの詳細なドキュメントを提供します。
概要
Trae APIは、コアプラットフォーム機能へのプログラマティックアクセスを提供するRESTful APIです。このリファレンスでは以下をカバーします:
- 認証と認可
- コアAPIエンドポイント
- リクエスト/レスポンス形式
- エラーハンドリング
- レート制限
- SDK使用方法
- 統合例
ベースURL
本番環境: https://api.trae.dev/v1
ステージング環境: https://staging-api.trae.dev/v1
開発環境: http://localhost:3000/api/v1認証
APIキー認証
Trae APIは認証にAPIキーを使用します。AuthorizationヘッダーにAPIキーを含めてください:
http
Authorization: Bearer YOUR_API_KEYAPIキーの取得
- Traeダッシュボードにログイン
- 設定 > APIキーに移動
- 「新しいキーを生成」をクリック
- APIキーをコピーして安全に保存
bash
# curlを使用した例
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.trae.dev/v1/projectsOAuth 2.0認証
ユーザー固有のアクセスが必要なアプリケーションの場合、OAuth 2.0を使用します:
認可コードフロー
http
# ステップ1: 認可リクエスト
GET https://api.trae.dev/oauth/authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=YOUR_REDIRECT_URI&
scope=read:projects write:projects&
state=RANDOM_STATE_STRINGhttp
# ステップ2: トークン交換
POST https://api.trae.dev/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=AUTHORIZATION_CODE&
client_id=YOUR_CLIENT_ID&
client_secret=YOUR_CLIENT_SECRET&
redirect_uri=YOUR_REDIRECT_URIレスポンス
json
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "def50200...",
"scope": "read:projects write:projects"
}JWTトークン認証
サービス間通信の場合:
javascript
// JWTトークンを生成
const jwt = require('jsonwebtoken');
const payload = {
iss: 'your-service-id',
aud: 'trae-api',
sub: 'service-account',
exp: Math.floor(Date.now() / 1000) + (60 * 60), // 1時間
iat: Math.floor(Date.now() / 1000)
};
const token = jwt.sign(payload, process.env.JWT_SECRET, {
algorithm: 'HS256'
});
// リクエストでトークンを使用
const response = await fetch('https://api.trae.dev/v1/projects', {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});コアエンドポイント
プロジェクト
プロジェクト一覧
http
GET /projectsパラメータ:
| パラメータ | 型 | 説明 | デフォルト |
|---|---|---|---|
page | integer | ページ番号 | 1 |
limit | integer | ページあたりのアイテム数(最大100) | 20 |
sort | string | ソートフィールド(name、created_at、updated_at) | created_at |
order | string | ソート順(asc、desc) | desc |
search | string | 検索クエリ | - |
status | string | ステータスでフィルタ(active、archived) | - |
リクエスト例:
bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.trae.dev/v1/projects?page=1&limit=10&sort=name&order=asc"レスポンス:
json
{
"data": [
{
"id": "proj_1234567890",
"name": "My Project",
"description": "サンプルプロジェクト",
"status": "active",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z",
"owner": {
"id": "user_1234567890",
"name": "John Doe",
"email": "john@example.com"
},
"settings": {
"public": false,
"collaboration_enabled": true
},
"stats": {
"files_count": 25,
"collaborators_count": 3,
"last_activity": "2024-01-15T09:45:00Z"
}
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"total_pages": 1
}
}プロジェクト取得
http
GET /projects/{project_id}リクエスト例:
bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.trae.dev/v1/projects/proj_1234567890レスポンス:
json
{
"id": "proj_1234567890",
"name": "My Project",
"description": "サンプルプロジェクト",
"status": "active",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z",
"owner": {
"id": "user_1234567890",
"name": "John Doe",
"email": "john@example.com"
},
"collaborators": [
{
"id": "user_0987654321",
"name": "Jane Smith",
"email": "jane@example.com",
"role": "editor",
"joined_at": "2024-01-16T14:20:00Z"
}
],
"settings": {
"public": false,
"collaboration_enabled": true,
"auto_save": true,
"version_control": true
},
"repository": {
"url": "https://github.com/user/repo",
"branch": "main",
"last_sync": "2024-01-15T09:45:00Z"
}
}プロジェクト作成
http
POST /projectsリクエストボディ:
json
{
"name": "新しいプロジェクト",
"description": "プロジェクトの説明",
"template": "react",
"settings": {
"public": false,
"collaboration_enabled": true
},
"repository": {
"url": "https://github.com/user/repo",
"branch": "main"
}
}リクエスト例:
bash
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "新しいプロジェクト",
"description": "新しいプロジェクト",
"template": "react"
}' \
https://api.trae.dev/v1/projectsレスポンス:
json
{
"id": "proj_2345678901",
"name": "新しいプロジェクト",
"description": "新しいプロジェクト",
"status": "active",
"created_at": "2024-01-16T15:30:00Z",
"updated_at": "2024-01-16T15:30:00Z",
"owner": {
"id": "user_1234567890",
"name": "John Doe",
"email": "john@example.com"
},
"settings": {
"public": false,
"collaboration_enabled": true,
"auto_save": true,
"version_control": true
}
}プロジェクト更新
http
PUT /projects/{project_id}
PATCH /projects/{project_id}リクエストボディ(PATCH例):
json
{
"name": "更新されたプロジェクト名",
"settings": {
"public": true
}
}プロジェクト削除
http
DELETE /projects/{project_id}レスポンス:
json
{
"message": "プロジェクトが正常に削除されました",
"deleted_at": "2024-01-16T16:00:00Z"
}ファイル
ファイル一覧
http
GET /projects/{project_id}/filesパラメータ:
| パラメータ | 型 | 説明 |
|---|---|---|
path | string | ディレクトリパス |
recursive | boolean | サブディレクトリを含む |
type | string | ファイルタイプでフィルタ |
リクエスト例:
bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.trae.dev/v1/projects/proj_1234567890/files?path=/src&recursive=true"レスポンス:
json
{
"data": [
{
"id": "file_1234567890",
"name": "index.js",
"path": "/src/index.js",
"type": "file",
"size": 1024,
"mime_type": "application/javascript",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T11:45:00Z",
"checksum": "sha256:abc123..."
},
{
"id": "dir_1234567890",
"name": "components",
"path": "/src/components",
"type": "directory",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}
]
}ファイル内容取得
http
GET /projects/{project_id}/files/{file_id}/contentレスポンス:
javascript
// ファイル内容がテキストとして返される
import React from 'react';
function App() {
return (
<div className="App">
<h1>Hello World</h1>
</div>
);
}
export default App;ファイル作成/更新
http
PUT /projects/{project_id}/filesリクエストボディ:
json
{
"path": "/src/components/Button.js",
"content": "import React from 'react';\n\nconst Button = ({ children, onClick }) => {\n return <button onClick={onClick}>{children}</button>;\n};\n\nexport default Button;",
"encoding": "utf-8"
}ファイル削除
http
DELETE /projects/{project_id}/files/{file_id}ユーザー
現在のユーザー取得
http
GET /userレスポンス:
json
{
"id": "user_1234567890",
"name": "John Doe",
"email": "john@example.com",
"avatar_url": "https://avatars.example.com/user_1234567890",
"created_at": "2024-01-01T00:00:00Z",
"subscription": {
"plan": "pro",
"status": "active",
"expires_at": "2024-12-31T23:59:59Z"
},
"preferences": {
"theme": "dark",
"language": "ja",
"notifications": {
"email": true,
"push": false
}
}
}ユーザープロフィール更新
http
PATCH /userリクエストボディ:
json
{
"name": "John Smith",
"preferences": {
"theme": "light",
"notifications": {
"email": false
}
}
}コラボレーション
プロジェクトコラボレーター一覧
http
GET /projects/{project_id}/collaboratorsレスポンス:
json
{
"data": [
{
"id": "collab_1234567890",
"user": {
"id": "user_0987654321",
"name": "Jane Smith",
"email": "jane@example.com",
"avatar_url": "https://avatars.example.com/user_0987654321"
},
"role": "editor",
"permissions": [
"read",
"write",
"comment"
],
"invited_by": "user_1234567890",
"invited_at": "2024-01-16T14:00:00Z",
"joined_at": "2024-01-16T14:20:00Z",
"status": "active"
}
]
}コラボレーター招待
http
POST /projects/{project_id}/collaboratorsリクエストボディ:
json
{
"email": "collaborator@example.com",
"role": "editor",
"message": "私のプロジェクトに参加してください!"
}コラボレーター役割更新
http
PATCH /projects/{project_id}/collaborators/{collaborator_id}リクエストボディ:
json
{
"role": "viewer",
"permissions": ["read", "comment"]
}コラボレーター削除
http
DELETE /projects/{project_id}/collaborators/{collaborator_id}テンプレート
テンプレート一覧
http
GET /templatesパラメータ:
| パラメータ | 型 | 説明 |
|---|---|---|
category | string | カテゴリでフィルタ |
language | string | プログラミング言語でフィルタ |
featured | boolean | 注目のテンプレートのみ表示 |
レスポンス:
json
{
"data": [
{
"id": "template_react",
"name": "React App",
"description": "TypeScriptを使用したモダンなReactアプリケーション",
"category": "frontend",
"language": "javascript",
"tags": ["react", "typescript", "vite"],
"featured": true,
"author": {
"name": "Trae Team",
"url": "https://trae.dev"
},
"preview_url": "https://templates.trae.dev/react",
"repository_url": "https://github.com/trae-dev/template-react",
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2024-01-15T10:00:00Z"
}
]
}テンプレート取得
http
GET /templates/{template_id}デプロイメント
デプロイメント一覧
http
GET /projects/{project_id}/deploymentsレスポンス:
json
{
"data": [
{
"id": "deploy_1234567890",
"status": "success",
"environment": "production",
"url": "https://my-app.trae.app",
"commit": {
"sha": "abc123def456",
"message": "新機能を追加",
"author": "John Doe"
},
"created_at": "2024-01-16T15:00:00Z",
"completed_at": "2024-01-16T15:05:00Z",
"duration": 300,
"logs_url": "https://api.trae.dev/v1/projects/proj_1234567890/deployments/deploy_1234567890/logs"
}
]
}デプロイメント作成
http
POST /projects/{project_id}/deploymentsリクエストボディ:
json
{
"environment": "production",
"branch": "main",
"build_command": "npm run build",
"environment_variables": {
"NODE_ENV": "production",
"API_URL": "https://api.example.com"
}
}デプロイメントログ取得
http
GET /projects/{project_id}/deployments/{deployment_id}/logsレスポンス:
json
{
"logs": [
{
"timestamp": "2024-01-16T15:00:30Z",
"level": "info",
"message": "ビルドプロセスを開始"
},
{
"timestamp": "2024-01-16T15:01:00Z",
"level": "info",
"message": "依存関係をインストール中"
},
{
"timestamp": "2024-01-16T15:04:30Z",
"level": "info",
"message": "ビルドが正常に完了"
},
{
"timestamp": "2024-01-16T15:05:00Z",
"level": "info",
"message": "デプロイメント完了"
}
]
}エラーハンドリング
エラーレスポンス形式
すべてのAPIエラーは一貫した形式に従います:
json
{
"error": {
"code": "VALIDATION_ERROR",
"message": "リクエストデータが無効です",
"details": [
{
"field": "name",
"message": "名前は必須です"
},
{
"field": "email",
"message": "メールアドレスは有効なメールアドレスである必要があります"
}
],
"request_id": "req_1234567890",
"timestamp": "2024-01-16T15:30:00Z"
}
}HTTPステータスコード
| ステータスコード | 説明 |
|---|---|
200 | OK - リクエスト成功 |
201 | Created - リソース作成成功 |
204 | No Content - リクエスト成功、コンテンツなし |
400 | Bad Request - 無効なリクエストデータ |
401 | Unauthorized - 認証が必要 |
403 | Forbidden - 権限不足 |
404 | Not Found - リソースが見つからない |
409 | Conflict - リソースが既に存在 |
422 | Unprocessable Entity - バリデーションエラー |
429 | Too Many Requests - レート制限超過 |
500 | Internal Server Error - サーバーエラー |
503 | Service Unavailable - サービス一時的に利用不可 |
エラーコード
| エラーコード | 説明 |
|---|---|
AUTHENTICATION_ERROR | 無効または欠落した認証 |
AUTHORIZATION_ERROR | 権限不足 |
VALIDATION_ERROR | リクエストデータバリデーション失敗 |
NOT_FOUND | 要求されたリソースが見つからない |
CONFLICT | リソースが既に存在 |
RATE_LIMIT_EXCEEDED | リクエスト数が多すぎる |
INTERNAL_ERROR | 内部サーバーエラー |
SERVICE_UNAVAILABLE | サービス一時的に利用不可 |
レート制限
レート制限ヘッダー
すべてのAPIレスポンスにはレート制限情報が含まれます:
http
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1642348800
X-RateLimit-Window: 3600レート制限階層
| プラン | 1時間あたりのリクエスト数 | バースト制限 |
|---|---|---|
| Free | 1,000 | 100 |
| Pro | 10,000 | 500 |
| Enterprise | 100,000 | 2,000 |
レート制限超過レスポンス
json
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "レート制限を超過しました",
"details": {
"limit": 1000,
"window": 3600,
"reset_at": "2024-01-16T16:00:00Z"
}
}
}Webhook
Webhookイベント
| イベント | 説明 |
|---|---|
project.created | プロジェクトが作成された |
project.updated | プロジェクトが更新された |
project.deleted | プロジェクトが削除された |
file.created | ファイルが作成された |
file.updated | ファイルが更新された |
file.deleted | ファイルが削除された |
deployment.started | デプロイメントが開始された |
deployment.completed | デプロイメントが完了した |
deployment.failed | デプロイメントが失敗した |
collaborator.invited | コラボレーターが招待された |
collaborator.joined | コラボレーターが参加した |
collaborator.removed | コラボレーターが削除された |
Webhookペイロード
json
{
"id": "webhook_1234567890",
"event": "project.created",
"timestamp": "2024-01-16T15:30:00Z",
"data": {
"project": {
"id": "proj_1234567890",
"name": "新しいプロジェクト",
"owner": {
"id": "user_1234567890",
"name": "John Doe"
}
}
},
"delivery_attempt": 1
}Webhook設定
http
POST /webhooksリクエストボディ:
json
{
"url": "https://your-app.com/webhooks/trae",
"events": ["project.created", "deployment.completed"],
"secret": "your-webhook-secret"
}Webhook検証
javascript
const crypto = require('crypto');
function verifyWebhook(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expectedSignature, 'hex')
);
}
// Express.js例
app.post('/webhooks/trae', (req, res) => {
const signature = req.headers['x-trae-signature'];
const payload = JSON.stringify(req.body);
if (!verifyWebhook(payload, signature, process.env.WEBHOOK_SECRET)) {
return res.status(401).send('Unauthorized');
}
const { event, data } = req.body;
switch (event) {
case 'project.created':
console.log('新しいプロジェクトが作成されました:', data.project.name);
break;
case 'deployment.completed':
console.log('デプロイメントが完了しました:', data.deployment.url);
break;
}
res.status(200).send('OK');
});SDK使用方法
JavaScript/Node.js SDK
インストール
bash
npm install @trae/sdk
# または
yarn add @trae/sdk基本的な使用方法
javascript
const { TraeClient } = require('@trae/sdk');
const client = new TraeClient({
apiKey: process.env.TRAE_API_KEY,
baseUrl: 'https://api.trae.dev/v1' // オプション
});
// プロジェクト一覧
const projects = await client.projects.list({
page: 1,
limit: 10
});
// プロジェクト取得
const project = await client.projects.get('proj_1234567890');
// プロジェクト作成
const newProject = await client.projects.create({
name: '私の新しいプロジェクト',
template: 'react'
});
// プロジェクト更新
const updatedProject = await client.projects.update('proj_1234567890', {
name: '更新されたプロジェクト名'
});
// プロジェクト削除
await client.projects.delete('proj_1234567890');ファイル操作
javascript
// ファイル一覧
const files = await client.files.list('proj_1234567890', {
path: '/src',
recursive: true
});
// ファイル内容取得
const content = await client.files.getContent('proj_1234567890', 'file_1234567890');
// ファイル作成/更新
await client.files.createOrUpdate('proj_1234567890', {
path: '/src/components/Button.js',
content: 'import React from "react";\n\nconst Button = () => <button>クリックしてください</button>;\n\nexport default Button;'
});
// ファイル削除
await client.files.delete('proj_1234567890', 'file_1234567890');デプロイメント操作
javascript
// デプロイメント一覧
const deployments = await client.deployments.list('proj_1234567890');
// デプロイメント作成
const deployment = await client.deployments.create('proj_1234567890', {
environment: 'production',
branch: 'main'
});
// デプロイメントログ取得
const logs = await client.deployments.getLogs('proj_1234567890', 'deploy_1234567890');エラーハンドリング
javascript
try {
const project = await client.projects.get('invalid_id');
} catch (error) {
if (error instanceof TraeAPIError) {
console.error('APIエラー:', error.code, error.message);
console.error('詳細:', error.details);
} else {
console.error('予期しないエラー:', error);
}
}Python SDK
インストール
bash
pip install trae-sdk基本的な使用方法
python
from trae_sdk import TraeClient
client = TraeClient(
api_key=os.environ['TRAE_API_KEY'],
base_url='https://api.trae.dev/v1' # オプション
)
# プロジェクト一覧
projects = client.projects.list(page=1, limit=10)
# プロジェクト取得
project = client.projects.get('proj_1234567890')
# プロジェクト作成
new_project = client.projects.create({
'name': '私の新しいプロジェクト',
'template': 'react'
})
# プロジェクト更新
updated_project = client.projects.update('proj_1234567890', {
'name': '更新されたプロジェクト名'
})
# プロジェクト削除
client.projects.delete('proj_1234567890')Go SDK
インストール
bash
go get github.com/trae-dev/go-sdk基本的な使用方法
go
package main
import (
"context"
"log"
"os"
"github.com/trae-dev/go-sdk/trae"
)
func main() {
client := trae.NewClient(trae.Config{
APIKey: os.Getenv("TRAE_API_KEY"),
BaseURL: "https://api.trae.dev/v1",
})
ctx := context.Background()
// プロジェクト一覧
projects, err := client.Projects.List(ctx, &trae.ProjectListOptions{
Page: 1,
Limit: 10,
})
if err != nil {
log.Fatal(err)
}
// プロジェクト取得
project, err := client.Projects.Get(ctx, "proj_1234567890")
if err != nil {
log.Fatal(err)
}
// プロジェクト作成
newProject, err := client.Projects.Create(ctx, &trae.ProjectCreateRequest{
Name: "私の新しいプロジェクト",
Template: "react",
})
if err != nil {
log.Fatal(err)
}
}統合例
GitHub Actions統合
yaml
# .github/workflows/deploy.yml
name: Traeにデプロイ
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Traeにデプロイ
uses: trae-dev/deploy-action@v1
with:
api-key: ${{ secrets.TRAE_API_KEY }}
project-id: ${{ secrets.TRAE_PROJECT_ID }}
environment: productionCI/CDパイプライン統合
javascript
// deploy.js
const { TraeClient } = require('@trae/sdk');
async function deploy() {
const client = new TraeClient({
apiKey: process.env.TRAE_API_KEY
});
try {
// デプロイメント作成
const deployment = await client.deployments.create(process.env.PROJECT_ID, {
environment: process.env.ENVIRONMENT || 'production',
branch: process.env.GITHUB_REF_NAME || 'main',
environment_variables: {
NODE_ENV: 'production',
API_URL: process.env.API_URL
}
});
console.log(`デプロイメント開始: ${deployment.id}`);
// 完了をポーリング
let status = 'pending';
while (status === 'pending' || status === 'building') {
await new Promise(resolve => setTimeout(resolve, 5000));
const updated = await client.deployments.get(process.env.PROJECT_ID, deployment.id);
status = updated.status;
console.log(`デプロイメントステータス: ${status}`);
}
if (status === 'success') {
console.log(`デプロイメント成功: ${deployment.url}`);
process.exit(0);
} else {
console.error('デプロイメント失敗');
process.exit(1);
}
} catch (error) {
console.error('デプロイメントエラー:', error.message);
process.exit(1);
}
}
deploy();Slackボット統合
javascript
// slack-bot.js
const { App } = require('@slack/bolt');
const { TraeClient } = require('@trae/sdk');
const app = new App({
token: process.env.SLACK_BOT_TOKEN,
signingSecret: process.env.SLACK_SIGNING_SECRET
});
const trae = new TraeClient({
apiKey: process.env.TRAE_API_KEY
});
// デプロイコマンド
app.command('/deploy', async ({ command, ack, respond }) => {
await ack();
const [projectId, environment = 'production'] = command.text.split(' ');
if (!projectId) {
return respond('使用方法: /deploy <project-id> [environment]');
}
try {
const deployment = await trae.deployments.create(projectId, {
environment
});
respond(`🚀 プロジェクト ${projectId} の ${environment} へのデプロイメントを開始しました\nデプロイメントID: ${deployment.id}`);
} catch (error) {
respond(`❌ デプロイメント失敗: ${error.message}`);
}
});
// プロジェクト一覧コマンド
app.command('/projects', async ({ ack, respond }) => {
await ack();
try {
const projects = await trae.projects.list({ limit: 10 });
const projectList = projects.data.map(p =>
`• ${p.name} (${p.id}) - ${p.status}`
).join('\n');
respond(`📁 あなたのプロジェクト:\n${projectList}`);
} catch (error) {
respond(`❌ プロジェクトの取得に失敗しました: ${error.message}`);
}
});
app.start(process.env.PORT || 3000);ベストプラクティス
認証
- APIキーの安全な保管: APIキーを安全に保管し、バージョン管理にコミットしない
- 環境変数の使用: 機密データは環境変数に保存
- 定期的なキーローテーション: セキュリティのためAPIキーを定期的にローテーション
- 権限のスコープ: 各APIキーに必要最小限の権限を使用
エラーハンドリング
- レート制限の処理: レート制限エラーに対して指数バックオフを実装
- リトライロジック: 一時的なエラーに対してリトライロジックを実装
- エラーログ: デバッグ用にリクエストIDと共にAPIエラーをログ
- グレースフルデグラデーション: アプリケーションでAPIの失敗を適切に処理
パフォーマンス
- ページネーションの使用: リストエンドポイントには常にページネーションを使用
- レスポンスのキャッシュ: 適切な場合はAPIレスポンスをキャッシュ
- バッチ操作: 利用可能な場合はバッチ操作を使用
- 使用量の監視: API使用量を監視し、それに応じて最適化
セキュリティ
- HTTPS のみ: APIリクエストには常にHTTPSを使用
- Webhook の検証: Webhook署名を常に検証
- 入力検証: APIに送信する前にすべての入力データを検証
- 監査ログ: 疑わしい活動についてAPIアクセスログを監視