デベロッパー
APIリファレンス
mapps.oneのREST APIを使うと、独自のコード、CIパイプライン、連携機能から、アプリの作成と更新、ストアリンクの管理、ストアメタデータのインポート、分析の読み取り、QRコードの生成、Webhookの登録を行えます。APIはStudioプランで利用できます。
ベースURL
https://mapps.one/api/v1
すべてのリクエストでHTTPSを使用します。リクエスト本文はContent-Type: application/jsonを指定してJSONで送信し、エラーもJSONで返されるように、常にAccept: application/jsonを送信してください。
認証
ダッシュボードのデベロッパーでトークンを作成します。この操作は、ワークスペースのオーナーと管理者が行えます。トークンに「GitHub Actions」などの名前を付け、権限を選択します。トークンは一度しか表示されないため、すぐにシークレットマネージャーに保存してください。
トークンは個人ではなくワークスペースに属するため、メンバーがチームを離れても引き続き機能します。有効期限はありません。不要になったときや漏えいした可能性があるときは、同じページでトークンを取り消してください。
トークンはBearerトークンとして送信します。
curl https://mapps.one/api/v1/workspace \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json"
権限
| 権限 | 許可される操作 |
|---|---|
apps:read | アプリの一覧表示と読み取り、QRコードのダウンロード |
apps:write | アプリの作成、更新、削除、ストアリンクの置き換え、ストアメタデータのインポート |
analytics:read | アプリの分析の読み取り |
webhooks:manage | Webhookサブスクリプションの一覧表示、作成、削除 |
GET /workspaceとGET /eventsは、有効なトークンであれば権限に関係なく使用できます。各連携機能には、必要な権限だけを付与してください。
共通仕様
- IDは26文字の小文字のULIDです(例:
01j8b2k6r3xq9v7m4n5p0s1t2w)。アプリはスラッグではなくidで指定するため、スラッグを変更しても連携機能が壊れることはありません。 - タイムスタンプは、UTCのISO 8601形式です(例:
2026-09-14T08:12:44+00:00)。 - レスポンスでは、結果が
dataキーで囲まれます。 - ストアキーは
app_store、google_play、app_gallery、microsoft_store、webです。 - プラットフォームキーは
ios、android、huawei、windows、macos、otherです。遷移先キーは、ストアキーにlandingを加えたものです。
レート制限
各ワークスペースは1分あたり120リクエストまで送信でき、この上限はワークスペースのすべてのトークンで共有されます。すべてのレスポンスには、X-RateLimit-LimitヘッダーとX-RateLimit-Remainingヘッダーが含まれます。上限を超えると、APIは429 Too Many Requestsと、待機する秒数を示すRetry-Afterヘッダーを返します。
エラー
エラー時には、人が読めるmessageを含むJSON本文が返されます。一部のエラーには機械で読み取れるcodeも含まれ、バリデーションエラーではerrorsにフィールドごとの問題が一覧で示されます。
| ステータス | 発生する状況 |
|---|---|
401 | トークンがないか、無効か、取り消されています。{"message": "Unauthenticated."} |
402 | ワークスペースのプランにAPIアクセスが含まれていません。コードはplan_requiredです。 |
403 | このエンドポイントに必要な権限がトークンにありません。{"message": "Invalid ability provided."} |
404 | アプリまたはサブスクリプションが存在しないか、別のワークスペースに属しています。 |
422 | バリデーションに失敗したか、リクエストを完了できませんでした。たとえば、コードmetadata_unavailableが返されます。 |
429 | レート制限を超えました。Retry-Afterに示された秒数だけ待ってください。 |
5xx | 当社側で問題が発生しました。指数バックオフで再試行してください。 |
HTTP/2 402
{
"message": "API access requires the Studio plan.",
"code": "plan_required"
}
HTTP/2 422
{
"message": "This link is already taken.",
"errors": {
"slug": ["This link is already taken."]
}
}
エンドポイント
| メソッドとパス | 権限 | 説明 |
|---|---|---|
GET /workspace | 任意 | ワークスペース、プラン、使用状況、現在のトークン |
GET /events | 任意 | Webhookのイベントタイプ |
GET /apps | apps:read | アプリの一覧を取得 |
POST /apps | apps:write | アプリを作成 |
GET /apps/{id} | apps:read | アプリを取得 |
PATCH /apps/{id} | apps:write | アプリを更新 |
DELETE /apps/{id} | apps:write | アプリを削除 |
PUT /apps/{id}/links | apps:write | ストアリンクを設定または削除 |
POST /apps/{id}/metadata | apps:write | ストアの掲載情報から詳細をインポート |
GET /apps/{id}/analytics | analytics:read | 合計、日別の推移、内訳 |
GET /apps/{id}/qr | apps:read | QRコード画像 |
GET /webhooks | webhooks:manage | Webhookサブスクリプションの一覧を取得 |
POST /webhooks | webhooks:manage | Webhookサブスクリプションを作成 |
DELETE /webhooks/{id} | webhooks:manage | Webhookサブスクリプションを削除 |
アプリオブジェクト
| フィールド | 型 | 説明 |
|---|---|---|
id | string | アプリのULID |
name | string | アプリ名 |
slug | string | スマートリンクのパス:mapps.one/{slug} |
status | string | live、paused、suspendedのいずれか |
tagline, description | string または null | ページのテキスト |
category | string または null | カテゴリキー(例:health-fitness、productivity) |
page_theme | string | clean、midnight、vividのいずれか |
accent_color | string または null | 16進数のカラー(例:#16a34a) |
developer | object | name、website、email |
social_links | object | 入力済みのソーシャルプロフィール。ネットワーク名がキーになります:x、instagram、tiktok、youtube、facebook、linkedin、threads、github、discord、reddit |
features | array | icon、title、descriptionを持つ機能の項目 |
listed_in_explore | boolean | アプリがExploreに表示されるかどうか |
utm_passthrough | boolean | UTMタグをストアに転送するかどうか |
redirect_rules | object | プラットフォームごとの遷移先(デフォルト値を補完済み) |
icon_url | string または null | アイコンの公開URL |
rating | object または null | ストアから取得したvalueとcount |
urls | object | 公開URL:smart_link、landing_page、qr_svg、qr_png、privacy_policy、terms。法的ページのURLは、ドキュメントが公開されるまで404を返します。 |
links | object | ストアをキーとするストアリンク。それぞれにurl、status(unverified、verified、invalidのいずれか)、verified_atが含まれます。単一のアプリに対するレスポンスに含まれます。 |
screenshots | array | url、width、heightを持つスクリーンショット。メタデータのインポート後に含まれます。 |
created_at, updated_at | string | ISO 8601形式のタイムスタンプ |
アプリを取得する
curl https://mapps.one/api/v1/apps/01j8b2k6r3xq9v7m4n5p0s1t2w \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json"
{
"data": {
"id": "01j8b2k6r3xq9v7m4n5p0s1t2w",
"name": "Habitly",
"slug": "habitly",
"status": "live",
"tagline": "Build habits that stick",
"description": "Habitly helps you build small daily habits with gentle reminders and streaks.",
"category": "health-fitness",
"page_theme": "clean",
"accent_color": "#16a34a",
"developer": {
"name": "Habitly Labs",
"website": "https://habitly.app",
"email": "hello@habitly.app"
},
"social_links": {
"instagram": "https://instagram.com/habitly.app"
},
"features": [
{ "icon": "bell", "title": "Gentle reminders", "description": "Nudges at the time you choose." }
],
"listed_in_explore": true,
"utm_passthrough": true,
"redirect_rules": {
"ios": "app_store",
"android": "google_play",
"huawei": "app_gallery",
"windows": "microsoft_store",
"macos": "landing",
"other": "landing"
},
"icon_url": "https://mapps.one/storage/apps/01j8b2k6r3xq9v7m4n5p0s1t2w/icon/icon.png",
"rating": { "value": 4.8, "count": 12450 },
"urls": {
"smart_link": "https://mapps.one/habitly",
"landing_page": "https://mapps.one/habitly/page",
"qr_svg": "https://mapps.one/habitly/qr.svg",
"qr_png": "https://mapps.one/habitly/qr.png",
"privacy_policy": "https://mapps.one/habitly/privacy",
"terms": "https://mapps.one/habitly/terms"
},
"links": {
"app_store": {
"url": "https://apps.apple.com/app/id1612345678",
"status": "verified",
"verified_at": "2026-09-14T08:12:44+00:00"
},
"google_play": {
"url": "https://play.google.com/store/apps/details?id=com.habitly.app",
"status": "verified",
"verified_at": "2026-09-14T08:12:46+00:00"
}
},
"created_at": "2026-09-01T11:20:03+00:00",
"updated_at": "2026-09-14T08:12:46+00:00"
}
}
アプリの一覧を取得する
ワークスペース内のアプリを返します。結果はページ分割されています。links.nextをたどるか、?page=2のように指定して、値がnullになるまで取得してください。
curl "https://mapps.one/api/v1/apps?page=1" \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json"
{
"data": [
{ "id": "01j8b2k6r3xq9v7m4n5p0s1t2w", "name": "Habitly", "slug": "habitly", "status": "live" },
{ "id": "01j8d5r2w9y6a3c0e7g4j1m8p5", "name": "Habitly Focus", "slug": "habitly-focus", "status": "paused" }
],
"links": {
"first": "https://mapps.one/api/v1/apps?page=1",
"last": "https://mapps.one/api/v1/apps?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 25,
"total": 2
}
}
この例では、アプリオブジェクトを省略しています。実際には、各項目にすべてのフィールドが含まれます。
アプリを作成する
| フィールド | 必須 | 説明 |
|---|---|---|
name | はい | アプリ名(最大120文字) |
slug | いいえ | 小文字、数字、単独のハイフンで構成される3〜40文字。省略すると、名前から未使用のスラッグが生成されます。 |
links | いいえ | ストアをキーとするストアリンク。形式はストアリンクを設定すると同じです |
アプリを更新するに記載されているフィールドも送信できます。
curl https://mapps.one/api/v1/apps \
-X POST \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"name": "Habitly",
"slug": "habitly",
"links": {
"app_store": "https://apps.apple.com/us/app/habitly/id1612345678",
"google_play": "https://play.google.com/store/apps/details?id=com.habitly.app"
}
}'
レスポンスは201 Createdで、新しいアプリオブジェクトが返されます。ストアリンクは正規の形式で保存され、バックグラウンドのチェックが完了するまでステータスはunverifiedになります。アイコン、スクリーンショット、説明を入力するには、続けてストアメタデータをインポートするを呼び出してください。
アプリを更新する
変更したいフィールドだけを送信してください。
| フィールド | 型 |
|---|---|
name | string |
slug | string。変更すると、古いリンクはすぐに機能しなくなります。 |
tagline, description | string または null |
category | カテゴリキーまたは null |
page_theme | clean、midnight、vividのいずれか |
accent_color | #rrggbbまたは null |
utm_passthrough, listed_in_explore | boolean |
redirect_rules | プラットフォームキーと遷移先キーを対応させたobject |
curl https://mapps.one/api/v1/apps/01j8b2k6r3xq9v7m4n5p0s1t2w \
-X PATCH \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"tagline": "Tiny habits, big changes",
"redirect_rules": { "macos": "landing" }
}'
レスポンスは、更新後のアプリオブジェクトです。
アプリを削除する
curl https://mapps.one/api/v1/apps/01j8b2k6r3xq9v7m4n5p0s1t2w \
-X DELETE \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json"
レスポンスは204 No Contentです。削除は取り消せません。アプリのスマートリンク、ランディングページ、法的ドキュメント、メディア、分析データが削除されます。
ストアリンクを設定する
PUT /apps/{id}/linksは、ストアをキーとするlinksオブジェクトを受け取ります。
- URLを指定すると、そのストアのリンクが追加または置き換えられます
nullまたは空文字列を指定すると、リンクが削除されます- 指定しなかったストアは変更されません
各URLは、そのストアの有効な掲載ページである必要があります。たとえば、App IDを含むapps.apple.comのリンクや、パッケージIDを含むplay.google.comのリンクなどです。webリンクには、任意のhttpまたはhttpsのアドレスを指定できます。URLは最大1024文字です。リンクは正規の形式で保存され、バックグラウンドでチェックされます。
curl https://mapps.one/api/v1/apps/01j8b2k6r3xq9v7m4n5p0s1t2w/links \
-X PUT \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"links": {
"app_gallery": "https://appgallery.huawei.com/app/C109876543",
"web": null
}
}'
レスポンスは、linksを含むアプリオブジェクトです。無効なリンクを指定すると、422が返されます。
{
"message": "This is not a valid Google Play link.",
"errors": {
"links.google_play": ["This is not a valid Google Play link."]
}
}
ストアメタデータをインポートする
POST /apps/{id}/metadataは、App Storeの掲載情報(読み取り可能なApp Storeのリンクがない場合はGoogle Playの掲載情報)を読み取り、その詳細をインポートします。
| フィールド | 説明 |
|---|---|
overwrite | 任意。デフォルトはfalseです。falseの場合は空のフィールドだけが入力され、スクリーンショットはアプリに1枚もない場合にのみ追加されます。trueの場合は、名前、アイコン、テキスト、スクリーンショットが置き換えられます。評価と価格は常に更新されます。 |
curl https://mapps.one/api/v1/apps/01j8b2k6r3xq9v7m4n5p0s1t2w/metadata \
-X POST \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{ "overwrite": true }'
レスポンスは、linksとscreenshotsを含むアプリオブジェクトで、app.metadata_fetched Webhookが送信されます。掲載情報を読み取れない場合は、次のようになります。
HTTP/2 422
{
"message": "The store listing could not be read. Add a valid App Store or Google Play link first.",
"code": "metadata_unavailable"
}
分析
GET /apps/{id}/analyticsでは、次のクエリパラメーターを指定できます。
| パラメーター | 説明 |
|---|---|
range | 7d、30d、90d、12m、customのいずれか。デフォルトは30dです。 |
from, to | range=customの場合に指定する、YYYY-MM-DD形式の日付(両日を含む)。toに今日より後の日付は指定できません。 |
timezone | 日の区切りに使用するIANAタイムゾーン(例:Europe/Istanbul)。デフォルトはUTCです。 |
curl "https://mapps.one/api/v1/apps/01j8b2k6r3xq9v7m4n5p0s1t2w/analytics?range=7d&timezone=Europe/Istanbul" \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json"
{
"data": {
"app": { "id": "01j8b2k6r3xq9v7m4n5p0s1t2w", "slug": "habitly" },
"range": {
"key": "7d",
"from": "2026-09-07T21:00:00+00:00",
"to": "2026-09-14T21:00:00+00:00",
"timezone": "Europe/Istanbul",
"clamped_to_plan": false
},
"summary": {
"clicks": 1284,
"visitors": 902,
"page_views": 356,
"store_clicks": 141
},
"daily": {
"2026-09-08": 152,
"2026-09-09": 171,
"2026-09-10": 168,
"2026-09-11": 205,
"2026-09-12": 214,
"2026-09-13": 190,
"2026-09-14": 184
},
"breakdowns": {
"os": { "iOS": 702, "Android": 431, "Windows": 88, "macOS": 63 },
"country": { "TR": 512, "US": 298, "": 236, "DE": 141, "GB": 97 },
"source": { "instagram": 488, "direct": 402, "qr": 190, "google": 121, "x": 83 },
"destination": { "app_store": 640, "google_play": 399, "landing": 214, "deep_link": 31 },
"utm_campaign": { "": 796, "launch": 402, "newsletter-sep": 86 }
}
}
}
fromは範囲に含まれ、toは含まれません。どちらもUTCの時刻です。clamped_to_planは、リクエストした期間がプランの履歴に合わせて短縮された場合にtrueになります。dailyは、クリックのない日も含め、現地の日付ごとのクリック数です。- 内訳には、多い順に最大10個の値が含まれます。空のキー
""は、不明または未設定を意味します。 - 指標の定義は、分析ページに記載されています。
QRコード
GET /apps/{id}/qrは画像を返します。format=svg(デフォルト)またはformat=pngに加えて、公開QR URLと同じオプションfg、bg、margin、ecc、size、logo、downloadを使用できます。QRコードとプレスキットをご覧ください。
curl "https://mapps.one/api/v1/apps/01j8b2k6r3xq9v7m4n5p0s1t2w/qr?format=png&size=2048&ecc=Q" \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-o habitly-qr.png
ワークスペース
GET /workspaceは、ワークスペース、そのプランの上限と機能、現在の使用状況、使用中のトークンを返します。トークンが機能するかを確認するための最初の呼び出しに適しています。
{
"data": {
"id": "01j8a0f4c7d2e9h6k3m5n8q1r4",
"name": "Habitly Labs",
"plan": {
"key": "studio",
"name": "Studio",
"limits": {
"apps": null,
"analytics_days": 730,
"members": 10,
"custom_domains": 25,
"legal_locales": null,
"screenshots": 10,
"webhooks": 10
},
"features": ["remove_badge", "all_themes", "accent_color", "qr_logo", "legal_full", "deep_links", "press_kit", "analytics_export", "custom_domains", "team", "folders", "ab_testing", "api", "webhooks", "white_label"]
},
"usage": { "apps": 12, "custom_domains": 3, "members": 4 },
"token": { "name": "GitHub Actions", "abilities": ["apps:read", "apps:write"] }
}
}
上限がnullの場合は、無制限を意味します。
イベントタイプ
GET /eventsは、Webhookのイベントタイプを短い説明とともに一覧で返します。連携機能では、これを使ってイベントの選択画面を作成できます。
{
"data": [
{ "type": "app.created", "description": "An app was added to the workspace." },
{ "type": "app.updated", "description": "App details, links or page settings changed." },
{ "type": "app.deleted", "description": "An app was deleted." },
{ "type": "app.status_changed", "description": "An app went live, was paused or was suspended." },
{ "type": "app.metadata_fetched", "description": "Store metadata was imported for an app." },
{ "type": "legal.published", "description": "A privacy policy or terms document was published." },
{ "type": "domain.verified", "description": "A custom domain was verified." },
{ "type": "link.clicked", "description": "Every smart link click. High volume." },
{ "type": "analytics.daily_summary", "description": "Yesterday's click totals for each app, sent once a day." }
]
}
Webhookサブスクリプション
ユーザーが連携機能を接続したときなどにコードからWebhookサブスクリプションを作成し、接続が解除されたときに削除します。POST /webhooksは次のフィールドを受け取ります。
| フィールド | 必須 | 説明 |
|---|---|---|
url | はい | イベントを受信する、公開されたhttps URL |
events | はい | イベントタイプの配列。すべてのイベントを受信する場合は["*"] |
description | いいえ | 最大160文字。ダッシュボードに表示されます |
curl https://mapps.one/api/v1/webhooks \
-X POST \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.zapier.com/hooks/catch/1234567/abcde12/",
"events": ["link.clicked"],
"description": "Zapier: clicks to Google Sheets"
}'
HTTP/2 201
{
"data": {
"id": "01j8c1p4s7v0y3b6e9h2k5n8q1",
"url": "https://hooks.zapier.com/hooks/catch/1234567/abcde12/",
"events": ["link.clicked"],
"description": "Zapier: clicks to Google Sheets",
"is_active": true,
"secret": "9f2c4e7a1b8d3f6e0a5c2b9d7e4f1a3c6b8d0e2f4a6c8e0b2d4f6a8c0e2b4d61",
"created_at": "2026-09-14T10:05:12+00:00"
}
}
署名用のsecretは、サブスクリプションの作成時にのみ返されます。これを使って署名を検証してください。Studioワークスペースでは、最大10個のWebhookエンドポイントを設定できます。サブスクリプションはDELETE /webhooks/{id}で削除でき、204 No Contentが返されます。
例:CIからベータ版を公開する
このスクリプトは、アプリを作成してGoogle Playのリンクを追加し、掲載情報をインポートしてスマートリンクを出力します。curl、jqと、apps:write権限を持つトークンが必要です。
#!/usr/bin/env bash
set -euo pipefail
API="https://mapps.one/api/v1"
HEADERS=(-H "Authorization: Bearer $MAPPS_TOKEN" -H "Accept: application/json" -H "Content-Type: application/json")
APP_ID=$(curl -sf "${HEADERS[@]}" -X POST "$API/apps" \
-d '{"name": "Habitly Beta", "slug": "habitly-beta"}' | jq -r '.data.id')
curl -sf "${HEADERS[@]}" -X PUT "$API/apps/$APP_ID/links" \
-d '{"links": {"google_play": "https://play.google.com/store/apps/details?id=com.habitly.beta"}}' > /dev/null
curl -sf "${HEADERS[@]}" -X POST "$API/apps/$APP_ID/metadata" \
-d '{"overwrite": true}' | jq -r '.data.urls.smart_link'
バージョン管理
これはAPIのバージョン1です。エンドポイント、フィールド、イベントタイプは随時追加される可能性があるため、認識できないフィールドは無視してください。互換性を損なう変更は、事前に告知したうえで新しいバージョンとしてリリースします。