İş ortağı yüzeyi sözleşmesi Bağlanma PA-22
Hukuki metin sürümleri
GET/api/partner/v1/legal-documents
> Künye: TASK-312; REQ-022, DEC-251, DEC-266.
Amaç
İş ortağının son kullanıcıya kendi arayüzünde göstereceği hukuki metinlerin yayımdaki sürümünü, dondurulmuş adresini ve içerik özetini vermek (DEC-251'in birinci kanalı). Salt-okuma, yan etkisiz.
Yetki
İki kademeli kimlik: X-App-Key (hangi iş ortağı) + Authorization: Bearer (hangi hesap adına). Hesap anahtarı partner-api yeteneği taşır ve tek başına /api/v1e giremez; cookie oturumu bu yüzeye giremez.
Başarı 200
data[]; her metin için version + content_sha256 çifti. Hesap açma (PA-23) bu çifti geri gönderir ve güncel yayımla birebir eşleşmezse istek reddedilir.
Hatalar
503 - metinler yayımda değilken uç hiçbir şey açmaz ve makine-okur sebep döner (DEC-266); 404, 422; ayrıca 401 (uygulama ya da hesap anahtarı yok / tanınmıyor / iptal / süresi dolmuş - dört neden tek gövdeye düşer ve ayırt edilemez), 403 (iş ortağı askıda ya da hesap anahtarının kökeni sunulan uygulama anahtarıyla eşleşmiyor), 429 (oran limiti, Retry-After).
Idempotency-Key
sözleşmesi yoktur (salt-okuma).
DEC-251'in birinci kanalı. Gömülü akışta son kullanıcı sevkora.com'a hiç uğramaz; iş ortağı hukuki metni kullanıcıya kendi arayüzünde gösterir. Bu uç, o gösterimi Sevkora'nın yayımladığı sürüme çıpalar: iş ortağı eski ya da uydurma metin gösteremez, çünkü hesap açma isteği (TASK-313) buradan aldığı version + content_sha256 çiftini geri gönderir ve güncel yayımla birebir eşleşmezse 422 ile reddedilir.
Salt-okuma ve yan etkisiz (CQS); Idempotency-Key sözleşmesi yoktur.
{
"data": [
{
"key": "kullanici-sozlesmesi",
"title": "Sevkora Kullanıcı Sözleşmesi",
"version": "1.1",
"url": "https://.../sozlesmeler/kullanici-sozlesmesi/v/1.1",
"content_sha256": "...64 hex...",
"published_at": "2026-08-20",
"audience": "tenant",
"requires_acceptance": true
}
],
"meta": { "sample": false }
}
Yanıt yalnız güncel sürümleri listeler; eski sürümler kendi kalıcı adreslerinden okunmaya devam eder.
meta.sample her zaman bulunur ve üretimde falsetur (TASK-337, DEC-270). true olduğunda dönen metinler bir ÖRNEK (UAT) manifestinden gelir ve hukuken geçersizdir: şirket kimlik alanları görünür biçimde doldurulmuştur. Alanın koşullu olmaması bilinçlidir - koşullu bir alan, "yok" ile "false" arasındaki farkı çağırana yükler ve bir gün sessizce kaybolabilirdi
`url` DONDURULMUŞ sürüm adresidir, güncel adres değil
Fark taşıyıcıdır: iş ortağı bu adresi kullanıcıya gösterdiği metnin yanına koyar ve o adresin döndürdüğü baytlar, kabul beyanındaki content_sha256 ile aynı kalır. Güncel adres (/sozlesmeler/{key}) yarın başka bir sürüme çözülebilir ve kabulün delil değerini kırardı. Seçim koda bağlıdır
Özet burada yeniden HESAPLANMAZ, manifestten OKUNUR
content_sha256in tek hesaplama noktası manifest üreticisidir; ikinci bir nokta açılsaydı iki nokta zamanla ayrışır ve o özete çıpalanmış geçmiş kabul kayıtları sessizce doğrulanamaz hâle gelirdi
Tekliğin kendisi de sayılır, çünkü "tek hesaplama noktası" cümlesinin yükü tam olarak o sayıdadır: ikinci bir nokta açılırsa çıpa kırılır ve bu bölüm tazelenmek zorunda kalır
Yanıt açık beyaz listedir: manifestin path (iç dosya yolu) ve bytes alanları gövdeye girmez.
Metinler yayımda değilken: 503 (DEC-266)
| Kod | Ne zaman | Gövde |
|---|---|---|
| 503 | hukuki metinler yayımda değil | {"message":"...","code":"legal_documents_unpublished"} |
code ortak hata zarfına ek bir alandır (message her hatada olduğu gibi durur) ve bir tel sözleşmesidir - iş ortağı entegrasyonları bu dizgeye bakar
HANGİ YANITI ALDIĞINIZ ORTAMA GÖRE DEĞİŞİR ve bunu yanıtın kendisinden okursunuz
Üretimde hukuki metinler henüz yayımda değildir ve uç orada 503 döner; test ortamında ÖRNEK manifest yayımdadır ve uç 200 döner. Hangi ortamda olduğunuzu tahmin etmeyin: 503 gövdesindeki code ile 200 gövdesindeki meta.sample bu ayrımı zaten taşır ve ikisi de bu sayfada tanımlıdır.
Üretimde yayımın önünde duran şey bir eksiklik değil bir fail-closed kapıdır: şirket kimlik alanları doldurulmadan hiçbir metin yayımlanmaz (DEC-252, RISK-082/083). Bu cümle kendi kendine çürüyecek türdendir, o yüzden sebebi mekanik olarak bağlıdır: alanlar doldurulduğu an aşağıdaki çıpa kırılır ve bu bölüm tazelenmek zorunda kalır
Neden 404 değil: DEC-255 aynı soruyu /sozlesmeler için 404 diye cevapladı, ama o gerekçe anonim ziyaretçiye aitti - yayımlanmamış bir hukuki yüzeyin varlığı dışarıya duyurulmaz. Burada çağıran, Sevkora admin'inin kendi eliyle ürettiği X-App-Key ile gelir ve yüzeyin varlığını zaten bilir; ona 404 dönmek kimseden bir şey gizlemez, yalnızca "uç yok / URL yanlış" ile ayırt edilemez bir yanıt üretir. Boş liste de dönmez: documents() === [] ile "yayımda değil" aynı cümle değildir (manifest sözleşmesi).