Formlar API
Formlar modülünün tüm işlemleri (7) ve veri modelleri (3): adresler, izinler, girdiler, ön koşullar, olaylar ve örnekler.
Herkesin doldurabileceği formlar; yanıtlar potansiyel müşteri veya Base kaydı olarak gelir.
Modül kodu forms · 7 işlem · 3 veri modeli · 8 olay. Bir anahtar ya da token, arkasındaki kişinin bu modülde yapabildiğinden fazlasını asla yapamaz; satır düzeyindeki güvenlik uygulamadakiyle birebir aynıdır. Yetki kapsamları: forms (hepsi), forms:read (yalnız okuma) ya da forms:<yetenek>.
Kaynaklar
| Kaynak | Tablo | Listeleme ve okuma | POST | PATCH | DELETE |
|---|---|---|---|---|---|
form_submissions | form_submission | /api/v1/form_submissions | |||
public_form_fields | public_form_field | /api/v1/public_form_fields | |||
public_forms | public_form | /api/v1/public_forms |
Listeler limit (en çok 200), cursor, order (ör. -created_at), fields ve q alır; diğer her sorgu parametresi bir sütun süzgecidir: ?status=paid, ?total[gte]=100, ?id[in]=a,b, ?x=null.
İşlemler
| İşlem | Gereken izin | Ne yapar |
|---|---|---|
forms.close_form | forms:manage | Formu kapat |
forms.discard_submission | forms:manage | Başarısız gönderimi at |
forms.export_submissions | forms:export | Gönderimleri dışa aktar |
forms.record_retry | forms:manage | Yeniden denenen gönderimi kaydet |
forms.save_form | forms:manage | Form oluştur veya düzenle |
forms.set_fields | forms:manage | Formun alanlarını belirle |
forms.submit | forms:write | Web sitesinden form gönder |
forms.close_form
Formu kapat — Adres çalışmaya devam eder ve ziyaretçilere formun kapalı olduğunu söyler.
Gereken izin forms:manage · dışarıya ulaşır (gönderir, yayımlar ya da ücret alır) · Era çalıştırırken bir kişiye onaylatır
https://app.getera.io/api/v1/public_forms/{id}/actions/close_form- Asıl adres:
POST /api/v1/actions/forms.close_form
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Form · kimliği: public_form |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
form_not_open | Kapatılması için yanıt alıyor olmalı. |
Yayımladığı olaylar: forms.form_closed
Neye yazar: public_form (update) — Stops it answering
curl -X POST https://app.getera.io/api/v1/public_forms/PUBLIC_FORM_ID/actions/close_form \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"forms.form_closed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.publicForms.closeForm("PUBLIC_FORM_ID")era public_forms close_form PUBLIC_FORM_ID{
"name": "era__forms__close_form",
"arguments": {
"id": "PUBLIC_FORM_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde forms:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 form_not_open · 429 çok sık istek
forms.discard_submission
Başarısız gönderimi at — Kayıtta tutar, başarısızlar listesinden çıkarır. Ondan hiçbir şey oluşturulmaz.
Gereken izin forms:manage · dışarıya ulaşır (gönderir, yayımlar ya da ücret alır) · Era çalıştırırken bir kişiye onaylatır
https://app.getera.io/api/v1/form_submissions/{id}/actions/discard_submission- Asıl adres:
POST /api/v1/actions/forms.discard_submission
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Gönderim · kimliği: form_submission |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
submission_not_found | Gönderim bulunmalı. |
submission_not_failed | Yalnızca başarısız bir gönderim atılır. |
Yayımladığı olaylar: forms.submission_discarded
Neye yazar: form_submission (update) — Marks it discarded
curl -X POST https://app.getera.io/api/v1/form_submissions/FORM_SUBMISSION_ID/actions/discard_submission \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'{
"ok": true,
"result": "…",
"events": [
"forms.submission_discarded"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.formSubmissions.discardSubmission("FORM_SUBMISSION_ID")era form_submissions discard_submission FORM_SUBMISSION_ID{
"name": "era__forms__discard_submission",
"arguments": {
"id": "FORM_SUBMISSION_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde forms:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 submission_not_found, submission_not_failed · 429 çok sık istek
forms.export_submissions
Gönderimleri dışa aktar — Bir formun her gönderimi tablo olarak: soruya göre yanıtlar, durum, kayıt ve onay.
Gereken izin forms:export · dışarıya ulaşır (gönderir, yayımlar ya da ücret alır)
https://app.getera.io/api/v1/actions/forms.export_submissionsGirdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
formId | uuid | evet | Form · kimliği: public_form |
status | string (enum) | Yalnızca · İzin verilen değerler: accepted, failed, spam, discarded |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
form_not_found | Form bulunmalı. |
Yayımladığı olaylar: forms.submissions_exported
curl -X POST https://app.getera.io/api/v1/actions/forms.export_submissions \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"formId":"PUBLIC_FORM_ID"}'{
"ok": true,
"result": "…",
"events": [
"forms.submissions_exported"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.actions.run("forms.export_submissions", {
formId: "PUBLIC_FORM_ID"
})era forms export_submissions \
--form-id "PUBLIC_FORM_ID"{
"name": "era__forms__export_submissions",
"arguments": {
"formId": "PUBLIC_FORM_ID"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde forms:export izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 form_not_found · 429 çok sık istek
forms.record_retry
Yeniden denenen gönderimi kaydet — Başarısız bir gönderimi dönüştüğü kayıtla kabul edildi ya da yeniden başarısız işaretler.
Gereken izin forms:manage · veriyi değiştirir
https://app.getera.io/api/v1/form_submissions/{id}/actions/record_retry- Asıl adres:
POST /api/v1/actions/forms.record_retry
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | evet | Doldurulduğu yer: adresteki {id} · Gönderim · kimliği: form_submission |
recordType | string | Kayıt türü · en çok 40 | |
recordId | uuid | Kayıt | |
error | string | Neden başarısız oldu · en çok 2000 |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
submission_not_found | Gönderim bulunmalı. |
submission_not_failed | Yalnızca başarısız bir gönderim yeniden denenir. |
Yayımladığı olaylar: forms.submission_recovered, forms.submission_failed
Neye yazar: form_submission (update) — Writes the retry outcome
curl -X POST https://app.getera.io/api/v1/form_submissions/FORM_SUBMISSION_ID/actions/record_retry \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"recordType":"Record type"}'{
"ok": true,
"result": "…",
"events": [
"forms.submission_recovered",
"forms.submission_failed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.formSubmissions.recordRetry("FORM_SUBMISSION_ID", {
recordType: "Record type"
})era form_submissions record_retry FORM_SUBMISSION_ID \
--record-type "Record type"{
"name": "era__forms__record_retry",
"arguments": {
"id": "FORM_SUBMISSION_ID",
"recordType": "Record type"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde forms:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 submission_not_found, submission_not_failed · 429 çok sık istek
forms.save_form
Form oluştur veya düzenle — Herkese açık bir forma ad verir, ne oluşturacağına ve yanıt alıp almadığına karar verir.
Gereken izin forms:manage · veriyi değiştirir
https://app.getera.io/api/v1/public_forms/{id}/actions/save_form- Asıl adres:
POST /api/v1/actions/forms.save_form
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
id | uuid | Doldurulduğu yer: adresteki {id} · Form · kimliği: public_form | |
slug | string | evet | Adres · en çok 80 |
title | string | evet | Başlık · en çok 200 |
kind | string | Oluşturur · en çok 32 | |
dataTableId | uuid | Tablo · kimliği: data_table | |
savedViewId | uuid | Form görünümü · kimliği: saved_view | |
description | string | Açıklama | |
successMessage | string | Teşekkür mesajı | |
consentText | string | Ziyaretçinin vermesi gereken onay · en çok 2000 | |
redirectUrl | string | Gönderileceği yer · en çok 2000 | |
settings | object / array | Davranış | |
isActive | boolean | Yanıtlıyor |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
invalid_slug | Herkese açık adres kısa bir ad (slug) olmalı. |
slug_taken | İki form aynı adresi kullanamaz. |
unknown_form_kind | Form, bu modülün bildiği bir şeyi oluşturmalı. |
target_module_off | Potansiyel müşteri formu Satış modülünün açık olmasını gerektirir. |
form_table_not_found | Tablo formu bir Base tablosu gerektirir. |
view_not_form | Form, kendi tablosunun Form görünümünden açılır. |
invalid_redirect | Yönlendirme bir http veya https adresidir. |
Yayımladığı olaylar: forms.form_saved
Neye yazar: public_form (upsert) — Writes the form
curl -X POST https://app.getera.io/api/v1/public_forms/PUBLIC_FORM_ID/actions/save_form \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"slug":"Address","title":"Title"}'{
"ok": true,
"result": "…",
"events": [
"forms.form_saved"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.publicForms.saveForm("PUBLIC_FORM_ID", {
slug: "Address",
title: "Title"
})era public_forms save_form PUBLIC_FORM_ID \
--slug "Address" \
--title "Title"{
"name": "era__forms__save_form",
"arguments": {
"id": "PUBLIC_FORM_ID",
"slug": "Address",
"title": "Title"
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde forms:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 invalid_slug, slug_taken, unknown_form_kind, target_module_off, form_table_not_found, view_not_form, invalid_redirect · 429 çok sık istek
forms.set_fields
Formun alanlarını belirle — Tüm alan listesini, gösterilecekleri sırayla ve kurallarıyla değiştirir.
Gereken izin forms:manage · siler ya da geri alınamaz
https://app.getera.io/api/v1/public_form_fields/actions/set_fields- Asıl adres:
POST /api/v1/actions/forms.set_fields
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
formId | uuid | evet | Form · kimliği: public_form |
fields | object / array | evet | Alanlar |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
form_not_found | Form bulunmalı. |
invalid_fields | Her alanın bir etiketi ve hedefi olmalı. |
duplicate_target | İki alan aynı şeyi yazamaz. |
unknown_target | Alan var olan bir şeyi yazmalı. |
type_not_submittable | Herkese açık bir form yabancıdan dosya, referans veya ham JSON isteyemez. |
invalid_visibility | Bir alan yalnızca üstündeki sorulara bağlı olarak gösterilir. |
invalid_validation | Uzunluklar ve sınırlar sayıdır; desen bir düzenli ifadedir. |
Yayımladığı olaylar: forms.fields_changed
Neye yazar: public_form_field (delete) — Clears the old list; public_form_field (insert) — Writes the new one, in order
curl -X POST https://app.getera.io/api/v1/public_form_fields/actions/set_fields \
-H "Authorization: Bearer $ERA_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"formId":"PUBLIC_FORM_ID","fields":{}}'{
"ok": true,
"result": "…",
"events": [
"forms.fields_changed"
]
}import { createEra } from "@getera/sdk"
const era = createEra({ apiKey: process.env.ERA_API_KEY })
const res = await era.publicFormFields.setFields({
formId: "PUBLIC_FORM_ID",
fields: {}
})era public_form_fields set_fields --data '{"formId":"PUBLIC_FORM_ID","fields":{}}'{
"name": "era__forms__set_fields",
"arguments": {
"formId": "PUBLIC_FORM_ID",
"fields": {}
}
}Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde forms:manage izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 form_not_found, invalid_fields, duplicate_target, unknown_target, type_not_submittable, invalid_visibility, invalid_validation · 429 çok sık istek
forms.submit
Web sitesinden form gönder — Bir ziyaretçi sitenizdeki formlarınızdan birini doldurur.
Gereken izin forms:write · dışarıya ulaşır (gönderir, yayımlar ya da ücret alır) · Yayındaki bir siteden de çağrılabilir (visitor)
/api/site/v1/{siteId}, örneğin @getera/storefront ile). API anahtarı ya da token ile istek reddedilir (403 site_only).https://app.getera.io/api/v1/form_submissions/actions/submit- Asıl adres:
POST /api/v1/actions/forms.submit
Girdi
| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
slug | string | evet | Form · en çok 80 |
answers | object / array | Yanıtlar | |
meta | object / array | Form bilgileri |
Ön koşullar
Koşul tutmazsa işlem 409 ve şu kodlardan biriyle reddedilir:
| Kod | Ne zaman reddedilir |
|---|---|
form_not_answering | Form açık olmalı ve bu sitenin işletmesine ait olmalı. |
form_writes_table | Tablo formu kendi gönderim yolundan doldurulmalı. |
answers_invalid | Zorunlu yanıtlar verilmeli ve tüm yanıtlar geçerli olmalı. |
consent_required | Form istediğinde onay kutusu işaretlenmeli. |
too_many_submissions | Bu adresten çok sık gönderim yapıldı; biraz sonra yeniden deneyin. |
Yayımladığı olaylar: forms.submitted
Neye yazar: form_submission (insert) — Logs the answers; a lead form also creates its lead
Hatalar: 401 kimlik bilgisi yok ya da süresi dolmuş · 403 kimlik bilgisinde forms:write izni yok · 404 kayıt ya da modül erişim dışında · 422 geçersiz girdi (problems[]) · 409 form_not_answering, form_writes_table, answers_invalid, consent_required, too_many_submissions · 429 çok sık istek
Veri modelleri
FormSubmission
Tablo form_submission · Kaynak form_submissions
GET /api/v1/form_submissionsGET /api/v1/form_submissions/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
form_id | string (uuid) · uuid | public_form | ||
share_id | string (uuid) · uuid | evet | ||
status | string · text | accepted, failed, spam, discarded | ||
answers | object · jsonb | |||
record_type | string · text | evet | ||
record_id | string (uuid) · uuid | evet | ||
error | string · text | evet | ||
consent_at | string (date-time) · timestamptz | evet | ||
consent_text | string · text | evet | ||
attempts | integer · int4 | |||
resolved_by | string (uuid) · uuid | evet | app_user | |
resolved_at | string (date-time) · timestamptz | evet | ||
created_at | string (date-time) · timestamptz | |||
updated_at | string (date-time) · timestamptz |
Birincil anahtar: id
Denetimler:
CHECK ((jsonb_typeof(answers) = 'object'::text))CHECK (((status <> 'accepted'::text) OR (record_id IS NOT NULL)))
PublicFormField
Tablo public_form_field · Kaynak public_form_fields
GET /api/v1/public_form_fieldsGET /api/v1/public_form_fields/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
form_id | string (uuid) · uuid | public_form | ||
label | string · text | |||
help | string · text | evet | ||
target | string · text | record, custom, column | ||
target_key | string · text | |||
is_required | boolean · bool | |||
col_span | integer · int2 | |||
section | string · text | evet | ||
display_order | integer · int4 | |||
created_at | string (date-time) · timestamptz | |||
placeholder | string · text | evet | ||
default_value | string · text | evet | ||
visible_when | object · jsonb | evet | ||
validation | object · jsonb |
Birincil anahtar: id
Tekil: form_id, target, target_key
Denetimler:
CHECK ((length(btrim(label)) > 0))CHECK ((col_span = ANY (ARRAY[1, 2])))CHECK (((jsonb_typeof(validation) = 'object'::text) AND ((visible_when IS NULL) OR (jsonb_typeof(visible_when) = 'object'::text))))
PublicForm
Tablo public_form · Kaynak public_forms
GET /api/v1/public_formsGET /api/v1/public_forms/{id}
| Sütun | Tür | Boş olabilir | İzin verilen değerler | Bağlı olduğu tablo |
|---|---|---|---|---|
id | string (uuid) · uuid | |||
organization_id | string (uuid) · uuid | organization | ||
workspace_id | string (uuid) · uuid | workspace | ||
kind | string · text | lead, table | ||
slug | string · text | |||
title | string · text | |||
description | string · text | evet | ||
success_message | string · text | evet | ||
is_active | boolean · bool | |||
created_by | string (uuid) · uuid | evet | app_user | |
created_at | string (date-time) · timestamptz | |||
updated_at | string (date-time) · timestamptz | |||
data_table_id | string (uuid) · uuid | evet | data_table | |
saved_view_id | string (uuid) · uuid | evet | ||
consent_text | string · text | evet | ||
redirect_url | string · text | evet | ||
settings | object · jsonb |
Birincil anahtar: id
Denetimler:
CHECK (((redirect_url IS NULL) OR (redirect_url ~ '^https?://'::text)))CHECK ((jsonb_typeof(settings) = 'object'::text))CHECK (((slug ~ '^[a-z0-9]+(-[a-z0-9]+)*$'::text) AND ((length(slug) >= 1) AND (length(slug) <= 80))))CHECK (((kind = 'table'::text) = (data_table_id IS NOT NULL)))
Olaylar
İş akışları ve webhook'lar bu olaylara tepki verir.
| Olay | Ne olur | Taşıdığı alanlar |
|---|---|---|
forms.fields_changed | Bir formun alan listesi değiştirildi. | id, count |
forms.form_closed | Herkese açık bir form yanıt almayı bıraktı. | id |
forms.form_saved | Herkese açık bir form oluşturuldu ya da düzenlendi. | id, slug, isActive |
forms.submission_discarded | Başarısız bir gönderim bir kenara ayrıldı. | id, formId |
forms.submission_failed | Yeniden denenen bir gönderim yine reddedildi. | id, formId |
forms.submission_recovered | Başarısız bir gönderim yeniden denendi ve kaydedildi. | id, formId |
forms.submissions_exported | Gönderimler platformdan dışa aktarıldı. | formId, count |
forms.submitted | Bir ziyaretçi bir formu doldurdu ve bir kayıt oluşturuldu. | formId, slug, recordId |