Customiser forms
Update a form
Applies an RFC 7396 JSON Merge Patch to one form: properties omitted from
the body are unchanged, and null clears a nullable property. Arrays
replace wholesale, so sending fields replaces the whole field document
and sending recipient_emails replaces the whole receiver list.
Overview
An empty
object {} is a valid no-op, and an empty fields list clears the field
document. The create operation documents the whole field schema; the same
properties and the same per-input-type rules apply here. Read-only and
unknown properties are rejected. Requires customisers:write.
Changing recipient_emails also clears any suppression the mail
transport recorded against the old receivers and resumes delivery, which
is the same repair the merchant admin performs.
An Idempotency-Key is optional here: sending one makes the update safe
to retry (an exact repeat replays the original response; the same key with
a different body is a 409). The update clears the customiser's cached
storefront configuration and runs the advisory language sync, and never
regenerates Shopify products, product images, or the product cache.
Authorisation
Bearer token required. Include it in theAuthorization header.
Required scope: customisers:write
Path parameters
The customiser id.
Example: 1
The form id.
Example: 7
Request body
Request body example
{
"fields": [
{
"name": "Email",
"input_type": "email"
}
],
"name": "Request a quote",
"description": "Tell us about your project",
"recipient_emails": [
"sales@example.com"
],
"redirect_url": "https://example.com/thank-you"
}curl https://web.signcustomiser.com/api/v3/customisers/1/forms/7 \
--request PATCH \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"fields": [
{
"name": "Email",
"input_type": "email"
}
],
"name": "Request a quote",
"description": "Tell us about your project",
"recipient_emails": [
"sales@example.com"
],
"redirect_url": "https://example.com/thank-you"
}'{
"data": {
"object": "form",
"id": 7,
"customiser_id": 42,
"name": "Request a quote",
"description": "Tell us about your project",
"form_type": "quote",
"button_label": "Send",
"subject": "New quote request",
"recipient_emails": [
"sales@example.com"
],
"save_customer_details": true,
"post_submission_action": "default",
"redirect_url": null,
"emails_enabled": true,
"suppressed_emails": [],
"fields": [
{
"field_id": "3f2a9c1e-5d6b-4a7c-8e9f-0a1b2c3d4e5f",
"name": "Email",
"input_type": "email",
"required": true,
"customer_field": "email",
"info": null,
"placeholder": null,
"checkbox_value": null,
"min": null,
"max": null,
"min_date": null,
"max_date": null,
"allow_multiple": false,
"reply_to": true,
"options": []
}
],
"sort_order": 1,
"created_at": "2026-08-14T00:00:00Z",
"updated_at": "2026-08-14T00:05:00Z"
},
"links": {
"self": "https://web.signcustomiser.com/api/v3/customisers/42/forms/7",
"documentation": "https://www.signcustomiser.com/help/api/"
},
"meta": {
"api_version": "v3",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
}{
"type": "https://www.signcustomiser.com/help/api/problems/malformed_json",
"title": "Malformed JSON",
"status": 400,
"code": "malformed_json",
"detail": "The request body is not valid JSON: Syntax error.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/missing_api_key",
"title": "Missing API key",
"status": 401,
"code": "missing_api_key",
"detail": "Provide a store API key as a bearer token.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/insufficient_scope",
"title": "Insufficient scope",
"status": 403,
"code": "insufficient_scope",
"detail": "This operation requires the customisers:write scope.",
"required_scopes": [
"customisers:write"
],
"granted_scopes": [
"customisers:read"
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/resource_not_found",
"title": "Resource not found",
"status": 404,
"code": "resource_not_found",
"detail": "The requested resource does not exist or does not belong to the authenticated store.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/idempotency_key_conflict",
"title": "Idempotency key conflict",
"status": 409,
"code": "idempotency_key_conflict",
"detail": "This Idempotency-Key was already used for a different request body on this operation.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/request_too_large",
"title": "Request too large",
"status": 413,
"code": "request_too_large",
"detail": "The request body must not exceed 2 MiB.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/form_type_not_supported",
"title": "Form type not supported",
"status": 422,
"code": "form_type_not_supported",
"detail": "This form's stored type is not one this API publishes, so it predates the current catalogue and no write can safely round-trip it.",
"errors": [
{
"pointer": "/form_type",
"code": "form_type_not_supported",
"detail": "This form's stored type is outside the published catalogue."
}
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/validation_failed",
"title": "Validation failed",
"status": 422,
"code": "validation_failed",
"detail": "The request payload failed validation.",
"errors": [
{
"pointer": "/emails_enabled",
"code": "invalid",
"detail": "The emails_enabled field is read-only and cannot be sent on a write."
}
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/rate_limited",
"title": "Too many requests",
"status": 429,
"code": "rate_limited",
"detail": "You have exceeded the request limit for this API key.",
"retry_after": 37,
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}