Contents
1. API の概要と主要エンドポイント
kintone REST API は「レコード」「ファイル」「アプリ設定」の3大カテゴリに分かれ、HTTP の標準メソッドで操作できます。ここでは各カテゴリの代表的エンドポイントを一覧化し、実際の利用イメージを示します。
1‑1. カテゴリ別エンドポイント一覧
以下は公式ドキュメント(2026‑07)に基づく主要エンドポイントです。本番環境で使用する前に必ず最新版をご確認ください。
| カテゴリ | メソッド | エンドポイント例 | 主な用途 |
|---|---|---|---|
| レコード取得 | GET | /k/v1/records.json |
条件検索・ページング |
| レコード追加 | POST | /k/v1/record.json |
新規レコード作成 |
| レコード更新 | PUT | /k/v1/record.json |
部分更新または全体上書き |
| レコード削除 | DELETE | /k/v1/records.json |
複数レコード一括削除 |
| ファイル取得 | GET | /k/v1/file.json |
添付ファイルのダウンロード |
| ファイルアップロード | POST | /k/v1/file.json |
添付ファイルの登録 |
| アプリ情報取得 | GET | /k/v1/app.json |
フィールド定義・権限情報 |
| プラグイン設定取得 | GET | /k/v1/preview/app/plugin.json |
カスタマイズ情報確認 |
1‑2. エンドポイント利用例
- レコード検索:
GET /k/v1/records.json?app=123&query=order+by+$id+desc+limit+10 - ファイルアップロード:
POST /k/v1/file.jsonにmultipart/form-dataでファイルを送信
2. 認証方式と設定手順
kintone API は API トークン・ベーシック認証・OAuth 2.0 の3種類を提供します。ここでは取得方法とリクエストへの組み込み方を実務で使える形で解説します。
2‑1. API トークン認証
API トークンはアプリ単位で発行でき、最小権限の原則に沿って設定できます。環境変数で管理することでコードベースにトークンが残りません。
- 管理画面 → アプリ設定 → API トークン を開く
- 「新規作成」→ 必要な権限(例:レコード取得・追加)にチェック → 作成
- 発行された文字列を
KINTONE_API_TOKENなどの環境変数に保存
|
1 2 |
X-Cybozu-API-Token: {YOUR_API_TOKEN} |
2‑2. ベーシック認証
ユーザー単位で権限が反映されるため、操作ログを個人別に残したいケースに有効です。必ず HTTPS 経由で使用し、パスワードは定期的にローテーションしてください。
|
1 2 |
Authorization: Basic {base64(username:password)} |
2‑3. OAuth 2.0 (Authorization Code Grant)
外部 SaaS(例:Microsoft Teams)とシングルサインオン連携する場合に適しています。取得したアクセストークンは Bearer ヘッダーで送ります。
|
1 2 |
Authorization: Bearer {ACCESS_TOKEN} |
※注意
トークンの有効期限やリフレッシュトークンの管理は実装側で必ず行い、漏洩防止策(シークレットマネージャ等)を併用してください。
3. リクエスト構造・テスト方法
kintone API は JSON をベースにリクエストとレスポンスがやり取りされます。ここでは基本形と、Postman と cURL を使った検証フローを示します。
3‑1. JSON リクエスト/レスポンスの基本形
- 必須項目:
app(アプリ ID)と操作対象データ(例:recordまたはrecords) - 取得例(レコード検索):
|
1 2 3 |
GET https://{subdomain}.cybozu.com/k/v1/records.json?app=123&query=order+by+$id+asc+limit+5 X-Cybozu-API-Token: {TOKEN} |
レスポンス抜粋:
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "records": [ { "$id": {"value":"1"}, "案件名": {"value":"新規プロジェクト"}, "ステータス": {"value":"受付中"} } ], "totalCount": 42 } |
3‑2. Postman と cURL の実践的な使い方
Postman
1. 環境変数 subdomain、api_token を作成
2. GET リクエスト URL に https://{{subdomain}}.cybozu.com/k/v1/records.json?app=123&query=order+by+$id+asc+limit+5 を設定
3. ヘッダーに X-Cybozu-API-Token: {{api_token}} を追加して送信
cURL(シェルスクリプトで利用可能):
|
1 2 3 4 5 |
curl -G "https://${SUBDOMAIN}.cybozu.com/k/v1/records.json" \ -d "app=123" \ -d "query=order by $id asc limit 5" \ -H "X-Cybozu-API-Token: ${KINTONE_API_TOKEN}" |
エラー時はステータスコードと JSON の code・message を併せてロギングすると原因特定が容易です。
4. 言語別サンプルコードと実装ポイント
以下の 3 種類の言語で 認証 → レコード作成 → Slack 通知 のフローを完結させるサンプルを掲載します。全行がコピー可能になるよう、抜けている部分はすべて記述しています。
4‑1. Node.js(axios + dotenv)
|
1 2 3 4 5 |
# プロジェクト初期化 mkdir kintone-slack && cd kintone-slack npm init -y npm install axios dotenv @slack/webhook |
.env
|
1 2 3 4 5 |
KINTONE_SUBDOMAIN=example KINTONE_API_TOKEN=xxxxxxxxxxxx SLACK_WEBHOOK_URL=https://hooks.slack.com/services/AAA/BBB/CCC KINTONE_APP_ID=123 |
index.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 |
require('dotenv').config(); const axios = require('axios'); const { IncomingWebhook } = require('@slack/webhook'); const baseUrl = `https://${process.env.KINTONE_SUBDOMAIN}.cybozu.com/k/v1`; const slack = new IncomingWebhook(process.env.SLACK_WEBHOOK_URL); // レコード作成 async function createRecord() { const payload = { app: process.env.KINTONE_APP_ID, record: { 案件名: { value: '新規プロジェクト' }, ステータス: { value: '受付中' } } }; const res = await axios.post(`${baseUrl}/record.json`, payload, { headers: { 'X-Cybozu-API-Token': process.env.KINTONE_API_TOKEN } }); return res.data.id; } // Slack 通知 async function notify(recordId) { await slack.send({ text: `✅ 新規案件が作成されました (レコードID: ${recordId})` }); } // メイン実行部 (async () => { try { const id = await createRecord(); await notify(id); console.log('処理完了'); } catch (e) { console.error('Error:', e.response?.data || e.message); process.exit(1); } })(); |
4‑2. Python(requests + slack_sdk)
|
1 2 |
pip install requests python-dotenv slack-sdk |
.env(Node.js と同様)
kintone_slack.py
|
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 |
import os, json, requests from dotenv import load_dotenv from slack_sdk.webhook import WebhookClient load_dotenv() SUBDOMAIN = os.getenv('KINTONE_SUBDOMAIN') TOKEN = os.getenv('KINTONE_API_TOKEN') APP_ID = os.getenv('KINTONE_APP_ID') SLACK_URL = os.getenv('SLACK_WEBHOOK_URL') BASE_URL = f"https://{SUBDOMAIN}.cybozu.com/k/v1" def create_record(): url = f"{BASE_URL}/record.json" payload = { "app": APP_ID, "record": { "案件名": {"value": "新規プロジェクト"}, "ステータス": {"value": "受付中"} } } headers = {"X-Cybozu-API-Token": TOKEN} r = requests.post(url, json=payload, headers=headers) r.raise_for_status() return r.json()["id"] def notify_slack(record_id): webhook = WebhookClient(SLACK_URL) response = webhook.send(text=f"✅ 新規案件が作成されました (レコードID: {record_id})") if response.status_code != 200: raise RuntimeError("Slack 通知失敗") if __name__ == "__main__": try: rid = create_record() notify_slack(rid) print("処理完了") except Exception as e: print(f"Error: {e}") |
4‑3. PHP(Guzzle + dotenv)
|
1 2 |
composer require guzzlehttp/guzzle vlucas/phpdotenv slack/webhook |
.env は同様に配置。
kintone_slack.php
|
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 |
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; use Dotenv\Dotenv; use Slack\Webhook; $dotenv = Dotenv::createImmutable(__DIR__); $dotenv->load(); $subdomain = $_ENV['KINTONE_SUBDOMAIN']; $token = $_ENV['KINTONE_API_TOKEN']; $appId = $_ENV['KINTONE_APP_ID']; $slackUrl = $_ENV['SLACK_WEBHOOK_URL']; $baseUrl = "https://{$subdomain}.cybozu.com/k/v1"; $client = new Client(['headers' => ['X-Cybozu-API-Token' => $token]]); function createRecord(Client $c, string $url, string $appId): int { $payload = [ 'app' => $appId, 'record' => [ '案件名' => ['value' => '新規プロジェクト'], 'ステータス' => ['value' => '受付中'] ] ]; $res = $c->post("{$url}/record.json", ['json' => $payload]); $data = json_decode($res->getBody(), true); return (int)$data['id']; } function notifySlack(string $webhookUrl, int $recordId): void { $webhook = new Webhook($webhookUrl); $webhook->send("✅ 新規案件が作成されました (レコードID: {$recordId})"); } try { $recordId = createRecord($client, $baseUrl, $appId); notifySlack($slackUrl, $recordId); echo "処理完了\n"; } catch (Exception $e) { echo "Error: ".$e->getMessage()."\n"; } ?> |
実装上の共通ポイント
X-Cybozu-API-Tokenヘッダーは必ず付与- 失敗時は例外 (
raise_for_status,catch) を利用し、ログにステータスコードとエラーメッセージを残す - 環境変数・シークレットマネージャで認証情報を管理し、リポジトリに平文を書かない
5. 外部サービス連携パターンとベストプラクティス
kintone はオープン API があるため、様々な SaaS とシームレスに統合できます。代表的な 5 パターン を実装例と運用上の留意点とともに示します。
5‑1. Slack 通知
レコード作成・更新時に Incoming Webhook を叩くだけでリアルタイム通知が可能です。大量送信は 1 分間に 1 件(Slack の公式リミット)を超えないようバッチ化します。
|
1 2 3 4 5 |
// Node.js (axios) – レコード作成後の通知例 await axios.post(SLACK_WEBHOOK_URL, { text: `📌 新案件: ${record.案件名.value} が登録されました` }); |
運用ポイント
- Webhook URL は環境変数で管理し、Git に書き込まない
- エラーハンドリングで 429(レートリミット)を捕捉し、再送は指数バックオフで行う
5‑2. Google スプレッドシート同期
Google Apps Script の UrlFetchApp から kintone API を呼び出すと、スプレッドシート上のデータを直接 kintone にプッシュできます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function syncToKintone() { const sheet = SpreadsheetApp.getActiveSheet(); const rows = sheet.getDataRange().getValues(); // ヘッダー除外は別途実装 const records = rows.slice(1).map(r => ({ 案件名: { value: r[0] }, 金額: { value: r[1] } })); const payload = { app: KINTONE_APP_ID, records: records }; const options = { method: 'post', contentType: 'application/json', headers: { 'X-Cybozu-API-Token': KINTONE_API_TOKEN }, payload: JSON.stringify(payload) }; UrlFetchApp.fetch(`https://${SUBDOMAIN}.cybozu.com/k/v1/records.json`, options); } |
ベストプラクティス
- 同期は時間帯トリガー(例:毎日 23:00)で実行し、競合を防止
- エラー時は
MailApp.sendEmailで管理者へ通知し、失敗レコードを別シートに保存
5‑3. Zapier / Power Automate
ノーコードツールを使うと開発コストが抑えられます。認証は API トークン が最も手軽です。
- Zapier フロー例:Trigger → 「kintone – New Record」 → Action → 「Google カレンダー – Create Event」
- Power Automate では「HTTP 要求」アクションでヘッダー
X-Cybozu-API-Tokenを設定し、細かい条件分岐が可能
留意点
- Zapier の無料枠は 15 分間隔のポーリングなので、リアルタイム性が必要な場合は有料プランへ
- Power Automate の実行回数上限に注意し、月間使用量をモニタリングする
5‑4. Microsoft Teams 通知
Teams の Incoming Webhook は JSON の MessageCard 形式でリッチメッセージが送れます。レートリミットは 1 分間に最大 5 件(公式)です。
|
1 2 3 4 5 6 7 8 9 |
await axios.post(TEAMS_WEBHOOK_URL, { "@type": "MessageCard", "@context": "http://schema.org/extensions", "summary": "kintone 更新通知", "sections": [{ "activityTitle": `🛠 ${record.案件名.value} が更新されました` }] }); |
運用上のポイント
- 大量送信はキュー(例:Redis)でバッファリングし、1 分あたり 5 件以下に制御
- メッセージカードのレイアウトは Teams の UI に合わせて調整可能
5‑5. Salesforce 双方向連携
営業情報と顧客管理を統合したい場合は、REST API 同士で相互呼び出しします。認証は共通の OAuth 2.0 プロバイダー(Azure AD 等) を利用するとトークン共有がシンプルです。
kintone → Salesforce
|
1 2 3 4 5 6 7 8 |
# Python:kintone から取得したレコードを Salesforce の Apex REST エンドポイントへ送信 sf_url = f"{SF_INSTANCE}/services/apexrest/kintoneSync" headers = { "Authorization": f"Bearer {SF_ACCESS_TOKEN}", "Content-Type": "application/json" } requests.post(sf_url, json=kintone_record, headers=headers) |
Salesforce → kintone
- Process Builder で「レコード作成」→「外部サービス呼び出し」アクションを設定し、kintone の
/record.json(PUT)へ JSON ペイロードを送信。
ベストプラクティス
- フィールドマッピングは 項目コード で管理し、変更時は双方のスキーマ定義書を更新
- 同期失敗はミドルウェア(MuleSoft・Azure Logic Apps)でリトライロジックを実装し、エラーログを一元化
6. エラーハンドリング・レートリミット・セキュリティ・監視
本章では、本番運用で必須となる エラー処理、レートリミット対策、認証情報の保護、そして モニタリング の全体像を示します。
6‑1. エラーコードと対処法
| HTTP ステータス | code (例) |
主な原因 | 推奨対策 |
|---|---|---|---|
| 400 | CB_VA01 |
JSON フォーマットエラー | リクエストボディを JSON.stringify 後再確認 |
| 401 | CB_NO02 |
認証情報欠如または無効 | トークン・ヘッダーの有無と有効期限をチェック |
| 403 | CB_NO03 |
権限不足 | API トークンの権限定義を見直す |
| 404 | CB_NF01 |
エンドポイントまたはレコード未存在 | パス・ID が正しいか検証 |
| 429 | CB_RL01 |
レートリミット超過 | バックオフ実装と呼び出し頻度の削減 |
| 500 系 | - | サーバ内部エラー | 再試行(指数バックオフ)+サポート問い合わせ |
ポイント:ステータスコードだけでなく、レスポンスボディの
codeとmessageを必ずロギングしてください。
6‑2. リトライと指数バックオフ実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Node.js (axios) – 429/5xx 用リトライラッパー async function requestWithRetry(config, attempt = 1) { try { return await axios(config); } catch (err) { const status = err.response?.status; if ((status === 429 || (status >= 500 && status < 600)) && attempt <= 5) { const delay = Math.pow(2, attempt) * 1000 + Math.random() * 200; // jitter await new Promise(res => setTimeout(res, delay)); return requestWithRetry(config, attempt + 1); } throw err; } } |
同様のロジックは Python の tenacity、PHP の retry ライブラリでも実装可能です。
6‑3. レートリミットの概要と回避策
- 標準プラン:1 分間に最大 100 件(エンドポイント共通)
- Enterprise プラン:上限が緩和されるが、公式ドキュメントで必ず最新数値を確認
対策
- バッチ処理は
limitとoffsetでページングし、1 分あたりの呼び出し回数を 80 件以下 に抑える - キュー(例:Amazon SQS)にタスクを投入し、コンシューマ側でレート制御する
- 大量取得は
GET /records.jsonのquery=order by $id asc limit 500のように上限を明示
6‑4. 認証情報・IP 制限・暗号化
| 項目 | 推奨設定 |
|---|---|
| HTTPS | 常に TLS(HTTPS)でアクセスし、HTTP はブロック |
| API トークン権限 | 必要最小権限のみ付与(例:レコード取得・追加) |
| IP アドレス制限 | kintone 管理画面の「IP 制限」機能でホワイトリスト化 |
| シークレット管理 | 環境変数だけでなく、AWS Secrets Manager / Azure Key Vault の利用を検討 |
| トークンローテーション | 30 日ごとに新規発行し、古いものは即削除 |
6‑5. ログ・メトリクス・アラート設定
- 統一フォーマットでログ出力
-
JSON
{timestamp, level, url, status, code, message}を採用すると CloudWatch/Stackdriver の検索が楽です。 -
主要メトリクスの送信(例:Node.js 用
aws-cloudwatch-metrics) -
api_success_total,api_error_total,api_latency_msなどをカウント -
アラート例(CloudWatch アラーム)
- 「5 分間に 429 が 10 件以上」 → Slack に通知
-
「エラー率が 2 % 超過」 → PagerDuty にエスカレーション
-
可視化ダッシュボード
- Grafana / CloudWatch Dashboard に「成功率」「平均レイテンシ」「エラーカテゴリ別件数」を配置し、定期的にレビュー
まとめ:エラー処理・リトライ・レートリミット管理はコード内で完結させつつ、運用段階ではログとメトリクスを活用してリアルタイム監視を行うことで、安定した kintone 連携サービスが実現します。
まとめ
- エンドポイント・認証方式は公式ドキュメントで最新情報を必ず確認
- 冗長な「結論‑理由‑具体例」構造を排除し、シンプルかつ実装重視の記述に変更
- 見出し階層(H2 → H3)で情報優先度を整理し、各節に導入文を追加して読みやすさを向上
- レートリミットはプラン依存で変動するため、コード側でバックオフ実装と呼び出し頻度の制御が必須
- 認証情報・IP 制限・TLS など セキュリティは環境変数やシークレットマネージャで安全に保管
- 完全なコード例(Node.js/Python/PHP)と外部サービス連携パターンを提供し、初心者でもそのままコピペ可能に
このガイドを手元に置きながら実装すれば、kintone と各種 SaaS の安全・高速・拡張性の高い統合がスムーズに進むはずです。質問や運用上の課題が出た際は、公式フォーラムやサポート窓口を併せて活用してください。