Navigation

Forms

Forms are publishable to external URLs for customer intake — bug reports, feature requests, lead capture. Submissions can create tasks or datatable rows.

The API exposes read-only access to forms and their submissions. Form creation, editing, and publishing happens in the UI.

GET /forms

List all forms in the workspace.

curl -H "Authorization: Bearer kdt_..." \
     https://api.konduit.work/v1/forms

Response:

{
  "forms": [
    {
      "id": "...",
      "name": "Bug Report",
      "slug": "bug-report",
      "target_type": "task",
      "target_id": "list_id_xxx",
      "is_published": 1,
      "submission_count": 47,
      "created_at": 1735689600,
      "updated_at": 1735689600
    }
  ]
}
Field Meaning
slug The URL slug at konduit.work/f/<slug>
target_type task or datatable_row — what each submission creates
target_id The list ID (for task) or table ID (for datatable_row)
is_published 1 if the form is publicly reachable, 0 if draft
submission_count Total submissions over the form's lifetime

GET /forms/{formId}

Returns the full form definition including field_config, rules, and settings. Use this to render the form in your own integration or pre-validate submissions before sending users to the public URL.

curl -H "Authorization: Bearer kdt_..." \
     https://api.konduit.work/v1/forms/<formId>

Response:

{
  "id": "...",
  "name": "Bug Report",
  "slug": "bug-report",
  "field_config": [
    { "id": "field_1", "label": "Title", "type": "text", "required": true },
    { "id": "field_2", "label": "Severity", "type": "dropdown",
      "options": ["low", "medium", "high"] }
  ],
  "rules": { ... },
  "settings": { ... }
}

GET /forms/{formId}/submissions

List submissions for a form.

Query parameters:

  • limit (default 50, max 200), offset
  • since — unix timestamp; only submissions created after this time
curl -H "Authorization: Bearer kdt_..." \
     "https://api.konduit.work/v1/forms/<formId>/submissions?limit=50"

Response:

{
  "submissions": [
    {
      "id": "...",
      "data": { "name": "Alice", "severity": "high" },
      "created_entity_type": "task",
      "created_entity_id": "task_id_xxx",
      "created_at": 1735689600
    }
  ],
  "limit": 50, "offset": 0
}

created_entity_type is task or datatable_row and created_entity_id is the resulting record. Use these to follow the submission into the rest of the API — fetch the resulting task with GET /tasks/{taskId} or the resulting row with GET /datatables/{tableId}/rows/{rowId}.

Polling pattern

To sync form submissions into your system:

# First call: get everything
GET /forms/{formId}/submissions?limit=200

# Subsequent calls: incremental
GET /forms/{formId}/submissions?since=<last_seen_timestamp>&limit=200

For real-time delivery, configure an automation rule with a Webhook action — see Webhooks.

Next