GoliathDevelopersGet an API key
Reference/Formsgenerated from the gateway manifest

getForm

Fetch one lead-capture form by id - full configuration including fieldConfig.

POST/api/v1/callREADreadruns as the key's owner
View as Markdown

Fetch one lead-capture form by id - full configuration including fieldConfig (the page-and-field document: either a flat array of fields for a single-page form, or a { fields, steps, showStepProgress } envelope for a multi-page one - see createForm), styleConfig (the JSON object of visual styling - colors, typography, spacing, border radius, button/input styling, custom CSS; null = default styling; see updateForm for the key vocabulary), submitButtonLabel, auto-apply tags/lists, dedupe settings, notification toggles, and the assignee pool. Use fieldConfig to interpret the submittedData keys returned by listFormSubmissions; read fieldConfig before editing fields or pages, and styleConfig before restyling, so an updateForm write merges instead of clobbering.

curl https://server.goliathdata.com/api/v1/call \
  -H "Authorization: Bearer $GOLIATH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "operationId": "getForm",
    "variables": {
      "formId": "<formId>"
    }
  }'
import { GoliathClient } from '@goliath-data/sdk'

const goliath = new GoliathClient({
  apiKey: process.env.GOLIATH_API_KEY!,
  baseUrl: 'https://server.goliathdata.com',
})

const result = await goliath.forms.getForm({
  formId: '<formId>'
})
const res = await fetch('https://server.goliathdata.com/api/v1/call', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.GOLIATH_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    operationId: 'getForm',
    variables: {
      formId: '<formId>'
    }
  }),
})
const { data, errors } = await res.json()

Variables

The example sends only what the schema requires. Some operations also need one of several optional variables (one filter or another, say); the description above says which.

formIdID!required

Response

What comes back under data: a list shows as one entry, and a value as its type.

response shape
{
  "data": {
    "embedFormQuery": {
      "get": {
        "id": "<ID>",
        "name": "…",
        "slug": "…",
        "status": "DRAFT",
        "publicUrl": "…",
        "shortUrl": "…",
        "submissionCount": 0,
        "source": "…",
        "ownerType": "ORG",
        "headerText": "…",
        "descriptionText": "…",
        "submitButtonLabel": "…",
        "successMessage": "…",
        "fieldConfig": "…",
        "styleConfig": "…",
        "autoTagIds": [
          "<ID>"
        ],
        "autoListIds": [
          "<ID>"
        ],
        "allowDuplicateContact": true,
        "dedupePrimaryField": "EMAIL",
        "dedupeSecondaryField": "EMAIL",
        "enableEmailNotification": true,
        "enableSmsNotification": true,
        "enableSlackNotification": true,
        "slackChannelId": "…",
        "slackChannelName": "…",
        "slackMessageTemplate": "…",
        "collectSmsConsent": true,
        "smsTransactionalConsentText": "…",
        "smsMarketingConsentText": "…",
        "smsDisclaimerText": "…",
        "showMarketingConsent": true,
        "marketingConsentText": "…",
        "termsAndConditionsText": "…",
        "privacyPolicyUrl": "…",
        "termsOfServiceUrl": "…",
        "privacyPolicyContent": "…",
        "termsOfServiceContent": "…",
        "showPoweredBy": true,
        "gtmContainerId": "…",
        "triggerAgents": [
          {
            "id": "<ID>",
            "name": "…",
            "status": "ACTIVE"
          }
        ],
        "assignmentConfig": {
          "assignees": [
            {
              "userId": "<ID>",
              "calendarConfig": {
                "isFixed": true,
                "checkExternalCalendars": true
              }
            }
          ],
          "teamIds": [
            "<ID>"
          ],
          "participantUserIds": [
            "<ID>"
          ]
        },
        "createdAt": "2026-01-01T00:00:00.000Z",
        "updatedAt": "2026-01-01T00:00:00.000Z"
      }
    }
  }
}

Errors

Behaviour

A read. It rejects an Idempotency-Key header with 400 bad_request.