Geliştiriciler
API başvurusu
mapps.one REST API ile kendi kodundan, CI sürecinden ya da entegrasyonundan uygulama oluşturabilir ve güncelleyebilir, mağaza bağlantılarını yönetebilir, mağaza bilgilerini içe aktarabilir, analitiği okuyabilir, QR kod oluşturabilir ve webhook'lara abone olabilirsin. API, Studio planında kullanılabilir.
Temel adres
https://mapps.one/api/v1
Tüm istekler HTTPS kullanır. İstek gövdelerini Content-Type: application/json ile JSON olarak gönder; hataların da JSON olarak dönmesi için her zaman Accept: application/json gönder.
Kimlik doğrulama
Panelde Geliştiriciler bölümünden bir token oluştur. Bunu çalışma alanı sahipleri ve yöneticileri yapabilir. Token'a "GitHub Actions" gibi bir ad ver ve yetkilerini seç. Token yalnızca bir kez gösterilir; hemen gizli anahtar yöneticine kaydet.
Token'lar bir kişiye değil çalışma alanına aittir, bu yüzden biri ekipten ayrıldığında çalışmaya devam eder. Süreleri dolmaz. Artık ihtiyacın olmadığında ya da sızmış olabileceğini düşündüğünde token'ı aynı sayfadan iptal et.
Token'ı bearer token olarak gönder:
curl https://mapps.one/api/v1/workspace \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json"
Yetkiler
| Yetki | İzin verdikleri |
|---|---|
apps:read | Uygulamaları listeleme ve okuma, QR kod indirme |
apps:write | Uygulama oluşturma, güncelleme ve silme; mağaza bağlantılarını değiştirme; mağaza bilgilerini içe aktarma |
analytics:read | Uygulama analitiğini okuma |
webhooks:manage | Webhook aboneliklerini listeleme, oluşturma ve silme |
GET /workspace ve GET /events geçerli her token'la çalışır. Her entegrasyona yalnızca ihtiyaç duyduğu yetkileri ver.
Kurallar
- Kimlikler,
01j8b2k6r3xq9v7m4n5p0s1t2wgibi 26 karakterlik küçük harfli ULID'lerdir. Uygulamalara bağlantı adıyla değilidile erişilir; böylece bağlantı adını değiştirmek entegrasyonunu bozmaz. - Zaman damgaları UTC'de ISO 8601 biçimindedir, örneğin
2026-09-14T08:12:44+00:00. - Yanıtlar sonucu bir
dataanahtarı içinde döndürür. - Mağaza anahtarları:
app_store,google_play,app_gallery,microsoft_storeveweb. - Platform anahtarları:
ios,android,huawei,windows,macosveother. Hedef anahtarları, mağaza anahtarlarına ek olaraklanding'dir.
İstek sınırları
Her çalışma alanı dakikada 120 istek yapabilir; bu sınırı tüm token'ları ortak kullanır. Her yanıtta X-RateLimit-Limit ve X-RateLimit-Remaining başlıkları bulunur. Sınırı aştığında API, beklemen gereken saniyeyi belirten bir Retry-After başlığıyla 429 Too Many Requests döndürür.
Hatalar
Hatalar, insanların okuyabileceği bir message içeren JSON gövdesi döndürür. Bazı hatalar makinelerin okuyabileceği bir code da içerir; doğrulama hataları ise sorunları alan bazında errors içinde listeler.
| Durum | Ne zaman |
|---|---|
401 | Token eksik, geçersiz ya da iptal edilmiş. {"message": "Unauthenticated."} |
402 | Çalışma alanının planı API erişimini içermiyor. Kod: plan_required. |
403 | Token bu uç noktanın gerektirdiği yetkiye sahip değil. {"message": "Invalid ability provided."} |
404 | Uygulama ya da abonelik yok veya başka bir çalışma alanına ait. |
422 | Doğrulama başarısız oldu ya da istek tamamlanamadı. Örneğin kod: metadata_unavailable. |
429 | İstek sınırı aşıldı. Retry-After içindeki saniye kadar bekle. |
5xx | Bizim tarafımızda bir sorun oluştu. Üstel bekleme (exponential backoff) ile tekrar dene. |
Hata mesajları API'de İngilizce döner:
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."]
}
}
Uç noktalar
| Yöntem ve yol | Yetki | Açıklama |
|---|---|---|
GET /workspace | herhangi | Çalışma alanı, plan, kullanım ve geçerli token |
GET /events | herhangi | Webhook olay türleri |
GET /apps | apps:read | Uygulamaları listele |
POST /apps | apps:write | Uygulama oluştur |
GET /apps/{id} | apps:read | Bir uygulamayı getir |
PATCH /apps/{id} | apps:write | Uygulamayı güncelle |
DELETE /apps/{id} | apps:write | Uygulamayı sil |
PUT /apps/{id}/links | apps:write | Mağaza bağlantılarını ayarla ya da kaldır |
POST /apps/{id}/metadata | apps:write | Mağaza sayfasından bilgileri içe aktar |
GET /apps/{id}/analytics | analytics:read | Toplamlar, günlük seri ve kırılımlar |
GET /apps/{id}/qr | apps:read | QR kod görseli |
GET /webhooks | webhooks:manage | Webhook aboneliklerini listele |
POST /webhooks | webhooks:manage | Webhook aboneliği oluştur |
DELETE /webhooks/{id} | webhooks:manage | Webhook aboneliğini sil |
Uygulama nesnesi
| Alan | Tür | Açıklama |
|---|---|---|
id | string | Uygulamanın ULID'si |
name | string | Uygulama adı |
slug | string | Akıllı bağlantının yolu: mapps.one/{slug} |
status | string | live, paused ya da suspended |
tagline, description | string ya da null | Sayfa metinleri |
category | string ya da null | health-fitness ya da productivity gibi bir kategori anahtarı |
page_theme | string | clean, midnight ya da vivid |
accent_color | string ya da null | #16a34a gibi hex renk |
developer | object | name, website ve email |
social_links | object | Doldurulmuş sosyal profiller, ağa göre: x, instagram, tiktok, youtube, facebook, linkedin, threads, github, discord, reddit |
features | array | icon, title ve description içeren özellik maddeleri |
listed_in_explore | boolean | Uygulamanın Keşfet'te görünüp görünmediği |
utm_passthrough | boolean | UTM etiketlerinin mağazalara aktarılıp aktarılmadığı |
redirect_rules | object | Varsayılanlar doldurulmuş olarak platform başına hedef |
icon_url | string ya da null | Simgenin herkese açık adresi |
rating | object ya da null | Mağazadan gelen value ve count |
urls | object | Herkese açık adresler: smart_link, landing_page, qr_svg, qr_png, privacy_policy, terms. Yasal adresler, belge yayınlanana kadar 404 döndürür. |
links | object | Mağazaya göre mağaza bağlantıları; her biri url, status (unverified, verified ya da invalid) ve verified_at içerir. Tek bir uygulama döndüren yanıtlarda bulunur. |
screenshots | array | url, width ve height içeren ekran görüntüleri. Bilgi içe aktarımından sonra bulunur. |
created_at, updated_at | string | ISO 8601 zaman damgaları |
Bir uygulamayı getirme
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"
}
}
Uygulamaları listeleme
Çalışma alanındaki uygulamaları döndürür. Sonuçlar sayfalara bölünür: links.next değeri null olana kadar onu izle ya da ?page=2 gönder.
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
}
}
Bu örnekte uygulama nesneleri kısaltılmıştır. Her öğe tüm alanları içerir.
Uygulama oluşturma
| Alan | Zorunlu | Açıklama |
|---|---|---|
name | Evet | Uygulama adı, en fazla 120 karakter |
slug | Hayır | 3 ile 40 karakter arası küçük harf, rakam ve tek tire. Gönderilmezse addan boşta olan bir bağlantı adı oluşturulur. |
links | Hayır | Mağaza bağlantılarını ayarlama bölümündeki biçimde, mağazaya göre bağlantılar |
Uygulamayı güncelleme bölümünde listelenen alanları da gönderebilirsin.
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"
}
}'
Yanıt, yeni uygulama nesnesiyle birlikte 201 Created olur. Mağaza bağlantıları standart biçimde kaydedilir ve arka plan kontrolü bitene kadar durumları unverified olur. Simge, ekran görüntüleri ve açıklamayı doldurmak için ardından Mağaza bilgilerini içe aktarma uç noktasını çağır.
Uygulamayı güncelleme
Yalnızca değiştirmek istediğin alanları gönder.
| Alan | Tür |
|---|---|
name | string |
slug | string. Değiştirmek eski bağlantıyı hemen bozar. |
tagline, description | string ya da null |
category | kategori anahtarı ya da null |
page_theme | clean, midnight ya da vivid |
accent_color | #rrggbb ya da null |
utm_passthrough, listed_in_explore | boolean |
redirect_rules | platform anahtarından hedef anahtarına bir nesne |
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" }
}'
Yanıt, güncellenmiş uygulama nesnesidir.
Uygulamayı silme
curl https://mapps.one/api/v1/apps/01j8b2k6r3xq9v7m4n5p0s1t2w \
-X DELETE \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-H "Accept: application/json"
Yanıt 204 No Content olur. Silme işlemi kalıcıdır: uygulamanın akıllı bağlantısı, açılış sayfası, yasal belgeleri, medyası ve analitiği kaldırılır.
Mağaza bağlantılarını ayarlama
PUT /apps/{id}/links, mağazaya göre anahtarlanmış bir links nesnesi alır:
- bir URL, o mağazanın bağlantısını ekler ya da değiştirir,
nullya da boş bir metin bağlantıyı kaldırır,- göndermediğin mağazalar değişmez.
Her URL kendi mağazası için geçerli bir sayfa olmalıdır: uygulama kimliği içeren bir apps.apple.com bağlantısı, paket kimliği içeren bir play.google.com bağlantısı gibi. web bağlantısı herhangi bir http ya da https adresi olabilir. URL'ler en fazla 1024 karakter olabilir. Bağlantılar standart biçimde kaydedilir ve arka planda kontrol edilir.
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
}
}'
Yanıt, links dahil uygulama nesnesidir. Geçersiz bir bağlantı 422 döndürür:
{
"message": "This is not a valid Google Play link.",
"errors": {
"links.google_play": ["This is not a valid Google Play link."]
}
}
Mağaza bilgilerini içe aktarma
POST /apps/{id}/metadata, App Store sayfasını ya da okunabilir bir App Store bağlantısı yoksa Google Play sayfasını okur ve bilgilerini içe aktarır.
| Alan | Açıklama |
|---|---|
overwrite | İsteğe bağlı, varsayılan false. False olduğunda yalnızca boş alanlar doldurulur ve ekran görüntüleri sadece uygulamada hiç yoksa eklenir. True olduğunda ad, simge, metinler ve ekran görüntüleri değiştirilir. Puan ve fiyat her zaman güncellenir. |
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 }'
Yanıt, links ve screenshots dahil uygulama nesnesidir; ayrıca bir app.metadata_fetched webhook'u gönderilir. Hiçbir mağaza sayfası okunamazsa:
HTTP/2 422
{
"message": "The store listing could not be read. Add a valid App Store or Google Play link first.",
"code": "metadata_unavailable"
}
Analitik
GET /apps/{id}/analytics şu sorgu parametrelerini kabul eder:
| Parametre | Açıklama |
|---|---|
range | 7d, 30d, 90d, 12m ya da custom. Varsayılan 30d. |
from, to | range=custom için YYYY-MM-DD biçiminde, ikisi de dahil tarihler. to bugünden sonra olamaz. |
timezone | Gün sınırları için kullanılan, Europe/Istanbul gibi bir IANA saat dilimi. Varsayılan 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 }
}
}
}
fromdahildir,tohariçtir. İkisi de UTC anlarıdır.- İstenen aralık planın geçmişine göre kısaltıldıysa
clamped_to_plantrueolur. daily, tıklama olmayan günler dahil yerel tarih başına tıklamaları sayar.- Kırılımlar en sık görülenden başlayarak en fazla 10 değer listeler. Boş anahtar
""bilinmiyor ya da ayarlanmamış demektir. - Metriklerin tanımları Analitik sayfasında.
QR kod
GET /apps/{id}/qr bir görsel döndürür. format=svg (varsayılan) ya da format=png ile birlikte herkese açık QR adresleriyle aynı seçenekleri kullan: fg, bg, margin, ecc, size, logo ve download. Ayrıntılar QR kodlar ve basın kiti sayfasında.
curl "https://mapps.one/api/v1/apps/01j8b2k6r3xq9v7m4n5p0s1t2w/qr?format=png&size=2048&ecc=Q" \
-H "Authorization: Bearer $MAPPS_TOKEN" \
-o habitly-qr.png
Çalışma alanı
GET /workspace; çalışma alanını, plan sınırlarını ve özelliklerini, güncel kullanımı ve kullanılan token'ı döndürür. Bir token'ın çalıştığını kontrol etmek için iyi bir ilk çağrıdır.
{
"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 sınır, sınırsız demektir.
Olay türleri
GET /events, webhook olay türlerini kısa açıklamalarıyla listeler. Entegrasyonlar bunu bir olay seçici oluşturmak için kullanabilir. Açıklamalar İngilizce döner.
{
"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 abonelikleri
Webhook aboneliklerini koddan oluştur, örneğin bir kullanıcı entegrasyonunu bağladığında; bağlantıyı kestiğinde de sil. POST /webhooks şunları alır:
| Alan | Zorunlu | Açıklama |
|---|---|---|
url | Evet | Olayları alacak, herkese açık bir https adresi |
events | Evet | Olay türlerinden oluşan bir dizi ya da tüm olaylar için ["*"] |
description | Hayır | Panelde gösterilen, en fazla 160 karakterlik açıklama |
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"
}
}
İmzalama anahtarı secret yalnızca abonelik oluşturulurken döndürülür. Onu imzaları doğrulamak için kullan. Bir Studio çalışma alanında en fazla 10 webhook uç noktası olabilir. Bir aboneliği DELETE /webhooks/{id} ile sil; yanıt 204 No Content olur.
Örnek: CI'dan beta yayınlama
Bu betik bir uygulama oluşturur, Google Play bağlantısını ekler, mağaza sayfasını içe aktarır ve akıllı bağlantıyı yazdırır. curl, jq ve apps:write yetkili bir token gerekir.
#!/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'
Sürümler
Bu, API'nin 1. sürümüdür. İstediğimiz zaman yeni uç noktalar, alanlar ve olay türleri ekleyebiliriz; bu yüzden tanımadığın alanları yok say. Uyumluluğu bozan değişiklikler önceden duyurularak yeni bir sürüm olarak yayınlanır.