# API metodları

Her REST API metodunun parametreler, örnekler ve yanıtlarla birlikte tam referansı.

## API metodları

Formstep REST API tarafından sunulan her metodun tam referansı. Her metod, parametrelerini, örnek istekleri ve yanıt yapılarını gösterir.

> ℹ️ **Tek uç nokta, çok sayıda metod**
> <p>
>     Her metod, <code>{`{"method": "...", "params": {...}}`}</code> JSON gövdesiyle ve bir <code>Authorization: Bearer fb_...</code>{' '}
>     başlığıyla <code>POST https://api.formstep.io/api/v1</code> adresine gönderilir. Kimlik doğrulama ve hata yönetimi için{' '}
>     <a href="/tr/developers/overview">API genel bakış</a> sayfasına, token’ın kendisi için de{' '}
>     <a href="/tr/developers/api-tokens">API token’ları</a> sayfasına bakın.
>   </p>

<h2 id="conventions">Kurallar</h2>

<ul>
  <li>
    <code>params</code> atlanabilir; varsayılanı <code>{`{}`}</code> olur. Bilinmeyen bir metod <code>404 METHOD_NOT_FOUND</code> döner.
  </li>
  <li>
    Bir token <strong>tek bir çalışma alanına</strong> bağlıdır. Başka bir çalışma alanını, ya da içindeki bir formu adlandırmak, ikisine de
    üye olsanız bile <code>403 FORBIDDEN</code> döner.
  </li>
  <li>
    <strong>Sayfalama.</strong> Liste metodları <code>{`{ items, nextCursor, hasMore }`}</code> döner; çoğu ayrıca <code>canPaginate</code>{' '}
    döner; bu, <code>hasMore</code> true olduğu halde devam ettirecek bir imleç bulunamadığında (bulanık arama) <code>false</code> olur.{' '}
    <code>nextCursor</code>’ı <code>cursor</code> olarak geri gönderin. <code>limit</code> 1–100 arasıdır, varsayılanı 20’dir —{' '}
    <code>requests.list</code> hariç, onun varsayılanı 25’tir.
  </li>
  <li>
    <strong>Hız sınırları.</strong> Token başına dakikada 120 çağrı, <a href="/tr/developers/mcp-server">MCP sunucusu</a> ile paylaşılır;{' '}
    <code>requests.create</code>’in kendi sınırı dakikada 60’tır. Başarısız kimlik doğrulama ayrıca sınırlandırılır, IP başına 15 dakikada
    30; bu sınır aşıldığında kötü token’lar <code>UNAUTHORIZED</code> yerine <code>RATE_LIMITED</code> görür.
  </li>
  <li>
    <strong>Gövde boyutu.</strong> 1 MiB. Daha büyük gövdeler <code>VALIDATION_ERROR</code> ile reddedilir.
  </li>
  <li>
    <strong>Sürümleme.</strong> Sürümü yol taşır. Kırıcı değişiklikler <code>/api/v2</code> olarak yayınlanır; yeni metodlar ve yeni yanıt
    alanları öyle değildir.
  </li>
</ul>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="forms">Formlar</h2>

{/* ── forms.list ──────────────────────────────────────────────────────────── */}

Bir çalışma alanındaki formları listeler. İmleç tabanlı sayfalama ve isteğe bağlı bulanık ad aramasını destekler.

  
    Çalışma alanı kimliği.
  
  
    Klasöre göre filtrele. Yalnızca kök düzeyindeki formlar için <code>null</code> gönder. Tamamını listelemek için belirtme.
  
  
    Bulanık ad araması. Sonuçlar <code>limit</code> değeriyle sınırlandırılır; imleç tabanlı sayfalama uygulanmaz.
  
  
    Sayfa boyutu (1–100).
  
  
    Önceki yanıttan gelen sayfalama imleci.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.list",
    "params": { "workspaceId": "ws_abc123" }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "frm_abc123",
        "name": "Contact Form",
        "folderId": null,
        "workspaceId": "ws_abc123",
        "isPublished": true,
        "publishedAt": 1714041851000,
        "unpublishedAt": null,
        "createdAt": 1714041800000,
        "lastEditedAt": 1714042000000,
        "emoji": null
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── forms.get ───────────────────────────────────────────────────────────── */}

Tek bir form için sorular, kapak, logo ve önizleme URL’si dahil tüm ayrıntıları getirir.

  
    Form kimliği.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.get",
    "params": { "formId": "frm_abc123" }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "id": "frm_abc123",
    "name": "Event Feedback",
    "folderId": null,
    "workspaceId": "ws_abc123",
    "isPublished": true,
    "publishedAt": 1714041851000,
    "unpublishedAt": null,
    "createdAt": 1714041800000,
    "lastEditedAt": 1714042000000,
    "emoji": null,
    "questions": [
      {
        "id": "q_1",
        "type": "email-input",
        "inputType": "email",
        "title": "Your email",
        "metadata": null
      },
      {
        "id": "q_2",
        "type": "rating-input",
        "inputType": "rating",
        "title": "Overall experience",
        "metadata": { "kind": "rating", "maxStars": 5 }
      }
    ],
    "hasContent": true,
    "cover": null,
    "logo": null,
    "isDeleted": false,
    "trashedAt": null,
    "previewUrl": "https://formstep.io/preview/abc..."
  }
}
```

  

{/* ── forms.create ────────────────────────────────────────────────────────── */}

Yeni bir boş form oluşturur. Formu ve bir önizleme URL’sini döndürür.

  
    Form adı (1–255 karakter).
  
  
    Çalışma alanı kimliği.
  
  
    Formu bir klasöre yerleştir. Çalışma alanı kökünde oluşturmak için belirtme.
  

  
    
      
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.create",
    "params": {
      "name": "Contact",
      "workspaceId": "ws_abc123"
    }
  }'
```

    
    
      
```
const res = await fetch('https://api.formstep.io/api/v1', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.FORMSTEP_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    method: 'forms.create',
    params: { name: 'Contact', workspaceId: 'ws_abc123' },
  }),
})
const { ok, data } = await res.json()
```

    
    
      
```
import os, requests
res = requests.post(
  "https://api.formstep.io/api/v1",
  headers={"Authorization": f"Bearer {os.environ['FORMSTEP_TOKEN']}"},
  json={
    "method": "forms.create",
    "params": {
      "name": "Contact",
      "workspaceId": "ws_abc123",
    },
  },
)
data = res.json()
```

    

  

  
    
```
{
  "ok": true,
  "data": {
    "id": "frm_new123",
    "name": "Contact",
    "workspaceId": "ws_abc123",
    "folderId": null,
    "isPublished": false,
    "createdAt": 1714041851000,
    "previewUrl": "https://formstep.io/preview/abc..."
  }
}
```

  

{/* ── forms.update ────────────────────────────────────────────────────────── */}

Form meta verilerini günceller: ad, klasör, emoji, kapak veya logo. Form içeriğini güncellemez (bunun için editör araçlarını kullanın).

  
    Form kimliği.
  
  
    Yeni form adı (1–255 karakter).
  
  
    Formu bir klasöre taşı. Çalışma alanı köküne taşımak için <code>null</code> gönder.
  
  
    Form emojisi (en fazla 10 karakter). Temizlemek için <code>null</code> gönder.
  
  
    Kapak. <code>{`{"type": "color", "color": "#ffffff"}`}</code>, <code>{`{"type": "image", "url": "https://...", "offsetY": 50}`}</code> (
    <code>offsetY</code> 0–100, varsayılan 50), ya da kaldırmak için <code>{`{"type": "none"}`}</code>. Görsel URL’leri <code>http(s)</code>{' '}
    ya da bir <code>data:image</code> URI’si olmalıdır.
  
  
    Logo. <code>{`{"type": "icon", "name": "HeartIcon"}`}</code>, <code>{`{"type": "image", "url": "https://..."}`}</code> ya da kaldırmak
    için <code>{`{"type": "none"}`}</code>. Simge adları sabittir: <code>QuestionMarkIcon</code>, <code>ListBulletsIcon</code>,{' '}
    <code>ChartBarIcon</code>, <code>ClockCountdownIcon</code>, <code>HeartIcon</code>, <code>LightbulbIcon</code>,{' '}
    <code>CheckCircleIcon</code>, <code>MagnifyingGlassIcon</code>, <code>TrendUpIcon</code>, <code>EnvelopeIcon</code>,{' '}
    <code>PhoneIcon</code>, <code>CalendarIcon</code>, <code>LinkIcon</code>, <code>UsersIcon</code>.
  

<p>Güncellenebilir beş alandan en az birini gönderin. Form içeriğini değiştirmez — bunun için MCP editör araçlarını kullanın.</p>

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "forms.update",
    "params": {
      "formId": "frm_abc123",
      "name": "Updated Name",
      "emoji": "📋"
    }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "id": "frm_abc123",
    "name": "Updated Name",
    "folderId": null,
    "emoji": "📋"
  }
}
```

  

<p>
  <code>cover</code> ve <code>logo</code> yalnızca siz gönderdiğinizde geri döner. Skaler her alanda geçerli durumla eşleşen bir istek
  gövdesi <code>noChange: true</code> ekler.
</p>

{/* ── forms.publish ───────────────────────────────────────────────────────── */}

Bir formu yanıt kabul edebilmesi için yayınlar ve [alan anahtarlarını](/tr/requests/field-keys) yeni bir anlık görüntüye dondurur. Idempotent:
zaten yayınlanmış bir form `alreadyPublished: true` ile başarı döner, yayından kaldırılmış bir form ise son anlık görüntüsünden yeniden
yayınlanır.

  
    Form kimliği.
  

<p>
  İçerik blokları olan ama sorusu olmayan bir form bir uyarıyla birlikte yayınlanır. Hiç içeriği olmayan bir form yayınlanamaz. Yayınlamak
  genel bir URL oluşturmaz — bunun için <a href="#share-links-create">shareLinks.create</a>’i çağırın.
</p>

{/* ── forms.unpublish ─────────────────────────────────────────────────────── */}

Bir formu çevrimdışı yapar. Yanıtlayıcılar artık onu açamaz. Idempotent — yayınlanmamış bir form `alreadyUnpublished: true` döner.
`forms.publish` ile geri alınabilir.

  
    Form kimliği.
  

{/* ── forms.delete ────────────────────────────────────────────────────────── */}

Bir formu çöp kutusuna taşır. Etkin paylaşım bağlantıları iptal edilir, böylece genel URL’leri hizmet vermeyi durdurur.

  
    Form kimliği.
  

> ⚠️ **Geri yükleme bağlantıları geri getirmez**
> <p>
>     <code>forms.restore</code> formu döndürür, ama iptal ettiği paylaşım bağlantıları iptal olarak kalır. Yenilerini{' '}
>     <code>shareLinks.create</code> ile oluşturun. Zaten çöp kutusundaki bir form <code>alreadyTrashed: true</code> döner ve orijinal çöp
>     kutusu tarihini korur.
>   </p>

{/* ── forms.restore ───────────────────────────────────────────────────────── */}

Bir formu çöp kutusundan geri yükler.

  
    Form kimliği.
  
  
    Nereye geri yükleneceği. Orijinal klasörü için belirtme, çalışma alanı kökü için <code>null</code>, ya da bir klasör kimliği.
  

<p>
  Çöp kutusunda olmayan bir form <code>alreadyRestored: true</code> döner.
</p>

{/* ── formSettings.get ────────────────────────────────────────────────────── */}

Bir formun davranış ayarlarını okur.

  
    Form kimliği.
  

<p>
  <code>{`{ settings, isDefault, availableEmailDomains, defaultFromAddress, payment }`}</code> döner. Form henüz kaydedilmiş bir ayar
  satırına sahip değilse ve varsayılanları görüyorsanız <code>isDefault</code> true olur. <code>availableEmailDomains</code>,{' '}
  <code>emailDomainId</code> olarak geçirebileceğiniz doğrulanmış alan adı kimliklerini tutar, <code>payment</code> ise Stripe’ın bağlı olup
  olmadığını bildirir (bağlamak bir kontrol paneli adımıdır).
</p>

{/* ── formSettings.update ─────────────────────────────────────────────────── */}

Bir formun davranış ayarlarını günceller. Kısmi bir güncelleme: yalnızca gönderdiğiniz alanlar yazılır.

  
    Form kimliği.
  
  
    <code>language</code> (BCP-47, varsayılan <code>"en"</code>), <code>requireAuthentication</code>, <code>showBranding</code>,{' '}
    <code>captchaEnabled</code>, <code>passwordEnabled</code>, <code>password</code> (4 karakter veya daha fazla; bir metin{' '}
    <code>passwordEnabled: true</code> anlamına gelir, <code>null</code> kapıyı temizler).
  
  
    <code>notifyOnSubmission</code>, <code>notificationEmails</code> (dizi), <code>selfNotificationSubject</code>,{' '}
    <code>selfNotificationEmailBody</code>, <code>pdfGenerationEnabled</code>, <code>showViewSubmissionButton</code>. Sahip e-postaları
    çevrilemez — bunları istediğiniz dilde yazın.
  
  
    <code>respondentNotificationEnabled</code>, <code>respondentNotificationTo</code> (bir e-posta sorusunun alan kimliği, ya da{' '}
    <code>null</code>), <code>respondentNotificationSubject</code>, <code>respondentNotificationBody</code>,{' '}
    <code>respondentNotificationPdfEnabled</code>.
  
  
    <code>respondentReminderEnabled</code>, <code>respondentReminderTo</code>, <code>respondentReminderSubject</code>,{' '}
    <code>respondentReminderBody</code>, <code>respondentReminderRequiredFieldIds</code> ve <code>reminderSteps</code> —{' '}
    <code>["1d","3d","1w"]</code> gibi boşta kalma ötelemeleri, en fazla 5, kayıtta sıralanır ve yinelenenler kaldırılır, hiçbiri için{' '}
    <code>[]</code>. Program, terk edilmiş genel bağlantı yanıtlarına ve isteklere aynı şekilde uygulanır. Pro.
  
  
    <code>redirectUrl</code> (<code>http(s)</code>; <code>null</code> veya <code>""</code> temizler), <code>redirectQueryParams</code> (
    <code>{`[{ paramName, fieldId }]`}</code>), <code>allowAnotherResponse</code> (bir yönlendirmeyle birlikte kullanılamaz),{' '}
    <code>maxSubmissionsPerRespondent</code> (0 = sınırsız, azami 1000), <code>editAfterSubmit</code>, <code>maxEdits</code> (azami 3; 0,
    Pro ve Business'ta sınırsız anlamına gelir, Free'de 3).
  
  
    <code>draftRetentionDays</code> ve <code>submissionRetentionDays</code> (0–36500, <code>null</code> varsayılana döner). Gönderim saklama
    süresi Business’tır ve ayarlanması, düzenleyicide yapılandırılmış sabit bir silme tarihini temizler.
  
  
    Özel bir Kimden adresi için <code>formSettings.get</code>’ten doğrulanmış bir e-posta alan adı kimliği. <code>null</code>, varsayılan
    gönderene sıfırlar.
  

<p>
  Konular ve gövdeler düz metindir ve <code>{`{{variable}}`}</code> yer tutucularını kabul eder; yeni satırlar paragraf olur. Bir
  yanıtlayıcı konusunu veya gövdesini özelleştirmek onu çevrilebilir kılar, böylece anahtarları hemen <code>translations.listEntries</code>
  ’te görünür.
</p>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="submissions" class="border-t border-border pt-8">
  Gönderimler
</h2>

{/* ── submissions.list ────────────────────────────────────────────────────── */}

Bir formun gönderimlerini, en yeni sayfa önce olacak şekilde imleç tabanlı sayfalamayla listeler.

  
    Form kimliği.
  
  
    Başlatılmış ama hiç gönderilmemiş yanıtları dahil eder. Taslaklar bir Pro özelliğidir: Ücretsiz’de yalnızca tamamlanmış gönderiler
    listelenir.
  
  
    Yanıtların kaydedilmiş AI çevirilerini <code>items[].translation.display</code> altında, <code>display</code> ile aynı anahtarlarla
    ekler. <code>items[].answers</code> ve <code>items[].display</code> her zaman orijinal kalır.
  
  
    Sayfa boyutu (1–100).
  
  
    Önceki yanıttan gelen sayfalama imleci.
  

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "formName": "Event Feedback",
    "items": [
      {
        "id": "sub_xyz789",
        "submittedAt": "2026-05-18 18:02:28",
        "isCompleted": true,
        "createdAt": "2026-05-18 18:02:19",
        "answers": {
          "email": "user@example.com",
          "plan": "pro",
          "contacts": [{ "name": "Ada" }, { "name": "Grace" }]
        },
        "display": {
          "email": "user@example.com",
          "plan": "Pro",
          "contacts": "Ada, Grace"
        }
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

> ℹ️ **Webhook ve callback’lerle aynı yanıtlar**
> <p>
>     Her öğe, <a href="/tr/requests/field-keys">alan anahtarına</a> göre anahtarlanmış <code>answers</code> ve okunabilir metin olarak aynı
>     anahtarlara sahip <code>display</code> taşır — bir <a href="/tr/developers/webhooks-reference">webhook yükünün</a>, bir{' '}
>     <a href="/tr/requests/callbacks">istek geri çağırmasının</a> ve <code>requests.get</code>’in taşıdığı biçim. Bir seçim yanıtı kendi
>     seçenek anahtarıdır, tekrarlanan bir grup ise bir örnek dizisidir. Her anahtarın başlığı ve seçenek etiketleri için{' '}
>     <code>fields.list</code>’i çağırın. Bu metod toplam döndürmez.
>   </p>

{/* ── submissions.pdf ─────────────────────────────────────────────────────── */}

Bir gönderimin PDF’sine bir bağlantı getirir. Zapier bağlayıcısı için oluşturulmuştur: yalnızca formda PDF’i dahil edecek şekilde
yapılandırılmış etkin bir Zapier entegrasyonu varsa ve PDF saklandıysa bir sonuç döner.

  
    Form kimliği.
  
  
    Gönderim kimliği. O forma ait ve tamamlanmış olmalıdır.
  

  
    
```
{
  "ok": true,
  "data": {
    "url": "https://api.formstep.io/api/storage/...",
    "filename": "formstep-submission-sub_xyz789.pdf",
    "contentType": "application/pdf",
    "byteLength": 148213
  }
}
```

  

{/* ── submissions.sample ──────────────────────────────────────────────────── */}

Bir form için gerçek veri olmadan örnek bir gönderim yükü oluşturur. Bu, bir genel bağlantı gönderimi teslimatının taşıdığı tam biçimdir, bu
yüzden bağlayıcılar onu alan keşfi için kullanır; bir istekten doğan bir gönderim ise bir aboneliğe bunun yerine <code>request.completed</code>{' '}
olarak ulaşır, bu da{' '}

<a href="#requests-sample">requests.sample</a>'ın örneklediği şeydir. <code>data.form.snapshotId</code>, formun güncel yayımlanmış
sürümüdür, canlı olayların taşıdığı aynı kimliktir; form yayımlanmamışken ise <code>null</code>’dur.

  
    Form kimliği.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "evt_example000000000000",
    "type": "submission.completed",
    "createdAt": "2026-05-18T19:00:00.000Z",
    "apiVersion": "2026-09-24",
    "test": true,
    "data": {
      "form": { "id": "frm_abc123", "name": "Event Feedback", "snapshotId": "js7abc123" },
      "submission": {
        "id": "sub_example000000000000",
        "respondentEmail": "respondent@example.com",
        "submittedAt": "2026-05-18T19:00:00.000Z",
        "updatedAt": null,
        "editCount": 0,
        "pdfUrl": null,
        "language": "en"
      },
      "answers": { "your_email": "john@example.com" },
      "display": { "your_email": "john@example.com" }
    }
  }
}
```

  

<p>
  Alan ve yük anlambilimi tek bir yerde, <a href="/tr/developers/webhooks-reference#payload">webhooks referansında</a> belgelenmiştir.
</p>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="share-links" class="border-t border-border pt-8">
  Paylaşım bağlantıları
</h2>

{/* ── shareLinks.list ─────────────────────────────────────────────────────── */}

Bir formun paylaşım bağlantılarını listeler.

  
    Form kimliği.
  
  
    İptal edilmiş bağlantıları sonuçlara dahil et.
  
  
    Sayfa boyutu (1–100).
  
  
    Sayfalama imleci.
  

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "sl_abc123",
        "code": "RPjNes52",
        "url": "https://formstep.io/RPjNes52",
        "customDomainUrl": null,
        "formId": "frm_abc123",
        "createdAt": 1714041851000,
        "expiresAt": null,
        "maxClaims": null,
        "claimedCount": 7,
        "isRevoked": false,
        "revokedAt": null,
        "customDomainId": null,
        "customSlug": null
      }
    ],
    "availableCustomDomains": [],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── shareLinks.create ───────────────────────────────────────────────────── */}

Bir form için paylaşım bağlantısı oluşturur. Formun önce yayınlanmış olması gerekir.

  
    Form kimliği. Yayınlanmamış, ya da yayınlanıp sonra yayından kaldırılmış bir form reddedilir — önce <code>forms.publish</code>’i
    çağırın.
  
  
    Milisaniye cinsinden gelecekteki bir Unix zaman damgası olarak son kullanma tarihi. Güncellemeden farklı olarak, burada <code>0</code>{' '}
    kabul edilmez.
  
  
    Bu bağlantının kullanılabileceği maksimum sayı. Pozitif olmalıdır; daha sonra temizlemek için <code>shareLinks.update</code> kullanın.
  

<p>
  Yanıt, paylaşım bağlantısıdır (bir <code>shareLinks.list</code> öğesiyle aynı biçimde) artı <code>availableCustomDomains</code>, böylece
  bir tane eklemek için <code>shareLinks.update</code> ile devam edebilirsiniz.
</p>

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "shareLinks.create",
    "params": {
      "formId": "frm_abc123",
      "maxClaims": 100
    }
  }'
```

{/* ── shareLinks.update ───────────────────────────────────────────────────── */}

Bir paylaşım bağlantısını günceller. Son kullanma tarihi, maksimum talep sayısı, özel alan adı, slug değiştirilebilir ya da bağlantı iptal
edilebilir.

  
    Paylaşım bağlantısı kimliği.
  
  
    Milisaniye cinsinden yeni son kullanma zaman damgası. Son kullanma tarihini kaldırmak için <code>0</code> gönder.
  
  
    Yeni maksimum talep sayısı. Sınırı kaldırmak için <code>-1</code> gönder.
  
  
    Özel alan adı ekle. Kaldırmak için <code>null</code> gönder.
  
  
    Özel URL slug’ı (3–64 karakter, küçük harf alfanümerik ve tire). <code>customDomainId</code> ile birlikte zorunludur; ayırmak için
    ikisini de <code>null</code> gönder. <code>login</code>, <code>auth-callback</code>, <code>preview</code>, <code>payment</code>,{' '}
    <code>api</code>, <code>admin</code> ve <code>health</code> ayrılmıştır.
  
  
    Bağlantıyı kalıcı olarak iptal etmek için <code>true</code> yap. Diğer alanlarla birlikte kullanılamaz ve geri alınamaz — bir paylaşım
    bağlantısı için tek silme yolu budur.
  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="fields" class="border-t border-border pt-8">
  Alanlar
</h2>

{/* ── fields.list ─────────────────────────────────────────────────────────── */}

Bir formun geçerli yayınlanmış sürümündeki her alanı, her birini adreslemek için kullanılacak anahtarla birlikte listeler. Anahtarları koda
gömmek yerine bunu `requests.create`’ten önce çağırın. Bkz. [Alan anahtarları](/tr/requests/field-keys).

  
    Form kimliği. Hiç yayınlanmamış bir formun henüz alan anahtarı yoktur ve hiçbir öğe olmadan <code>published: false</code> döner.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "fields.list",
    "params": { "formId": "j57..." }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "published": true,
    "items": [
      { "key": "company_name", "type": "text", "title": "Company", "required": true, "prefillable": true },
      {
        "key": "company_size", "type": "select", "title": "Company size", "required": false, "prefillable": true,
        "options": [
          { "key": "1_50", "label": "1–50" },
          { "key": "51_200", "label": "51–200" }
        ]
      },
      {
        "key": "satisfaction", "type": "matrix", "title": "How did we do?", "required": false, "prefillable": true,
        "rows": [{ "key": "delivery_speed", "label": "Delivery speed" }],
        "columns": [{ "key": "very_good", "label": "Very good" }, { "key": "poor", "label": "Poor" }]
      },
      { "key": "case_id", "type": "hidden", "title": "Case", "required": false, "prefillable": false, "context": true },
      { "key": "total", "type": "number", "title": "Total", "required": false, "prefillable": false, "calculated": true }
    ],
    "hasMore": false
  }
}
```

  

> ℹ️ **Bayrakları okumak**
> <p>
>     <code>context: true</code> gizli bir alandır — değeri <code>context</code>’e gider, asla <code>prefill</code>’e değil.{' '}
>     <code>prefillable: false</code>, kimsenin değer sağlayamayacağı bir alanı işaretler (dosya, imza, ödeme, randevu, belgeler). Bir seçim
>     sorusu için etiketi değil, seçeneğin <strong>key</strong>’ini gönderin; bir matris <code>rows</code> ve <code>columns</code>’ını aynı
>     şekilde listeler ve <code>{'{ "row_key": "column_key" }'}</code> alır. <code>calculated: true</code> hesaplanan bir alandır: form
>     değerini hesaplar, onu <code>answers</code>’te geri okursunuz ve hiçbir şey onu gönderemez.
>   </p>

<p>
  Tekrarlanan bir grup, <code>repeating: true</code> ve bir <code>members</code> dizisiyle birlikte <code>type: "group"</code>’dur. Bir
  Belgeler bloğu <code>type: "documents"</code>’tir ve her yanıtlayıcının zaten gördüğü, yazarın eklediği dosyaları taşıyan{' '}
  <code>documents: [{`{ name }`}]</code>’i içerir.
</p>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="requests" class="border-t border-border pt-8">
  İstekler
</h2>

Bir istek, yayınlanmış bir formu bir kişiye atar ve sona erdiğinde sizi geri çağırır. Kavramsal kılavuz
[Bir istek oluşturmak](/tr/requests/creating-requests) sayfasındadır; burası parametre listesidir.

{/* ── requests.create ─────────────────────────────────────────────────────── */}

Bir istek oluşturur. Alıcı yanıtlasın ya da yanıtlamasın, çalışma alanının aylık kotasından bir birim harcar.

  
    Atanacak yayınlanmış form.
  
  
    <code>{`{ email?, name? }`}</code>. <code>delivery</code> <code>"email"</code> olduğunda bir e-posta gereklidir; aksi halde yalnızca
    kişiyi İstekler sayfasında ve yanıtlarında tanımlar.
  
  
    Alan anahtarına göre başlangıç yanıtları. Alıcı bunları görür ve değiştirebilir.
  
  
    Alıcının değiştiremeyeceği önceden doldurulmuş anahtarlar. Buradaki her anahtar <code>prefill</code> içinde de bulunmalı, kilitli
    zorunlu bir alan boş olmayan bir değerle doldurulmuş olmalıdır.
  
  
    Formun gizli alanları için, alan anahtarına göre değerler. Güvenilir, değiştirilemez ve geri çağırmada aynen döner. Bilinmeyen bir
    anahtar <code>UNKNOWN_FIELD_KEY</code> ile reddedilir.
  
  
    Kendi kayıt tutma bilgileriniz. Forma hiç ulaşmaz; geri çağırmalarda ve okumalarda geri döner.
  
  
    Formun yayınlanmış dillerinden biri. Varsayılan olarak formun kendi varsayılanı kullanılır.
  
  
    Formstep’in daveti göndermesi için <code>"email"</code> (bir alıcı e-postası ve Pro veya Business ya da Ücretsiz bir hesabın 10 ücretsiz
    davetinden biri gerekir), ya da bağlantıyı kendiniz teslim etmek için <code>"none"</code>.
  
  
    Bu istek için formun hatırlatma programını geçersiz kılın. Boş bir dizi hatırlatmaları kapatır.
  
  
    Epoch milisaniye. Varsayılan olarak 30 gün sonrasıdır; azami 365 gündür.
  
  
    Formstep’in istek sona erdiğinde geri çağırmayı nereye POST edeceği. Yalnızca HTTPS, ve host genel bir adrese çözümlenmelidir.
  
  
    Bu istek için kendi kimliğiniz. <code>requests.list</code>’te filtrelenebilir.
  
  
    Aynı gövdeyle tekrarlamak, orijinal isteği <code>deduplicated: true</code> ile döner. Farklı bir gövde reddedilir. Anahtarlar 30 gün
    canlı kalır.
  
  
    Bağlantıyı özel alan adlarınızdan birinde oluşturun. Yalnızca REST API.
  
  
    <code>{`[{ documentId, field?, name? }]`}</code> — önce <a href="#documents-create">documents.create</a> ile yüklenen, bu tek alıcıya
    verilen dosyalar.
  
  
    Bir deneme çalışması: hiçbir şey e-postayla gönderilmez, geri çağırma <code>"test": true</code> taşır ve gönderim hiçbir yerde sayılmaz.
    Bağlantı 24 saat içinde kapanır ve Free'de bir workspace günde 10 test isteği oluşturabilir.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "requests.create",
    "params": {
      "formId": "j57...",
      "recipient": { "email": "ada@acme.com", "name": "Ada" },
      "prefill": { "company_name": "Acme" },
      "readonly": ["company_name"],
      "context": { "case_id": "CASE-9" },
      "delivery": "email",
      "externalId": "run-42",
      "callbackUrl": "https://automation.example/webhook/resume-abc",
      "idempotencyKey": "run-42"
    }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "id": "kd7...",
    "status": "pending",
    "url": "https://form.formstep.io/r/rq_...",
    "deliveryStatus": "queued",
    "expiresAt": 1794787200000,
    "createdAt": 1789379200000,
    "externalId": "run-42",
    "deduplicated": false
  }
}
```

  

> ⚠️ **url’i saklayın**
> <p>
>     <code>url</code>, tek kullanımlık token’ı taşır. <code>requests.get</code> genellikle onu yeniden oluşturabilir, ama dağıtımın bir
>     istek-token anahtarı olmadan önce oluşturulmuş bir istek için <code>null</code> döner. Bağlantıyı kendiniz teslim ediyorsanız, onu
>     oluşturduğunuzda saklayın.
>   </p>

<p>
  <code>deliveryStatus</code>, bir davet kuyruğa alınana kadar <code>not_requested</code>’tır, ardından <code>queued</code> →{' '}
  <code>sent</code> ya da <code>failed</code> olur, ve posta sağlayıcısı bir sert geri dönüş veya şikayet bildirdiğinde <code>bounced</code>{' '}
  olur.
</p>

{/* ── requests.get ────────────────────────────────────────────────────────── */}

Bir isteği tam olarak alın: durum, sonuç, önceden doldurulan değerler, zaman çizelgesi ve — tamamlandıysa — geri çağırmanın taşıdığıyla aynı
iki eşleme olan, alan anahtarına göre anahtarlanmış <code>answers</code> ve <code>display</code>.

  
    İstek kimliği.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "kd7...",
    "formId": "j57...",
    "status": "completed",
    "outcome": "approve",
    "isTest": false,
    "recipient": { "email": "ada@acme.com", "name": "Ada" },
    "language": "en",
    "externalId": "run-42",
    "metadata": null,
    "context": { "case_id": "CASE-9" },
    "prefill": { "company_name": "Acme" },
    "readonlyKeys": ["company_name"],
    "delivery": "email",
    "deliveryStatus": "sent",
    "hasCallback": true,
    "callbackFailedAt": null,
    "submissionId": "kp2...",
    "url": "https://form.formstep.io/r/rq_...",
    "answers": { "company_name": "Acme", "decision": "approve" },
    "display": { "company_name": "Acme", "decision": "Approve" },
    "timeline": [
      { "id": "kd7...:created", "type": "created", "at": 1789379200000 },
      { "id": "kd7...:completed", "type": "completed", "at": 1789465600000 }
    ],
    "expiresAt": 1794787200000,
    "completedAt": 1789465600000
  }
}
```

  

> ℹ️ **outcome ile status**
> <p>
>     <code>status</code> isteğin bitip bitmediğini söyler; <code>outcome</code> alıcının ne karar verdiğini söyler — <code>approve</code>,{' '}
>     <code>decline</code>, <code>changes</code>, ya da tamamlanmış bir isteğin alıcısı bu üçünden birini seçmediyse <code>null</code> — bir
>     [karar sorusu](/tr/requests/decisions-and-approvals) olmayan bir form dahil. Geri çağırma URL’sinin kendisi asla döndürülmez;{' '}
>     <code>hasCallback</code> yalnızca birinin ayarlanıp ayarlanmadığını söyler.
>   </p>

<p>
  Yukarıdaki örnek kısaltılmıştır. Tam bir yanıt ayrıca <code>workspaceId</code>, <code>formSnapshotId</code>, <code>createdVia</code>,{' '}
  <code>documents</code>, <code>reminderStep</code>, <code>remindersSent</code>, <code>reminderDueAt</code>, <code>dataPurgedAt</code> ve
  zaman damgalarının geri kalanını taşır (<code>updatedAt</code>, <code>openedAt</code>, <code>startedAt</code>, <code>lastActivityAt</code>{' '}
  ile <code>expiredAt</code>, <code>canceledAt</code>, <code>canceledBy</code>, <code>cancelReason</code>).
</p>
<p>
  İki alan, önünüzdeki kopyanın tek kopya olduğu anı söyler. <code>callbackFailedAt</code>, bu isteğin geri çağırması denemelerini
  tükettiğinde ayarlanır ve biri başarılı olduğunda ya da onu yeniden oynattığınızda temizlenir. <code>dataPurgedAt</code>, saklama süresi
  isteği ayıkladığında ayarlanır: <code>context</code>, <code>prefill</code> ve <code>metadata</code> boş döner, <code>readonlyKeys</code>{' '}
  ve <code>documents</code> <code>[]</code> olur, <code>submissionId</code>, <code>answers</code> ve <code>display</code> ise{' '}
  <code>null</code> olur.
</p>
<p>
  <code>timeline</code> türetilmiştir, en eskiden en yeniye sıralıdır. Her girişin bir <code>id</code>’si, bir <code>at</code>’ı ve bir{' '}
  <code>type</code>’ı vardır — <code>created</code>, <code>invitation</code>, <code>reminder</code>, <code>opened</code>,{' '}
  <code>started</code>, <code>completed</code>, <code>expired</code>, <code>canceled</code>, <code>callback</code>. Teslimat girişleri{' '}
  <code>deliveryStatus</code> ve <code>attemptCount</code> ekler, geri çağırmalar ise <code>eventType</code> ekler. Teslimat satırları 30
  gün tutulur, bu yüzden daha eski zaman çizelgeleri yalnızca zaman damgalarına indirgenir.
</p>

{/* ── requests.list ───────────────────────────────────────────────────────── */}

Bir çalışma alanındaki veya bir formdaki istekleri en yeniden en eskiye listeler. Test istekleri, siz istemedikçe dışarıda bırakılır.

  
    Bir çalışma alanına kapsa. Bunu ya da <code>formId</code>’yi verin.
  
  
    Bir forma kapsa.
  
  
    <code>pending</code>, <code>completed</code>, <code>expired</code> veya <code>canceled</code>.
  
  
    <code>approve</code>, <code>decline</code> veya <code>changes</code>. Yalnızca tamamlanmış istekleri ima eder.
  
  
    Bir çalıştırmanın oluşturduğu isteği bulmak için kendi kimliğiniz.
  
  
    <code>test: true</code> ile oluşturulan istekleri dahil edin.
  
  
    Sayfa boyutu (1–100).
  
  
    Önceki yanıttan gelen sayfalama imleci.
  

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "kd7...",
        "formId": "j57...",
        "status": "pending",
        "outcome": null,
        "recipient": { "email": "ada@acme.com", "name": "Ada" },
        "externalId": "run-42",
        "deliveryStatus": "sent",
        "expiresAt": 1794787200000,
        "createdAt": 1789379200000
      }
    ],
    "nextCursor": null,
    "hasMore": false
  }
}
```

  

<p>
  Liste öğeleri, <code>url</code>, <code>answers</code>, <code>display</code> ve <code>timeline</code> hariç <code>requests.get</code> ile
  aynı alanları taşır ve her biri <code>isTest</code> taşır. <code>workspaceId</code> ya da <code>formId</code> verin — hiçbirini vermemek,
  nedeni <code>SCOPE_REQUIRED</code> olan bir <code>400 VALIDATION_ERROR</code> döner. <code>outcome</code>, <code>status</code>’u geçersiz
  kılar, çünkü yalnızca tamamlanmış bir isteğin bir kararı vardır.
</p>

{/* ── requests.cancel ─────────────────────────────────────────────────────── */}

Beklemedeki bir isteği geri çeker. Bağlantı çalışmayı durdurur, alıcı bir geri çekilme bildirimi görür ve bir `request.canceled` geri
çağırması tetiklenir.

  
    İstek kimliği.
  
  
    Nedeninize dair notunuz; istek üzerinde tutulur ve geri çağırmada gönderilir.
  

{/* ── requests.remind ─────────────────────────────────────────────────────── */}

Hatırlatma programına dokunmadan alıcıya şimdi e-posta gönderir. Bir alıcı e-postası ve Pro veya Business plan gerektirir.

  
    İstek kimliği. Hâlâ beklemede olmalıdır ve bir test isteği olmamalıdır.
  

<p>
  İki sınır uygulanır: manuel hatırlatmalar arasında en az 10 dakika, ve istek başına toplamda — manuel ve zamanlanmış birlikte — en fazla 8
  hatırlatma. Otomatik program dokunulmamış kalır — <code>reminderStep</code> ve <code>reminderDueAt</code> oldukları yerde kalır.
</p>

{/* ── requests.replayCallback ─────────────────────────────────────────────── */}

Bir isteğin sona erdiğinde tetiklediği geri çağırmayı yeniden gönderir — aynı yük, aynı olay kimliği, böylece onu zaten işleyen bir alıcı
tekilleştirebilir. Bozuk bir uç noktayı düzelttikten sonra kullanın.

  
    İstek kimliği. Tamamlanmış, süresi dolmuş veya iptal edilmiş olmalıdır.
  

  
    
```
{
  "ok": true,
  "data": { "dispatchId": "kf9...", "eventId": "evt_kf9..." }
}
```

  

{/* ── requests.sample ─────────────────────────────────────────────────────── */}

Bir form için gerçek bir istek olmadan örnek bir istek olayı oluşturur. Bu, <a href="#webhooks-create">webhooks.create</a> ile oluşturulmuş
bir <code>request\_\*</code> aboneliğinin aldığı tam zarftır, bu yüzden bağlayıcılar onu alan keşfi için kullanır. Tamamlanmış bir örnek,{' '}

<a href="#submissions-sample">submissions.sample</a>'ın gösterdiği aynı örnek yanıtları taşır; süresi dolmuş veya iptal edilmiş bir örnek
ise yalnızca istek bloğunu taşır.

  
    Form kimliği.
  
  
    Hangi sonlanmanın örnekleneceği, <code>webhooks.create</code> yazımıyla. Zarfın <code>type</code>'ı noktalı biçimdir.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "evt_example000000000000",
    "type": "request.completed",
    "createdAt": "2026-05-18T19:00:00.000Z",
    "apiVersion": "2026-09-24",
    "test": true,
    "data": {
      "request": {
        "id": "req_example000000000000",
        "externalId": "order-1234",
        "status": "completed",
        "language": "en",
        "recipient": { "email": "recipient@example.com", "name": "Sample Recipient" },
        "metadata": { "source": "sample" },
        "context": {},
        "createdAt": "2026-05-18T18:00:00.000Z",
        "completedAt": "2026-05-18T19:00:00.000Z"
      },
      "form": { "id": "frm_abc123", "name": "Event Feedback", "snapshotId": "js7abc123" },
      "submission": {
        "id": "sub_example000000000000",
        "respondentEmail": "respondent@example.com",
        "submittedAt": "2026-05-18T19:00:00.000Z",
        "updatedAt": null,
        "editCount": 0,
        "pdfUrl": null,
        "language": "en"
      },
      "answers": { "your_email": "john@example.com" },
      "display": { "your_email": "john@example.com" }
    }
  }
}
```

  

<p>
  İstek bloğu ve <code>outcome</code>, <a href="/tr/requests/callbacks#payload">geri çağırmalar sayfasında</a> belgelenmiştir; gönderim
  yarısı ise <a href="/tr/developers/webhooks-reference#payload">webhook referansında</a>. Örnek kimlikler yukarıda gösterilen sabit yer
  tutuculardır ve <code>test</code>, <code>true</code>'dur, bu yüzden bir alıcı bir örneği canlı bir olaydan ayırt edebilir.
</p>

{/* ── documents.create ────────────────────────────────────────────────────── */}

Formun [Belgeler bloğu](/tr/building-forms/documents-block) aracılığıyla bir alıcıya vereceğiniz bir dosya için bir yükleme ayırır. Baytlar
hiçbir zaman bu API’den geçmez: önceden imzalanmış bir `PUT` alırsınız, yüklersiniz ve `requests.create`, istek var olmadan önce nesneyi
doğrular.

  
    Belgeler bloğu dosyayı gösterecek form. Yüklemeyi o çalışma alanına kapsar.
  
  
    Alıcının göreceği görünen ad (1–200 karakter). İstek başına geçersiz kılınabilir.
  
  
    <code>application/pdf</code> ya da bir görsel türü: <code>image/png</code>, <code>image/jpeg</code>, <code>image/webp</code>,{' '}
    <code>image/gif</code>, <code>image/svg+xml</code>, <code>image/avif</code>, <code>image/bmp</code>, <code>image/tiff</code>. Office
    belgeleri kabul edilmez.
  
  
    Tam bayt uzunluğu. Azami 25 MB (26.214.400).
  
  
    Baytların onaltılık özeti. Verildiğinde yüklemeden sonra doğrulanır.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "kn7...",
    "name": "Lease contract draft",
    "contentType": "application/pdf",
    "size": 412000,
    "uploadUrl": "https://...",
    "expiresAt": 1792198800000
  }
}
```

  

<p>
  Ham baytları, siz beyan ettiğiniz türe ayarlanmış <code>Content-Type</code> ile bir saat içinde <code>uploadUrl</code>’a <code>PUT</code>{' '}
  edin, ardından kimliği <code>requests.create</code>’ten referans alın:
</p>

```
{
  "method": "requests.create",
  "params": {
    "formId": "j57...",
    "documents": [
      { "documentId": "kn7...", "name": "Your lease contract" },
      { "documentId": "kn8...", "field": "attachments" }
    ]
  }
}
```

<ul>
  <li>
    <code>field</code>, Belgeler bloğunun alan anahtarıdır. Formda tam olarak bir blok varsa isteğe bağlıdır; iki veya daha fazlasında
    zorunludur.
  </li>
  <li>Bloğun yazarın eklediği belgeleri kalır; sizinkiler bu tek alıcı için onların altında görünür.</li>
  <li>Sınırlar: belge başına 25 MB, istek başına 100 MB belge, yazarın eklediği belgeler dahil blok başına gösterilen 20 belge.</li>
  <li>
    Bir yükleme herhangi bir sayıda istek tarafından referans alınabilir. Kimsenin referans almadığı bir yükleme zamanla silinir. Baytlar,
    onlara referans veren son istek saklama süresi tarafından ayıklanana kadar çalışma alanı sahibinin depolama alanına sayılır.
  </li>
</ul>

<p>
  Buradaki her başarısızlık, bir <code>details.reason</code> ile birlikte <code>400 VALIDATION_ERROR</code>’dur: bu metoddan{' '}
  <code>DOCUMENT_TYPE_NOT_ALLOWED</code>, <code>DOCUMENT_TOO_LARGE</code>, <code>INVALID_DOCUMENT_NAME</code> ya da{' '}
  <code>INVALID_DOCUMENT_SHA256</code>, ve <code>requests.create</code>’ten <code>DOCUMENT_NOT_FOUND</code>,{' '}
  <code>DOCUMENT_NOT_UPLOADED</code> (<code>PUT</code>’u atladınız), <code>DOCUMENT_INVALID</code>, <code>INVALID_DOCUMENT_TARGET</code>,{' '}
  <code>DOCUMENTS_TOO_LARGE</code> ya da <code>DOCUMENTS_TOO_MANY</code>.
</p>

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="webhooks" class="border-t border-border pt-8">
  Webhook’lar
</h2>

{/* ── webhooks.list ───────────────────────────────────────────────────────── */}

Bir form için webhook aboneliklerini listeler.

  
    Form kimliği.
  

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "subscriptionId": "int_abc123",
        "formId": "frm_abc123",
        "provider": "zapier",
        "targetUrl": "https://hooks.zapier.com/...",
        "eventType": "submission_created",
        "status": "active",
        "createdAt": 1714041851000
      }
    ],
    "hasMore": false
  }
}
```

  

{/* ── webhooks.create ─────────────────────────────────────────────────────── */}

Bir URL'yi form olaylarına abone eder: yeni veya terk edilmiş gönderimler, ya da formdaki isteklerin sona ermesi. URL HTTPS
kullanmalıdır.

  
    Form kimliği.
  
  
    Webhook yüklerini alacak HTTPS URL’si.
  
  
    Aboneliğin hangi araca ait olduğu. Bu yalnızca kendi kaydınız için bir etikettir — kurulacak bir mağaza uygulaması yoktur ve her
    sağlayıcı aynı şekilde davranır.
  
  
    Abone olunacak olay türü. Üç <code>submission_*</code> türü gönderim yükünü teslim eder: <code>submission_created</code> ilk gönderimi,{' '}
    <code>submission_updated</code> yanıtlayanın düzenlemesini ve <code>submission_abandoned</code> atıl kalmış bir taslağı bildirir. Üç{' '}
    <code>request_*</code> türü ise, formdaki bir istek o şekilde sona erdiğinde eşleşen{' '}
    <a href="/tr/requests/callbacks#payload">istek olayını</a>, bu aboneliğin sırrıyla imzalanmış olarak teslim eder; test istekleri hiçbir
    aboneliğe ulaşmaz.
  
  
    <code>eventType</code> <code>submission_abandoned</code> olduğunda zorunludur; diğer her tür için reddedilir.
  
  
    İsteğe bağlı HMAC imzalama sırrı, 32–255 karakter. Verildiğinde, teslimatlar <code>X-Formstep-Signature</code> içerir. Sır saklanır ama
    API tarafından asla döndürülmez.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "webhooks.create",
    "params": {
      "formId": "frm_abc123",
      "targetUrl": "https://hooks.zapier.com/hooks/catch/...",
      "provider": "zapier",
      "eventType": "submission_created",
      "signingSecret": "whsec_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
    }
  }'
```

  
    
```
{
  "ok": true,
  "data": {
    "subscriptionId": "int_new123",
    "formId": "frm_abc123",
    "provider": "zapier",
    "targetUrl": "https://hooks.zapier.com/hooks/catch/...",
    "eventType": "submission_created"
  }
}
```

  

<p>
  Terk edilmiş gönderim abonelikleri, seçilen <code>idleWindow</code>’ı hem <code>webhooks.create</code> hem de <code>webhooks.list</code>
  ’ten döner. Diğer her abonelik onu atlar.
</p>

<p>
  Bir istek aboneliği, bir <a href="/tr/requests/callbacks">geri çağırmanın</a> duyduğu aynı olayları duyar, ama kendi teslimatı olarak:
  kendi olay kimliği, kendi imzası ve kendi beş denemelik yeniden deneme bütçesiyle, bu tükendiğinde abonelik duraklar. Bir{' '}
  <code>request_completed</code> aboneliği olan bir formda <code>callbackUrl</code> ile oluşturulan bir istek bu yüzden iki kez tetiklenir,
  her alıcıya bir kez. <code>requests.replayCallback</code> yalnızca geri çağırmayı yeniden gönderir. İsteğin sona ermesinden önce yükü
  görmek için <a href="#requests-sample">requests.sample</a> kullanın.
</p>

{/* ── webhooks.delete ─────────────────────────────────────────────────────── */}

Bir webhook aboneliğini kaldırır.

  
    <code>webhooks.list</code> veya <code>webhooks.create</code> tarafından döndürülen abonelik kimliği.
  

  
    
```
{
  "ok": true,
  "data": {
    "subscriptionId": "int_abc123",
    "deleted": true
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="analytics" class="border-t border-border pt-8">
  Analitik
</h2>

{/* ── analytics.get ───────────────────────────────────────────────────────── */}

Bir form için toplu analitik metriklerini getirir. Tarih aralığı, cihaz, trafik kaynağı ve ülke filtrelerini destekler.

Analitik bir Pro özelliğidir ve kural, panodaki Analitik sekmesinde olduğu gibi çalışma alanı **sahibinin** planını izler. Sahip Pro değilse çağrı `UPGRADE_REQUIRED` döndürür — sahip Pro iken kaydedilmiş geçmiş için de. Pro sahibinin çalışma alanındaki Free bir üye verileri alır.

  
    Form kimliği.
  
  
    Milisaniye cinsinden Unix zaman damgası olarak tarih aralığı başlangıcı. İkisi de ayarlandığında <code>to</code>’dan küçük veya eşit
    olmalıdır.
  
  
    Milisaniye cinsinden Unix zaman damgası olarak tarih aralığı sonu. Tüm zamanlar için ikisini de belirtme — <code>period</code> o zaman{' '}
    <code>{`{ "from": null, "to": null }`}</code> olarak döner.
  
  
    Cihaz türüne göre filtrele.
  
  
    Trafik kaynağına göre filtrele (örn. <code>"Direct"</code>, <code>"Google"</code>).
  
  
    2 harfli ülke koduna göre filtrele (örn. <code>"US"</code>, <code>"DE"</code>).
  
  
    Kendi analiziniz için, metriklerin arkasındaki temizlenmiş analitik olaylarını da döndürür. Ziyaretçi kimliği içermez.
  

<p>
  Oranlar 0’dan 100’e kadar sayılardır, sayımlar tam sayıdır ve <code>totalEvents</code>, benzersiz ziyaretçilere tekilleştirmeden önceki
  ham olay satırı sayısıdır.
</p>

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "period": { "from": null, "to": null },
    "totalEvents": 17,
    "metrics": {
      "views": 7,
      "uniqueVisitors": 7,
      "engaged": 6,
      "submissions": 4,
      "engagementRate": 86,
      "completionRate": 57,
      "bounceRate": 14
    },
    "breakdown": {
      "byBrowser": { "Chrome": 17 },
      "byCountry": { "US": 10, "DE": 7 },
      "byDevice": { "desktop": 14, "mobile": 3 },
      "bySource": { "Direct": 12, "Google": 5 }
    }
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="workspaces" class="border-t border-border pt-8">
  Çalışma alanları
</h2>

{/* ── workspaces.list ─────────────────────────────────────────────────────── */}

Token’ınızın erişebildiği tüm çalışma alanlarını listeler. Parametre gerekmez.

Bir API token’ı tek bir çalışma alanına bağlıdır, bu yüzden hesabınız birden fazlasına üye olsa bile bu metod yalnızca o çalışma alanını
döner.

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "ws_abc123",
        "name": "Acme Inc",
        "createdAt": 1714041800000,
        "role": "owner"
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── workspaces.createInvite ─────────────────────────────────────────────── */}

Bir çalışma alanı için davet bağlantısı oluşturur.

  
    Çalışma alanı kimliği.
  
  
    Milisaniye cinsinden gelecekteki bir Unix zaman damgası olarak son kullanma tarihi.
  
  
    Davetin kullanılabileceği maksimum sayı.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "inv_abc123",
    "workspaceId": "ws_abc123",
    "code": "aBcDeFgH",
    "expiresAt": null,
    "maxUses": null,
    "uses": 0,
    "createdAt": 1714041851000
  }
}
```

  

{/* ── workspaces.getInvite ────────────────────────────────────────────────── */}

Bir çalışma alanı davetini getirir. `workspaces.createInvite` ile aynı biçimi döner.

  
    Davet kimliği.
  

{/* ── workspaces.updateInvite ─────────────────────────────────────────────── */}

Mevcut bir çalışma alanı davetini günceller. <code>expiresAt</code> veya <code>maxUses</code> alanlarından en az birini sağlayın, aksi
halde çağrı reddedilir. Güncellenmiş daveti döner.

  
    Davet kimliği.
  
  
    Milisaniye cinsinden yeni son kullanma zaman damgası.
  
  
    Yeni maksimum kullanım sınırı.
  

{/* ── workspaces.revokeInvite ─────────────────────────────────────────────── */}

Bir çalışma alanı davetini kalıcı olarak iptal eder.

  
    Davet kimliği.
  

  
    
```
{
  "ok": true,
  "data": {
    "inviteId": "inv_abc123",
    "revoked": true
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="folders" class="border-t border-border pt-8">
  Klasörler
</h2>

{/* ── folders.list ────────────────────────────────────────────────────────── */}

Bir çalışma alanındaki klasörleri listeler.

  
    Çalışma alanı kimliği.
  
  
    Sayfa boyutu (1–100).
  
  
    Sayfalama imleci.
  

  
    
```
{
  "ok": true,
  "data": {
    "items": [
      {
        "id": "fld_abc123",
        "name": "Customer Feedback",
        "workspaceId": "ws_abc123",
        "parentId": null,
        "createdAt": 1714041800000
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── folders.create ──────────────────────────────────────────────────────── */}

Bir çalışma alanında klasör oluşturur. Idempotent — aynı ada sahip bir klasör zaten varsa mevcut klasörü döndürür.

  
    Çalışma alanı kimliği.
  
  
    Klasör adı (1–255 karakter).
  
  
    İç içe geçirme için üst klasör kimliği. Kök düzey için belirtme.
  

  
    
```
{
  "ok": true,
  "data": {
    "id": "fld_new123",
    "name": "Customer Feedback",
    "workspaceId": "ws_abc123",
    "parentId": null,
    "createdAt": 1714041851000,
    "alreadyExisted": false
  }
}
```

  

{/* ── folders.update ──────────────────────────────────────────────────────── */}

Bir klasörü yeniden adlandırır veya farklı bir üst klasöre taşır.

  
    Klasör kimliği.
  
  
    Yeni klasör adı (1–255 karakter).
  
  
    Yeni üst klasör. Köke taşımak için <code>null</code> gönder.
  

{/* ── folders.delete ──────────────────────────────────────────────────────── */}

Bir klasörü ve tüm içeriğini (alt klasörler ve formlar) kalıcı olarak siler.

  
    Klasör kimliği.
  

> ⚠️ **Geri alınamaz işlem**
> <p>Bu işlem, klasörün içindeki tüm alt klasörleri ve formları kalıcı olarak siler. Bu eylem geri alınamaz.</p>

  
    
```
{
  "ok": true,
  "data": {
    "folderId": "fld_abc123",
    "deletedFolderIds": ["fld_abc123"],
    "deletedFormIds": ["frm_in_folder"],
    "message": "Folder and 1 form deleted."
  }
}
```

  

<h2 id="translations" class="border-t border-border pt-8">
  Çeviriler
</h2>

{/* ── translations.listLanguages ──────────────────────────────────────────── */}

Bir formda yapılandırılmış tüm dilleri listeler.

  
    Form kimliği.
  

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "items": [
      {
        "language": "es",
        "completion": { "total": 15, "current": 12, "outdated": 2, "missing": 1, "suggested": 0 },
        "lastUpdatedAt": 1714041851000
      }
    ],
    "nextCursor": null,
    "hasMore": false,
    "canPaginate": false
  }
}
```

  

{/* ── translations.addLanguage ────────────────────────────────────────────── */}

Bir forma dil kaydeder. Siz bunu yapana kadar diğer her çeviri metodu `404 NOT_FOUND` ile başarısız olur.

  
    Form kimliği.
  
  
    BCP-47 dil etiketi (örn. <code>"es"</code>, <code>"pt-BR"</code>).
  

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "language": "es",
    "rowId": "tl_new123"
  }
}
```

  

{/* ── translations.removeLanguage ─────────────────────────────────────────── */}

Bir dili ve tüm çevirilerini formdan kaldırır.

  
    Form kimliği.
  
  
    BCP-47 dil etiketi.
  

{/* ── translations.listEntries ────────────────────────────────────────────── */}

Bir formdaki bir dil için mevcut durumuyla birlikte her kaynak anahtarı listeler. `translations.setEntry`’nin aldığı `key` değerlerini bu
şekilde keşfedersiniz.

  
    Form kimliği.
  
  
    BCP-47 dil etiketi. Zaten formda olmalıdır.
  

  
    
```
{
  "ok": true,
  "data": {
    "formId": "frm_abc123",
    "language": "es",
    "completion": { "total": 15, "current": 12, "outdated": 2, "missing": 1, "suggested": 0 },
    "items": [
      {
        "key": "block_q_1.title",
        "status": "current",
        "value": "[{\"text\":\"Tu correo electrónico\"}]",
        "sourceFragment": "[{\"text\":\"Your email\"}]",
        "updatedAt": 1714041851000,
        "block": { "id": "q_1", "type": "email-input", "label": "Your email" }
      }
    ],
    "hasMore": false
  }
}
```

  

<p>
  <code>status</code>, <code>missing</code> (hiçbir şey kaydedilmemiş), <code>outdated</code> (kaynak o zamandan beri değişti),{' '}
  <code>current</code>, ya da <code>suggested</code> (hazırlanmış ama kabul edilmemiş bir AI önerisi) olur. Anahtarlar form içeriğini (
  <code>block_&lt;id&gt;.*</code>) ve, bir yazar bunları özelleştirdiyse, yanıtlayıcı onay ve hatırlatma e-postalarını (
  <code>email.confirmation.*</code>, <code>email.reminder.*</code>) kapsar.
</p>

{/* ── translations.setEntry ───────────────────────────────────────────────── */}

Tek bir çeviri girişini ayarlar. Dilin önce <code>translations.addLanguage</code> ile eklenmiş olması gerekir.

  
    Form kimliği.
  
  
    BCP-47 dil etiketi.
  
  
    <code>translations.listEntries</code>’ten bir anahtar. Bir tanesini elle oluşturmayın.
  
  
    JSON dizgesine dönüştürülmüş çevrilmiş parça. İşaret yapısı kaynak parçayla eşleşmelidir.
  

  
```
curl -X POST https://api.formstep.io/api/v1 \
  -H "Authorization: Bearer fb_..." \
  -H "Content-Type: application/json" \
  -d '{
    "method": "translations.setEntry",
    "params": {
      "formId": "frm_abc123",
      "language": "es",
      "key": "block_q_1.title",
      "value": "[{\"text\":\"Tu correo electrónico\"}]"
    }
  }'
```

> ⚠️ **Buradaki yazmalar canlıdır**
> <p>
>     API’de taslak-sonra-yayınla adımı yoktur: bir <code>setEntry</code> veya <code>deleteEntry</code> yanıtlayıcılara hemen ulaşır. Kontrol
>     paneli ve MCP çeviri araçları bunun yerine bir taslak kullanır.
>   </p>

<p>
  <code>{`{ formId, language, key }`}</code> döner.
</p>

{/* ── translations.deleteEntry ────────────────────────────────────────────── */}

Tek bir çeviri girişini siler ve o anahtarı formun varsayılan diline geri döndürür. Idempotent. Bir dil için son giriş de gittiğinde, dil
formun yayınlanmış dillerinden düşer.

  
    Form kimliği.
  
  
    BCP-47 dil etiketi.
  
  
    Silinecek çeviri anahtarı.
  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="me" class="border-t border-border pt-8">
  Hesap
</h2>

{/* ── me.get ──────────────────────────────────────────────────────────────── */}

Kimliği doğrulanmış kullanıcı hakkında bilgi getirir.

  
    
```
{
  "ok": true,
  "data": {
    "id": "usr_abc123",
    "email": "you@example.com",
    "name": "Jane Doe"
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="meta" class="border-t border-border pt-8">
  Meta
</h2>

Bu dağıtımın sunduğu her metod adını sıralı olarak listeler. Bu sayfa ile sunucu anlaşmazlığa düştüğünde yetkili yanıt budur.

  
    
```
{
  "ok": true,
  "data": {
    "methods": [
      "methods.list",
      "analytics.get",
      "folders.create",
      "folders.delete",
      "folders.list",
      "folders.update",
      "formSettings.get",
      "formSettings.update",
      "forms.create",
      "forms.delete",
      "forms.get",
      "forms.list",
      "..."
    ]
  }
}
```

  

{/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */}

<h2 id="error-reference" class="border-t border-border pt-8">
  Hata referansı
</h2>

Her hata yanıtı aynı yapıyı izler. Üst düzey `code` kümesi kasıtlı olarak kapalıdır: yeni bir başarısızlık modu asla bir kod eklemez, bir
`reason` ekler. HTTP düzeyindeki sonuç için `code` üzerinde, düzeltme için `details.reason` üzerinde dallanın.

```
{
  "ok": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "No field with key \"company\" on this form.",
    "details": { "reason": "UNKNOWN_FIELD_KEY", "field": "prefill.company", "validKeys": ["company_name", "contacts"] }
  }
}
```

<p>
  <code>details</code>, sunucu nedeni adlandırabildiğinde her zaman bulunur. <code>reason</code>’ın yanı sıra, <code>field</code> (iç içe
  geçme için noktalı, sorunlu parametre), <code>validKeys</code>, <code>validValues</code> (bir seçim sorusunun kabul ettiği seçenek{' '}
  <strong>değerleri</strong>), <code>expectedType</code>, <code>feature</code> (<code>UPGRADE_REQUIRED</code> üzerinde), ve{' '}
  <code>retryAfterMs</code> (kısıtlanmış bir çağrıda) taşıyabilir. İstek yüzeyi için nedenler yukarıda her metotla birlikte listelenmiştir.
</p>

<p>İşte tüm kodlar:</p>

  
    İstekte geçersiz veya eksik parametreler.
  
  
    Eksik veya geçersiz API token’ı.
  
  
    Token, istenen kaynağa erişim iznine sahip değil.
  
  
    Kaynak mevcut değil.
  
  
    Bilinmeyen metod adı. Mevcut metodları görmek için <code>methods.list</code> kullan.
  
  
    Kaynak bu çağrıya izin veren bir durumda değil — artık beklemede olmayan bir istek, farklı bir gövdeyle yeniden kullanılan bir
    idempotency anahtarı.
  
  
    Bu token’da dakikada 120’den fazla çağrı, dakikada 60’tan fazla <code>requests.create</code> çağrısı, ya da bu IP’den çok fazla
    başarısız kimlik doğrulama.
  
  
    Özellik daha yüksek bir abonelik katmanı gerektirir, çalışma alanı aylık kotasını tüketmiştir (neden{' '}
    <code>MONTHLY_ALLOWANCE_REACHED</code>), ya da Ücretsiz bir hesap 10 ücretsiz davetini tüketmiştir (neden{' '}
    <code>FREE_INVITATIONS_USED</code>).
  
  
    Beklenmedik sunucu hatası. Daha sonra tekrar dene.
  

<h2 id="next-steps">Sonraki adımlar</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [API token’ları](/tr/developers/api-tokens) — Token oluştur ve yönet
  - [MCP sunucusu](/tr/developers/mcp-server) — Formstep’i AI ajanlarından kullan
  - [Webhook’lar referansı](/tr/developers/webhooks-reference) — Yük şeması ve imzalama
</div>
