Workspace API

Signup forms

Signup forms endpoints of the Zanfia Workspace API, with schemas and code samples.

3 min readLast updated Sep 30, 2026

Standalone signup forms (audience-subscription) and their submissions. config is replaced whole on PATCH — send the complete object. Product-bound forms are managed through their product and refuse deletion here (409 product-bound). All routes require a Authorization: Bearer header — see Authentication.

List signup forms

GET/forms

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Response Body

application/json

application/json

curl -X GET "https://example.com/forms"
{  "forms": [    {      "id": "string",      "name": "string",      "submitAction": "audienceSubscription",      "tagIds": [        "string"      ],      "submissionsCount": 0,      "optInMode": "double",      "redirectUrl": "string",      "confirmationRedirectUrl": "string",      "confirmationEmail": {        "subject": "string",        "intro": "string"      },      "confirmationEmailOverride": {        "enabled": true,        "subject": {          "en": "string",          "pl": "string"        },        "headline": {          "en": "string",          "pl": "string"        },        "layout": [          {            "id": "string",            "type": "text",            "text": {              "en": "string",              "pl": "string"            }          }        ],        "body": {          "en": "string",          "pl": "string"        },        "variants": {          "property1": {},          "property2": {}        },        "attachments": [          {            "kind": "media",            "mediaId": "string",            "name": "string",            "mimeType": "string",            "size": 0,            "storagePath": "string",            "url": "string"          }        ]      },      "signupPurpose": "newsletter",      "migratedFromProductId": "string",      "createdAt": "string",      "updatedAt": "string"    }  ]}
{  "error": "string",  "message": "string"}

Create a signup form

POST/forms

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

POST /forms — the dashboard's create body plus the settings the dashboard writes through a follow-up PATCH, so an API client creates a finished form in one call. config carries the phone field + SMS consent (showPhoneNumberInput, phoneNumberRequired, showSmsConsentCheckbox, smsConsentText).

Response Body

application/json

application/json

curl -X POST "https://example.com/forms" \  -H "Content-Type: application/json" \  -d '{    "name": "string"  }'
{  "formId": "string"}
{  "error": "string",  "message": "string"}

Get a signup form

GET/forms/{formId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

formId*string

Form id

Response Body

application/json

application/json

curl -X GET "https://example.com/forms/string"
{  "id": "string",  "name": "string",  "submitAction": "audienceSubscription",  "tagIds": [    "string"  ],  "submissionsCount": 0,  "optInMode": "double",  "redirectUrl": "string",  "confirmationRedirectUrl": "string",  "confirmationEmail": {    "subject": "string",    "intro": "string"  },  "confirmationEmailOverride": {    "enabled": true,    "subject": {      "en": "string",      "pl": "string"    },    "headline": {      "en": "string",      "pl": "string"    },    "layout": [      {        "id": "string",        "type": "text",        "text": {          "en": "string",          "pl": "string"        }      }    ],    "body": {      "en": "string",      "pl": "string"    },    "variants": {      "property1": {},      "property2": {}    },    "attachments": [      {        "kind": "media",        "mediaId": "string",        "name": "string",        "mimeType": "string",        "size": 0,        "storagePath": "string",        "url": "string"      }    ]  },  "signupPurpose": "newsletter",  "migratedFromProductId": "string",  "createdAt": "string",  "updatedAt": "string",  "config": {    "variant": "basic",    "scheme": "auto",    "buttonText": "string",    "emailPlaceholder": "string",    "headerText": "string",    "successMessage": "string",    "descriptionText": "string",    "color": "string",    "background": "string",    "claim": "string",    "privacyPolicyUrl": "string",    "showClaim": true,    "showHeader": true,    "showDescription": true,    "showPrivacyPolicyInfo": true,    "showFirstNameInput": true,    "firstNameRequired": true,    "showPhoneNumberInput": true,    "phoneNumberRequired": true,    "showSmsConsentCheckbox": true,    "smsConsentText": "string",    "customDomain": "string",    "termsAndPrivacyPolicyConsentRequired": true,    "showTermsUrl": true,    "termsUrl": "string"  },  "localizedConfig": {    "property1": {      "variant": "basic",      "scheme": "auto",      "buttonText": "string",      "emailPlaceholder": "string",      "headerText": "string",      "successMessage": "string",      "descriptionText": "string",      "color": "string",      "background": "string",      "claim": "string",      "privacyPolicyUrl": "string",      "showClaim": true,      "showHeader": true,      "showDescription": true,      "showPrivacyPolicyInfo": true,      "showFirstNameInput": true,      "firstNameRequired": true,      "showPhoneNumberInput": true,      "phoneNumberRequired": true,      "showSmsConsentCheckbox": true,      "smsConsentText": "string",      "customDomain": "string",      "termsAndPrivacyPolicyConsentRequired": true,      "showTermsUrl": true,      "termsUrl": "string"    },    "property2": {      "variant": "basic",      "scheme": "auto",      "buttonText": "string",      "emailPlaceholder": "string",      "headerText": "string",      "successMessage": "string",      "descriptionText": "string",      "color": "string",      "background": "string",      "claim": "string",      "privacyPolicyUrl": "string",      "showClaim": true,      "showHeader": true,      "showDescription": true,      "showPrivacyPolicyInfo": true,      "showFirstNameInput": true,      "firstNameRequired": true,      "showPhoneNumberInput": true,      "phoneNumberRequired": true,      "showSmsConsentCheckbox": true,      "smsConsentText": "string",      "customDomain": "string",      "termsAndPrivacyPolicyConsentRequired": true,      "showTermsUrl": true,      "termsUrl": "string"    }  }}
{  "error": "string",  "message": "string"}

Update a signup form

PATCH/forms/{formId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

formId*string

Form id

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

PATCH /forms/:formId — the dashboard's update body minus the internal signupPurpose.

Response Body

application/json

application/json

curl -X PATCH "https://example.com/forms/string" \  -H "Content-Type: application/json" \  -d '{}'
{  "status": "ok"}
{  "error": "string",  "message": "string"}

Delete a signup form

DELETE/forms/{formId}

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

formId*string

Form id

Response Body

application/json

application/json

curl -X DELETE "https://example.com/forms/string"
{  "status": "ok"}
{  "error": "string",  "message": "string"}

List form submissions

GET/forms/{formId}/submissions

Authorization

bearerAuth
AuthorizationBearer <token>

API key from Dashboard → Integrations → API, MCP and CLI.

In: header

Path Parameters

formId*string

Form id

Query Parameters

limit?integer
Rangevalue <= 1000

Response Body

application/json

application/json

curl -X GET "https://example.com/forms/string/submissions"
{  "submissions": [    {      "id": "string",      "email": "string",      "firstName": "string",      "clientId": "string",      "tagIds": [        "string"      ],      "language": "string",      "createdAt": "string",      "session": {        "roomId": "string",        "startAt": "string",        "joinUrl": "string"      },      "attendance": {        "watchedSeconds": 0,        "maxPositionSeconds": 0,        "firstSeenAt": "string",        "lastSeenAt": "string"      }    }  ]}
{  "error": "string",  "message": "string"}

Was this article helpful?

Related articles

Spotted something off? Tell us at support@zanfia.com.