# MCP sunucusu

Formstep'i Claude, Cursor ve diğer MCP uyumlu araçlardan kullanın.

## MCP sunucusu

Model Context Protocol (MCP) sunucusu, AI ajanlarının Formstep formlarınızı zengin, şema tabanlı araçlarla okumasına ve düzenlemesine olanak tanır.

<h2 id="what">Nedir?</h2>
<p>
  MCP, AI araçlarının harici hizmetlere bağlanması için açık bir standarttır. Formstep, Claude Code, Claude desktop ve Cursor dahil olmak
  üzere her MCP uyumlu istemcinin bağlanabileceği barındırılan bir MCP uç noktası sunar.
</p>

<h2 id="connection">Bağlantı</h2>

```
URL:  https://api.formstep.io/api/mcp   (POST, streamable HTTP)
Auth: Bearer <token>
```

<p>İki tür bearer token çalışır:</p>
<ul>
  <li>
    <strong>API token</strong> (<code>fb_...</code>) — <a href="/tr/developers/api-tokens">API token’ları</a> sayfasından oluşturulur.
    Kişisel kullanım ve hızlı kurulum için en uygunudur.
  </li>
  <li>
    <strong>OAuth erişim token’ı</strong> (<code>fbo_...</code>) — <a href="#oauth">OAuth akışı</a> tarafından verilir. Bir kullanıcı adına
    bağlanan üçüncü taraf uygulamalar için en uygunudur.
  </li>
</ul>
<p>
  Her ikisi de tam olarak bir çalışma alanına bağlıdır ve aynı araçlara ulaşır. Başka bir çalışma alanını veya o çalışma alanındaki bir
  formu belirten bir araç çağrısı <code>FORBIDDEN</code> ile başarısız olur. OAuth token’ları ayrıca kapsam taşır (<code>mcp:read</code>,{' '}
  <code>mcp:write</code>, <code>offline_access</code>), ancak bugün hiçbir araç bunlara göre kısıtlanmaz — herhangi bir token’ı, çalışma
  alanı içinde tam erişim olarak değerlendirin.
</p>
<p>
  Araç çağrıları token başına dakikada 120 ile sınırlıdır ve bu sınır <a href="/tr/developers/rest-api">API</a> ile paylaşılır: yalnızca{' '}
  <code>tools/call</code> bu bütçeyi harcar, <code>initialize</code>, <code>tools/list</code>, <code>prompts/*</code> ve{' '}
  <code>resources/*</code> ücretsizdir. Bütçe aşıldığında çağrı yine de HTTP 200 döner, ancak başarısız bir araç sonucu{' '}
  <code>RATE_LIMITED</code> ve bir <code>retryAfterMs</code> taşır — döngü içinde değil, bir zamanlayıcıyla yoklayın.
</p>

> 💡 **Token nereden alınır?**
> <p>
>     API token’ları oluşturmak ve bağlı OAuth uygulamalarını görüntülemek için çalışma alanı kenar çubuğunuzdaki{' '}
>     <strong>OAuth ve API Anahtarları</strong> bölümünü açın. Adım adım kılavuz için <a href="/tr/developers/api-tokens">API token’ları</a>{' '}
>     sayfasına bakın.
>   </p>

<h2 id="core-tools">Temel araçlar</h2>
<p>
  Bir istemci bağlandığında <code>tools/list</code> üzerinde her araç tanıtılır. Claude Code gibi şemaları isteğe bağlı yükleyen istemciler,
  bir görev ihtiyaç duyduğunda bir aracın tam şemasını getirir. Aşağıdaki tablo çoğu görevin başladığı temel araçları kapsar;{' '}
  <code>load_tools</code> (kataloglar) ile <code>load_skill</code> (alan kılavuzları) geri kalanını belgeler.
</p>

<p>
  Daha fazla ekleme çeşidi — saat, dosya yükleme, imza, ödeme, matris/ızgara, sıralama, resim seçimi, açma/kapama düğmesi, tablo, liste,
  satır, hesaplanmış alan, gizli alan, satır içi değişken, gömülü içerik (YouTube, Google Maps veya iframe gömmek için{' '}
  <code>editor_insertEmbedded</code>) ve koşullu mantık bloğu (<code>editor_insertLogic</code>) — bunlar da <code>tools/list</code>{' '}
  üzerindedir. Araç adı ve alanlarıyla birlikte tam set için <code>load_skill("question-types")</code> yükleyin. Koşullu mantık,{' '}
  <a href="#tool-catalogs">editor-actions</a> kataloğundaki <code>editor_setLogic</code> ile oluşturulur.
</p>

<h2 id="tool-catalogs">Araç katalogları</h2>
<p>
  Bu araçlar da <code>tools/list</code> üzerindedir. Gruplandırılmış araçlar için zenginleştirilmiş belgeler (giriş, tam şemalar, kullanım
  kalıpları, uç durumlar) almak üzere bir katalog adıyla <code>load_tools</code> çalıştırın, ardından doğrudan çağırın.
</p>

<p>
  <code>request-lifecycle</code> kataloğu sekiz istek aracının tamamını listeler çünkü uygulama içi sohbet daha küçük bir temel set tanıtır.
  Bu uç noktada sekizi de zaten <code>tools/list</code> üzerindedir, bu yüzden kataloğun eklediği şey belgelerdir.
</p>

<h2 id="skills">Beceriler (etki alanı bilgisi)</h2>
<p>
  Beceriler, ajanın <code>load_skill</code> aracılığıyla yükleyebileceği yerleşik kılavuzlardır. Ajanın daha iyi kararlar almasına yardımcı
  olan etki alanı bilgisi sağlarlar — araç şemaları değil, tasarım tavsiyeleri ve alan anlamları.
</p>

<h2 id="requests">İstekler</h2>

<p>
  Bir <a href="/tr/requests/overview">istek</a>, yayınlanmış bir formu tek bir adlandırılmış alıcıya atar; kendi bağlantısı, kendi önceden
  doldurulmuş yanıtları ve kendi sonucuyla. Bir ajanın gerçek bir kişiden bir şey istemesinin ve ne söylediğini öğrenmesinin yoludur.
</p>

<h3 id="requests-create">Bir istek oluşturmak</h3>

<p>
  Her zaman <code>fields_list(formId)</code> ile başlayın. Formun geçerli yayınlanmış sürümünün adreslenebilir anahtarlarını, anahtarın
  hangi argümana ait olduğunu belirten bir <code>usage</code> satırıyla birlikte döndürür — görünür sorular <code>prefill</code> içine,
  gizli alanlar <code>context</code> içine gider. Bir anahtarı asla bir soru başlığından türetmeyin ve <code>form_publish</code>’ten sonra
  yeniden okuyun.
</p>

```
{
  "formId": "j57...",
  "recipient": { "email": "ada@acme.com", "name": "Ada" },
  "prefill": { "company_name": "Acme", "plan": "pro" },
  "readonly": ["company_name"],
  "context": { "crm_id": "A-42" },
  "metadata": { "run_id": "exec_918" },
  "delivery": "email",
  "expiresAt": 1780000000000,
  "callbackUrl": "https://hooks.acme.com/formstep",
  "idempotencyKey": "po-42"
}
```

<p>Sonuç, bağlantıyı ve saati taşır:</p>

```
{
  "id": "kd7...",
  "status": "pending",
  "url": "https://form.formstep.io/r/rq_...",
  "deliveryStatus": "queued",
  "expiresAt": 1780000000000,
  "createdAt": 1747000000000,
  "deduplicated": false,
  "next": "..."
}
```

<p>
  <code>delivery</code> varsayılan olarak <code>"none"</code>’dur, bu da <code>url</code>’yi kendinizin teslim etmesi gerektiği anlamına
  gelir; <code>"email"</code> daveti gönderir ve Pro veya Business planda ya da Ücretsiz bir hesabın 10 ücretsiz davetinden birinde{' '}
  <code>recipient.email</code> gerektirir. <code>readonly</code>, alıcının düzenleyemeyeceği alanları kilitler ve kilitli her anahtar aynı
  zamanda önceden doldurulmuş olmalıdır. <code>context</code> yalnızca gizli alan anahtarlarını kabul eder, <code>metadata</code> ise{' '}
  <code>request_get</code>’te ve geri çağırmada olduğu gibi geri döndürülen opak bir kayıt bilgisidir. <code>expiresAt</code> epoch
  milisaniye cinsindendir, varsayılan 30 gün ve azami 365 gündür. <code>idempotencyKey</code> 30 gün boyunca çalışma alanı kapsamlıdır: aynı
  gövdeyle aynı anahtar, <code>deduplicated: true</code> ile birlikte orijinal isteği döndürür, farklı bir gövde ise çakışma sayılır. Her
  yanıt ayrıca ajana buradan sonra ne yapması gerektiğini söyleyen bir <code>next</code> satırı taşır.
</p>
<p>
  <code>deliveryStatus</code>, bir davet sıraya alınana kadar <code>not_requested</code>’dır, ardından <code>queued</code> →{' '}
  <code>sent</code> veya <code>failed</code> olur ve posta sağlayıcısı sert bir geri dönüşü (bounce) ya da şikayeti bildirdiğinde{' '}
  <code>bounced</code> olur. Bir istek oluşturmak, alıcı hiç yanıt vermese bile çalışma alanının aylık ödeneğinden bir birim harcar; bu
  ödenek tükendiğinde <code>request_create</code>, <code>MONTHLY_ALLOWANCE_REACHED</code> ile başarısız olur.
</p>

<h3 id="requests-callbacks">Geri çağırmalar veya yoklama</h3>

<p>
  Bir <code>callbackUrl</code> ile, Formstep her nihai olayda bir kez POST gönderir — tamamlanma, süre dolumu, iptal — çalışma alanının
  istek imzalama sırrıyla imzalanmış olarak. Yük (payload) ve doğrulama tarifi için{' '}
  <a href="/tr/requests/callbacks">Geri çağırmalar ve imzalama</a> sayfasına bakın.
</p>

> ℹ️ **Otonom ajanlar yoklama yapmalı**
> <p>
>     İstek imzalama sırrı yalnızca çalışma alanınızdaki Credentials sayfasında görünür — MCP veya API üzerinden asla döndürülmez. Bir alıcı
>     kurup yapılandıracak bir insan olmadan kendi başına çalışan bir ajan, bu nedenle bir geri çağırmayı doğrulayamaz.{' '}
>     <code>callbackUrl</code>’yi boş bırakın ve bunun yerine <code>status</code>, <code>"pending"</code> olmaktan çıkana kadar saniyeler
>     yerine dakikalar mertebesinde <code>request_get(requestId)</code> ile yoklama yapın. <code>expiresAt</code>, bunun ne kadar süre değerli
>     olduğunu sınırlar.
>   </p>

<h3 id="requests-test-mode">Test modu</h3>

<p>
  Gerçek bir çalıştırmadan önce tüm yapıyı denemek için <code>test: true</code> geçirin. Bağlantı yine açılır ve tamamlanabilir, geri
  çağırma <code>"test": true</code> ile tetiklenir — ama <code>delivery</code> ne derse desin hiçbir şey e-postayla gönderilmez, istek
  İstekler sayfasından ve analiz hunisinden gizli kalır ve gönderimi hiçbir yerde sayılmaz: kota yok, dışa aktarım yok, entegrasyon yok.
  Test istekleri yalnızca <code>includeTest: true</code> geçirdiğinizde <code>request_list</code>’te görünür. Bağlantı 24 saat içinde
  kapanır ve Free'de bir workspace günde 10 test isteği oluşturabilir.
</p>

<h3 id="requests-documents">İstek başına belgeler</h3>

<p>
  Bir alıcıya dosya vermek için — bir sözleşme taslağı, kendi teklifi — formun bir <strong>Belgeler bloğuna</strong> ihtiyacı vardır; bunu
  bir yazar veya bir ajan <code>editor_insertDocumentsBlock</code> ile ekler. <code>fields_list</code> bunu <code>type: "documents"</code>{' '}
  olarak bildirir. Baytlar hiçbir zaman bir araçtan geçmez:
</p>

<ol>
  <li>
    <code>formId</code>, <code>name</code>, <code>contentType</code> ve bayt cinsinden tam <code>size</code> ile{' '}
    <code>document_create</code> çağırın. <code>{'{ id, name, contentType, size, uploadUrl, expiresAt }'}</code> geri alırsınız. Yalnızca
    PDF ve görseller (Office belgeleri olmaz), dosya başına 25 MB ve istek başına 100 MB belge.
  </li>
  <li>
    Ham baytları, bir saat içinde, beyan ettiğiniz türe ayarlanmış <code>Content-Type</code> ile <code>uploadUrl</code>’e <code>PUT</code>{' '}
    edin.
  </li>
  <li>
    Bunu <code>request_create</code>’ten referans verin: <code>documents: [{'{ documentId, field?, name? }'}]</code>. <code>field</code>,
    Belgeler bloğunun alan anahtarıdır; yalnızca formda tam olarak bir böyle blok varsa isteğe bağlıdır. <code>name</code> bu istek için
    görünen adı geçersiz kılar.
  </li>
</ol>

<p>
  Bloğun hazırlanmış belgeleri yerinde kalır ve sizinkiler bunların altında görünür, yalnızca bu alıcı için. <code>request_create</code>,
  istek var olmadan önce yüklemeyi doğrular, bu yüzden <code>DOCUMENT_NOT_UPLOADED</code>, 2. adımın atlandığı anlamına gelir. Bir yükleme,
  istediğiniz kadar istek tarafından referans verilebilir ve baytları çalışma alanı depolamanıza sayılır.
</p>

<h3 id="requests-domains">Özel alan adları</h3>

<p>
  Bağlantıyı çalışma alanının <a href="/tr/branding-domains/custom-domains">özel alan adlarından</a> birinde oluşturmak için{' '}
  <code>request_create</code>’e <code>domainId</code> geçirin. Kimlikler, bunları <code>availableCustomDomains</code> olarak döndüren{' '}
  <code>formShareLink_list</code>’ten gelir. Atlarsanız, bağlantı formun zaten yayınlandığı alan adını alır.
</p>

<h3 id="requests-reading">Sonuçları okumak</h3>

<p>
  <code>request_get</code> isteğin tamamını döndürür. Tamamlandıktan sonra <code>answers</code>, alıcının değerlerini alan anahtarına göre
  anahtarlanmış olarak tutar, <code>display</code> aynı anahtarları okunabilir metin olarak taşır ve <code>outcome</code> — approve, decline
  veya changes — form bir <a href="/tr/requests/overview">karar sorusu</a> içeriyorsa alıcının kararıdır. Bir <code>callbackFailedAt</code>{' '}
  zaman damgası, teslimatın yeniden deneme hakkının tükendiği ve uç noktanıza hiçbir şeyin ulaşmadığı anlamına gelir; alıcıyı düzeltin,
  ardından orijinal olay kimliğini yeniden gönderen <code>request_replayCallback</code>’i çağırın, böylece alıcınız yeniden çalıştırmak
  yerine tekilleştirme (dedupe) yapar. Formun saklama politikası bir isteği temizledikten sonra <code>dataPurgedAt</code> ayarlanır ve
  yanıtlar sonsuza dek kaybolur.
</p>

<p>
  <code>request_list</code>, <code>status</code>, <code>outcome</code>, <code>externalId</code> ve <code>includeTest</code>’e göre
  filtrelenmiş şekilde birçoğunu tek seferde tarar. <code>nextCursor</code> ile sayfalandırın: bir sayfa nadiren boş bir <code>items</code>{' '}
  ve <code>hasMore: true</code> ile dönebilir, bu listenin sonu değildir — imleci geri gönderin ve devam edin.
</p>

<h2 id="resources">Kaynaklar ve promptlar</h2>
<p>
  Her beceri ve araç kataloğu aynı zamanda <code>skill://&lt;name&gt;</code> adresinde bir MCP kaynağıdır — <code>skill://requests</code>,{' '}
  <code>skill://editor-inserts</code>. <code>resources/list</code>'i destekleyen bir istemci, <code>load_skill</code> veya{' '}
  <code>load_tools</code> çağırmadan bunlara göz atabilir ve okuyabilir. Sunucu ayrıca <code>prompts/list</code> üzerinde dört prompt sunar:{' '}
  <code>identity</code>, <code>capabilities</code>, <code>data_tools</code> ve <code>editor_tools</code>.
</p>

<h2 id="confirmation">Önce onay isteyen araçlar</h2>
<p>
  Her araç, fiiline göre türetilen <code>readOnlyHint</code> ve <code>destructiveHint</code> MCP ipuçlarını taşır. Şu araçlar yıkıcı
  (destructive) olarak işaretlenmiştir, çünkü geri almak başka bir çağrı gerektirir ya da mümkün değildir: <code>form_delete</code>,{' '}
  <code>form_unpublish</code>, <code>workspaceFolder_delete</code>, <code>editor_deleteElement</code>,{' '}
  <code>translationLanguage_delete</code> ve <code>request_cancel</code>. Çoğu istemci bunları çalıştırmadan önce kullanıcıya sorar, ancak
  bu istem istemcinin kararıdır; kesin bir durdurma istiyorsanız istemcinin onay ayarlarını kontrol edin.
</p>

<h2 id="limitations">Sınırlamalar</h2>
<ul>
  <li>
    <strong>Bir araç çağrısı üzerinden ikili (binary) yükleme yok.</strong> Resimler URL ile ayarlanır: kapaklar, logolar ve resim blokları{' '}
    <code>http(s)://</code> veya <code>data:image</code> URI’lerini kabul eder. İstek başına bir belge bunun istisnasıdır:{' '}
    <code>document_create</code>, HTTP erişimi olan bir istemcinin dosyayı <code>PUT</code> edebileceği bir yükleme URL’si döndürür (bkz.{' '}
    <a href="#requests-documents">İstek başına belgeler</a>). Bir PDF’yi veya ekran görüntüsünü forma dönüştürmek için{' '}
    <a href="/tr/ai/ai-form-generation#files">yerleşik AI sohbetini</a> kullanın.
  </li>
  <li>
    <strong>Çalışma alanı AI Becerileri yok.</strong> <a href="/tr/ai/ai-skills">Formstep’te yazılan beceriler</a> yalnızca yerleşik AI
    sohbetinde kullanılabilir. Sunucunun kendi becerileri (<code>load_skill</code>) MCP üzerinden kullanılabilir.
  </li>
</ul>

<h2 id="api-token-clients">API token’ı ile bağlanma</h2>
<p>
  Çoğu istemci OAuth ile oturum açar: başlık eklemeden URL’yi ekleyin ve <a href="/tr/guides/ai-agents/connect">AI ajanı bağlama</a>{' '}
  kılavuzunu izleyin. Bir tarayıcı açamayan istemciler — bir betik, CI görevi veya başsız (headless) bir ajan gibi — bunun yerine bir{' '}
  <a href="/tr/developers/api-tokens">API token’ını</a> başlık olarak gönderir.
</p>
<p>Komut satırından Claude Code:</p>

```
claude mcp add --transport http formstep https://api.formstep.io/api/mcp \
  --header "Authorization: Bearer fb_YOUR_TOKEN"
```

<p>
  Ya da bir projenin <code>.mcp.json</code> dosyasında:
</p>

```
{
  "mcpServers": {
    "formstep": {
      "type": "http",
      "url": "https://api.formstep.io/api/mcp",
      "headers": {
        "Authorization": "Bearer fb_YOUR_TOKEN"
      }
    }
  }
}
```

<p>
  Cursor, <code>.cursor/mcp.json</code> veya <code>~/.cursor/mcp.json</code> içinde:
</p>

```
{
  "mcpServers": {
    "formstep": {
      "url": "https://api.formstep.io/api/mcp",
      "headers": {
        "Authorization": "Bearer fb_YOUR_TOKEN"
      }
    }
  }
}
```

<p>
  Bir token yerine OAuth ile oturum açmak için{' '}
  <a href="https://cursor.com/install-mcp?name=formstep&config=eyJ1cmwiOiJodHRwczovL2FwaS5mb3Jtc3RlcC5pby9hcGkvbWNwIn0=">Cursor’a ekle</a>{' '}
  bağlantısını kullanın. Sunucu URL’sini başlıksız ekler ve Cursor sizden Formstep’te oturum açmanızı ister.
</p>
<p>Diğer istemciler aynı URL ve başlığı kullanır; nereye ekleyeceğinizi kendi belgelerinden kontrol edin.</p>

<h2 id="oauth">API token’ları yerine OAuth kullanmak</h2>
<p>
  Bir kullanıcı adına bağlanan üçüncü taraf bir uygulama, yapıştırılmış bir token istemek yerine OAuth kullanmalıdır. Formstep, zorunlu PKCE
  (S256) ve opak token’lara sahip bir OAuth 2.1 yetkilendirme sunucusudur — JWT yok, örtük (implicit) izin akışı yok. Claude desktop, Claude
  Code ve Claude.ai web bağlayıcısı bunların tümünü MCP uç noktasından keşfeder, bu yüzden başlıksız yalnızca URL’yi yapıştırmak yeterlidir:
  401 yanıtı <code>/.well-known/oauth-protected-resource</code> adresine işaret eder ve istemci oradan devam eder.
</p>
<p>Kendi yazdığınız bir istemci için akış:</p>
<ol>
  <li>
    Uç nokta URL’leri, kapsamlar ve desteklenen kimlik doğrulama yöntemleri için önce <code>GET /.well-known/oauth-protected-resource</code>{' '}
    ve ardından <code>GET /.well-known/oauth-authorization-server</code>.
  </li>
  <li>
    <code>redirect_uris</code>’inizle <code>POST /oauth/register</code> (dinamik istemci kaydı, kimlik bilgisi gerekmez). Bir{' '}
    <code>client_id</code> ve, <code>token_endpoint_auth_method: "none"</code> dışında bir şey istediyseniz bir <code>client_secret</code>{' '}
    alırsınız. Yönlendirme URI’leri HTTPS olmalı, ya da <code>localhost</code> üzerinde HTTP olabilir. Kayıt, IP başına saatte 20 ile
    sınırlıdır.
  </li>
  <li>
    Kullanıcıyı <code>response_type=code</code>, <code>client_id</code>’niz, kayıtlı <code>redirect_uri</code>,{' '}
    <code>scope=mcp:read mcp:write offline_access</code>, <code>state</code> ve <code>code_challenge_method=S256</code> ile bir{' '}
    <code>code_challenge</code> parametreleriyle <code>/oauth/authorize</code>’a gönderin. Kullanıcı oturum açar, bir çalışma alanı seçer ve
    yetkilendirir.
  </li>
  <li>
    Kodu, 60 saniye içinde <code>grant_type=authorization_code</code> ve <code>code_verifier</code>’ınızla <code>POST /oauth/token</code>’da
    değiştirin. Kodlar tek kullanımlıktır.
  </li>
  <li>
    MCP uç noktasını <code>Authorization: Bearer fbo_...</code> ile çağırın. Erişim token’ları 1 saat sürer; yenileme token’ları 30 gün
    sürer ve her kullanımda döner. Harcanmış bir yenileme token’ını yeniden kullanmak tüm zinciri geçersiz kılar, bu yüzden en yenisini
    saklayın.
  </li>
</ol>
<p>
  <code>POST /oauth/revoke</code> (RFC 7009) bir erişim veya yenileme token’ını iptal eder. Bir kullanıcı, OAuth ve API Anahtarları
  sayfasındaki <strong>Bağlı uygulamalar</strong> bölümünden uygulamanın tamamının bağlantısını da kesebilir; bu, uygulamanın o çalışma
  alanı için tuttuğu her token’ı öldürür.
</p>

<p>Elinizde zaten bir token varsa, onu bir API anahtarıyla aynı yere koyarsınız:</p>

```
{
  "mcpServers": {
    "formstep": {
      "type": "http",
      "url": "https://api.formstep.io/api/mcp",
      "headers": {
        "Authorization": "Bearer fbo_USER_OAUTH_TOKEN"
      }
    }
  }
}
```

<h3 id="connected-apps">Bağlı uygulamalar</h3>
<p>
  Her OAuth bağlantısı, <strong>OAuth ve API Anahtarları</strong> sayfasındaki <strong>Bağlı uygulamalar</strong> altında, ne zaman
  bağlandığı ve son ne zaman kullanıldığı bilgisiyle birlikte listelenir. Bağlantılar kişiseldir: yalnızca onu yetkilendiren kullanıcı
  görür, çalışma alanı yöneticileri başka bir üyenin bağlantısını görüntüleyemez veya iptal edemez. Bağlantıyı kesmek anında etkili olur.
  Çalışma alanından ayrılan veya çıkarılan bir kullanıcı, o çalışma alanına ait tüm bağlantılarını kaybeder.
</p>

<h2 id="next-steps">Sonraki adımlar</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [AI ajanı bağlama](/tr/guides/ai-agents/connect) — Herhangi bir MCP istemcisinde adım adım kurulum
  - [Webhook referansı](/tr/developers/webhooks-reference) — Payload şeması ve imzalama
  - [REST API](/tr/developers/rest-api) — Programatik erişim için API yöntemleri
  - [Planlar ve fiyatlandırma](/tr/subscription-billing/plans-pricing) — Plan API erişimini ve limitlerini karşılaştırın
</div>
