Task No を確認する
ダッシュボードの `Operations Desk` に表示されている番号を確認します。外部 API はこの番号を使って取得します。
API For Beginners
このページは初心者向けの開発者ドキュメントです。どの URL を使うか、どう認証するか、どんな JSON が返るかを、コピペできるサンプルコード付きでまとめています。
https://s.by0.uk を使っています。ドメインが違う場合は読み替えてください。/v1/{taskNo} を使うのが最も簡単です。/api/* は管理画面用の内部 API です。Cookie と CSRF を使います。Quick Start
ダッシュボードの `Operations Desk` に表示されている番号を確認します。外部 API はこの番号を使って取得します。
外部システムから読むだけなら API key を使います。管理画面を自動化したい場合はログインして Cookie を使います。
コードに入れる前に、まず `curl` で 1 回成功させるのが最短です。成功したら同じ内容を JavaScript や PHP に移します。
Authentication
X-API-Key外部システム連携ならこれが最も簡単です。ヘッダーに API key を付けるだけで /v1/{taskNo} を読めます。
Authorization: BearerAPI key を Bearer トークンとして渡す方法です。既存の HTTP クライアントに載せやすい時はこちらでも大丈夫です。
?api_key=...動作確認用には使えますが、URL に残りやすいので本番運用では推奨しません。
/api/* を使う場合はこちらです。ログインで Cookie を取得し、更新系 API では X-CSRF-Token を付けます。
Endpoints
| Method | Path | 認証 | 用途 |
|---|---|---|---|
| GET | /health |
不要 | サーバーが応答しているか確認します。 |
| GET | /v1/{taskNo} |
API key または Cookie | 外部連携の本命です。対象タスクの取得済み商品を最新順で返します。 |
| GET | /s/{shortCode} |
不要 | 短縮URLを開くと、内部でアフィリエイトURLへリダイレクトします。 |
| POST | /api/auth/login |
不要 | 内部 API 用のログインです。Cookie を受け取ります。 |
| GET | /api/me |
Cookie | 現在ログイン中か、どのテナントかを確認します。 |
| GET | /api/status |
Cookie | 件数サマリー、ベースURL、設定の一部を返します。 |
| POST | /api/tasks/{taskNo}/run |
Cookie + CSRF | 対象タスクを手動実行します。 |
Parameters
/v1/{taskNo} の基本ルールtaskNoダッシュボードに表示されるタスク番号です。テナントの権限外や存在しない番号だと 404 になります。
limit返却件数です。例: limit=100。全件欲しい時は limit=all を使えます。
offsetページ送り開始位置です。例: offset=100。
既定で最新順です。新しい取得結果から返ります。
同一タスクで同じ商品を再取得しても、重複レコードを増やさず更新扱いにします。
同じ Task No を推測しても、認証したテナント外のデータは取得できません。
Code Samples
curl
curl -s \
-H "X-API-Key: YOUR_API_KEY" \
"https://s.by0.uk/v1/1?limit=3"
JavaScript
const response = await fetch("https://s.by0.uk/v1/1?limit=3", {
headers: {
"X-API-Key": "YOUR_API_KEY",
},
});
const data = await response.json();
console.log(data.records);
Python
import requests
url = "https://s.by0.uk/v1/1"
params = {"limit": 3}
headers = {"X-API-Key": "YOUR_API_KEY"}
response = requests.get(url, params=params, headers=headers, timeout=30)
response.raise_for_status()
data = response.json()
for row in data["records"]:
print(row["title"], row["price"])
PHP
<?php
$url = "https://s.by0.uk/v1/1?limit=3";
$headers = [
"X-API-Key: YOUR_API_KEY",
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$body = curl_exec($ch);
if ($body === false) {
throw new Exception(curl_error($ch));
}
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new Exception("HTTP error: " . $status);
}
$data = json_decode($body, true);
foreach ($data["records"] as $row) {
echo $row["title"] . " / " . $row["price"] . PHP_EOL;
}
Session Example
Python
import requests
base_url = "https://s.by0.uk"
session = requests.Session()
login_response = session.post(
f"{base_url}/api/auth/login",
json={
"username": "YOUR_USERNAME",
"password": "YOUR_PASSWORD",
},
timeout=30,
)
login_response.raise_for_status()
me = login_response.json()["me"]
csrf_token = me["csrf_token"]
run_response = session.post(
f"{base_url}/api/tasks/1/run",
json={},
headers={"X-CSRF-Token": csrf_token},
timeout=120,
)
run_response.raise_for_status()
print(run_response.json())
Response Examples
GET /health
{
"status": "ok",
"time": "2026-04-01T11:00:00+09:00"
}
GET /v1/1?limit=2
{
"task": {
"task_no": 1,
"task_name": "ポケカ",
"keyword": "ポケカ",
"category": "トレーディングカード",
"source": "mercari"
},
"total": 120,
"offset": 0,
"count": 2,
"records": [
{
"task_no": 1,
"title": "ポケモンカード まとめ売り SR入り",
"image_url": "https://static.mercdn.net/item/detail/orig/photos/m12345678901_1.jpg",
"product_url": "https://jp.mercari.com/item/m12345678901",
"price": 6800,
"short_url": "https://s.by0.uk/s/Ab12Cd34",
"fetched_at": "2026-04-01T08:49:18+09:00"
},
{
"task_no": 1,
"title": "ポケモンカード 引退品 まとめ",
"image_url": "https://static.mercdn.net/item/detail/orig/photos/m12345678902_1.jpg",
"product_url": "https://jp.mercari.com/item/m12345678902",
"price": 12000,
"short_url": "https://s.by0.uk/s/Xy98Mn45",
"fetched_at": "2026-04-01T08:49:18+09:00"
}
]
}
POST /api/auth/login
{
"message": "ログインしました。",
"me": {
"authenticated": true,
"auth_type": "session",
"username": "tenant1_owner",
"tenant_id": 2,
"tenant_name": "Tenant 1",
"tenant_slug": "tenant-1",
"is_superadmin": false,
"csrf_token": "CSRF_TOKEN_HERE"
}
}
GET /api/status
{
"server_time": "2026-04-01T11:00:00+09:00",
"base_url": "https://s.by0.uk",
"counts": {
"task_count": 1,
"enabled_task_count": 1,
"item_count": 120,
"issued_url_count": 120,
"log_count": 42
},
"tenant": {
"tenant_id": 2,
"tenant_name": "Tenant 1",
"tenant_slug": "tenant-1"
},
"settings_preview": {
"fetcher_mode": "api",
"short_base_url": "https://s.by0.uk",
"short_code_length": "8",
"api_default_limit": "50"
},
"tasks_due_now": [1]
}
POST /api/tasks/1/run
{
"task_no": 1,
"tenant_id": 2,
"source": "mercari",
"status": "success",
"items_processed": 60,
"message": "60件のメルカリ商品を取得しました。",
"finished_at": "2026-04-01T11:05:00+09:00",
"next_run_at": "2026-04-01T11:35:00+09:00"
}
Errors
{
"error": "認証が必要です。"
}
{
"error": "Task not found"
}
{
"error": "CSRF token が一致しません。再ログインしてください。"
}
Tips
外部連携はまず X-API-Key で /v1/{taskNo} を読むところから始めるのが最短です。管理画面の自動化は Cookie と CSRF を使うぶん少し複雑なので、必要になった時にだけ取り組むのがおすすめです。
さらに詳しい説明や手元で保存する用の資料は docs/api-developer-guide.md を参照してください。