Başlangıç
Üç entegrasyon yüzeyi
Storefront REST
/cdn/v1/* Herkese açık, yayındaki mağaza
Katalog, kategori, koleksiyon ve agent feed okumaları.
Admin GraphQL
/graphql Bearer JWT + tenant
Mağaza yönetimi; write sandbox erişimi davetle açılır.
Webhook
Merchant HTTPS endpoint HMAC-SHA256 imza
Ürün, müşteri, stok ve operasyon olayları.
Kimlik doğrulama
Tenant her istekte açık olmalı
Paylaşılan API hostunda X-Tenant-Slug mağazayı seçer; erişim JWT’si
Authorization: Bearer ile gönderilir. Access token 15 dakika geçerlidir.
Refresh token yedi günlük oturuma bağlıdır ve yenilemede döndürülür. Üretim parolalarını
istemci koduna, mobil pakete veya Git deposuna koymayın.
curl --request POST \
'https://ticibu-api-staging.kolibu.workers.dev/auth/login' \
--header 'Content-Type: application/json' \
--header 'X-Tenant-Slug: YOUR_TENANT_SLUG' \
--data '{"email":"developer@example.com","password":"••••••••"}' curl --request POST \
'https://ticibu-api-staging.kolibu.workers.dev/graphql' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--header 'X-Tenant-Slug: YOUR_TENANT_SLUG' \
--header 'Content-Type: application/json' \
--data '{"query":"query { webhookEventCatalog { name category } }"}' Rate limit
Limiti yanıttan okuyun
Kotalı yüzeyler X-RateLimit-Limit ve X-RateLimit-Remaining
döndürür. 429 yanıtında Retry-After saniyesine uyun. Aşağıdaki değerler
bugün kodda uygulanan başlangıç bütçeleridir; sözleşmesel kapasite garantisi değildir.
| Yüzey | Bütçe | Kapsam |
|---|---|---|
| Admin oturum açma | 20 / 60 sn | tenant + rota |
| Agent catalog feed | 60 / 60 sn | tenant + çağıran IP |
| MCP catalog tools | 120 / 60 sn | tenant + çağıran IP |
| Operator / Growth Pulse | 30 / 60 sn | tenant + çağıran IP |
| Store Builder / migrations | 10 / 60 sn | tenant + çağıran IP |
Idempotency
Aynı niyet, aynı anahtar
Idempotency-Key başlığı sunmuyor. Yalnızca
şemasında açıkça idempotencyKey alanı bulunan marketplace operasyonu ve
sadakat mutasyonlarını güvenle aynı anahtarla tekrar gönderin.
- Anahtarı iş niyetinden üretin; ağ denemesi veya timestamp’ten üretmeyin.
- Aynı anahtarı farklı payload için yeniden kullanmayın.
- Diğer write mutasyonlarında belirsiz yanıttan sonra önce durumu okuyun; kör tekrar yapmayın.
Webhook
Ham gövdeyi imzadan önce değiştirmeyin
Ticibu JSON gövdesini HMAC-SHA256 ile imzalar. X-Ticibu-Signature değeri
sha256=<hex> biçimindedir; ayrıca X-Ticibu-Event ve tekrarlar
boyunca sabit kalan X-Ticibu-Delivery-Id gönderilir. Endpoint 10 saniye içinde
2xx dönmelidir. Teslimat en fazla beş kez denenir; tüketici delivery ID ile dedupe etmelidir.
Aşağıdaki liste bugün dispatcher’a bağlı, fiilen yayımlanan olaylardır.
const rawBody = await request.text()
const received = request.headers.get('X-Ticibu-Signature')
const expected = 'sha256=' + hmacSha256Hex(WEBHOOK_SECRET, rawBody)
if (!timingSafeEqual(received, expected)) {
return new Response('invalid signature', { status: 401 })
} PRODUCT_CREATEDPRODUCT_UPDATEDPRODUCT_DELETEDORDER_CREATEDORDER_UPDATEDORDER_CANCELLEDORDER_SHIPPEDORDER_DELIVEREDCUSTOMER_CREATEDCUSTOMER_UPDATEDCATEGORY_CREATEDCATEGORY_UPDATEDCART_ABANDONEDSTOCK_LOWINTEGRATION_FAILED Pagination
Sayfa numarası ve opaque cursor ayrıdır
Klasik katalog uçları page ve limit kullanır. Değişen kataloğu
ardışık okuyan agent feed, kayıp/tekrar riskini azaltmak için opaque keyset cursor döndürür.
Cursor’ı çözümlemeyin veya üretmeyin; nextCursor boşalana kadar aynen taşıyın.
GET /cdn/v1/products?page=1&limit=24
{
"products": [ ... ],
"pagination": {
"page": 1,
"limit": 24,
"total": 132,
"totalPages": 6
}
}
GET /cdn/v1/agent-feed.json?limit=100&cursor=OPAQUE_CURSOR Retry
Yalnız güvenli çağrıları otomatik tekrarlayın
Query/GET çağrılarında 429, 502, 503 ve 504 için jitter’lı exponential backoff uygulayın. 400/401/403/422 yanıtlarını tekrar etmeyin. Write çağrısını ancak mutasyon belgelenmiş bir idempotency anahtarı taşıyorsa otomatik tekrar edin.
async function ticibuRequest(url, init, attempt = 0) {
const response = await fetch(url, init)
if (![429, 502, 503, 504].includes(response.status) || attempt >= 4) return response
const retryAfter = Number(response.headers.get('Retry-After'))
const waitMs = Number.isFinite(retryAfter)
? retryAfter * 1000
: Math.min(1000 * 2 ** attempt + Math.random() * 250, 8000)
await new Promise(resolve => setTimeout(resolve, waitMs))
return ticibuRequest(url, init, attempt + 1)
} Sandbox fixtures
Gerçek müşteri verisi olmadan geliştirin
Aşağıdaki dosyalar sentetiktir ve sözleşme testi için sabit tutulur. Public katalog okumaları staging hostunda açıktır. Admin write sandbox tenant’ı ve kısa ömürlü giriş bilgileri yalnızca davet edilen entegrasyon ekibine güvenli kanaldan verilir; bu sayfada ortak parola yayınlanmaz. Fixture gövdeleri teslimatta gönderildiği haliyle verilir; event adı ve delivery ID HTTP header’larındadır.
Write sandbox erişimi gerekiyor mu?
Tenant, scope ve son kullanma tarihi birlikte tanımlanır.
App ve extension politikası
Önce izin sınırı, sonra SDK
Ticibu app platformu henüz self-service token veya mağaza kurulumu açmıyor. Hazır olan kısım; tenant sahipliği, granular scope sözlüğü, merchant grant sınırı, HTTPS redirect ve secret kurallarını machine-tested bir manifest politikasıyla sabitlemek. Write, müşteri verisi ve webhook erişimi insan güvenlik incelemesine gider.
| Sınıf | Scope | Kapı |
|---|---|---|
| Salt okunur | catalog:read · orders:read · themes:read · analytics:read | Otomatik baseline |
| Mutation | catalog:write · orders:write · fulfillment:write · themes:write | İnsan güvenlik incelemesi |
| Hassas/egress | customers:read · webhooks:manage | Amaç, saklama ve endpoint doğrulaması |
Uygulama kurulum/OAuth uçları açılana kadar bu bir yayınlanmış güvenlik sözleşmesidir; çalışan app marketplace iddiası değildir.