{
    "contract_version": "1.1.0",
    "generated_at": "2026-10-12T00:00:00+00:00",
    "issuer": "https://app.formformform.com",
    "scopes": {
        "mcp:use": "Confirm who you are on FormFormForm",
        "forms:read": "List and read your forms and their questions",
        "forms:write": "Create, change and delete your forms",
        "submissions:read": "Read the responses people have sent to your forms",
        "ai:generate": "Draft forms for you with FormFormForm AI",
        "offline_access": "Stay connected without asking you to sign in again"
    },
    "limits": {
        "max_fields": 25,
        "max_fields_with_button": 26,
        "max_options": 25,
        "max_prompt_length": 2000,
        "title_max": 250,
        "description_max": 1990,
        "label_max": 250,
        "placeholder_max": 250,
        "field_description_max": 250,
        "default_value_max": 250,
        "paragraph_content_max": 9990,
        "option_max": 250,
        "forms_per_page": 50,
        "submissions_per_page": 25,
        "templates_per_page": 20
    },
    "field_types": [
        {
            "type": "short_text",
            "label": "Short text",
            "group": "input",
            "display_only": false,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "A single line of free text: names, job titles, company, city, order number, subject.",
            "settings": [
                "field_width"
            ],
            "example": {
                "type": "short_text",
                "label": "Full name",
                "placeholder": "Jane Doe",
                "is_required": true
            }
        },
        {
            "type": "long_text",
            "label": "Long text",
            "group": "input",
            "display_only": false,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "An answer of a sentence or more: messages, descriptions, feedback, \"tell us about…\".",
            "settings": [
                "rows",
                "field_width"
            ],
            "example": {
                "type": "long_text",
                "label": "How can we help?",
                "placeholder": "Tell us what you need",
                "is_required": true,
                "settings": {
                    "rows": 4
                }
            }
        },
        {
            "type": "email",
            "label": "Email",
            "group": "input",
            "display_only": false,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "An email address. Always prefer this over short_text so the answer is validated.",
            "settings": [
                "field_width"
            ],
            "example": {
                "type": "email",
                "label": "Email address",
                "placeholder": "you@example.com",
                "is_required": true
            }
        },
        {
            "type": "number",
            "label": "Number",
            "group": "input",
            "display_only": false,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "A quantity, count, rating, age or price — anything that is arithmetic rather than text.",
            "settings": [
                "min",
                "max",
                "field_width"
            ],
            "example": {
                "type": "number",
                "label": "Number of guests",
                "placeholder": "2",
                "is_required": true,
                "settings": {
                    "min": 1,
                    "max": 20
                }
            }
        },
        {
            "type": "phone",
            "label": "Phone",
            "group": "input",
            "display_only": false,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "A phone number. Keep it optional unless someone will actually call.",
            "settings": [
                "field_width"
            ],
            "example": {
                "type": "phone",
                "label": "Phone number",
                "placeholder": "(555) 123-4567",
                "is_required": false
            }
        },
        {
            "type": "date",
            "label": "Date",
            "group": "input",
            "display_only": false,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "A calendar date: appointment, event date, deadline, date of birth.",
            "settings": [
                "field_width"
            ],
            "example": {
                "type": "date",
                "label": "Preferred date",
                "is_required": true
            }
        },
        {
            "type": "dropdown",
            "label": "Dropdown",
            "group": "choice",
            "display_only": false,
            "requires_options": true,
            "label_required": true,
            "generatable": true,
            "use_when": "Pick exactly one from five or more choices, or from a long list (country, department, product).",
            "settings": [
                "field_width"
            ],
            "example": {
                "type": "dropdown",
                "label": "How did you hear about us?",
                "options": [
                    "Search engine",
                    "Social media",
                    "Friend or colleague",
                    "Advertisement",
                    "Other"
                ],
                "is_required": false
            }
        },
        {
            "type": "radio",
            "label": "Radio buttons",
            "group": "choice",
            "display_only": false,
            "requires_options": true,
            "label_required": true,
            "generatable": true,
            "use_when": "Pick exactly one from two to four choices that are worth showing at a glance.",
            "settings": [
                "field_width"
            ],
            "example": {
                "type": "radio",
                "label": "Is this your first visit?",
                "options": [
                    "Yes",
                    "No"
                ],
                "is_required": true
            }
        },
        {
            "type": "checkbox",
            "label": "Checkboxes",
            "group": "choice",
            "display_only": false,
            "requires_options": true,
            "label_required": true,
            "generatable": true,
            "use_when": "Pick any number of choices, or a single consent box (one option holding the agreement text).",
            "settings": [
                "field_width"
            ],
            "example": {
                "type": "checkbox",
                "label": "Which topics interest you?",
                "options": [
                    "Product updates",
                    "Events",
                    "Case studies"
                ],
                "is_required": false
            }
        },
        {
            "type": "file",
            "label": "File upload",
            "group": "upload",
            "display_only": false,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "The visitor has to attach something: a CV, a photo of the damage, a signed document.",
            "settings": [
                "field_width"
            ],
            "example": {
                "type": "file",
                "label": "Attach your résumé",
                "is_required": true
            }
        },
        {
            "type": "heading",
            "label": "Heading",
            "group": "layout",
            "display_only": true,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "The form title (first field, label \"{title}\") and the title of each later section.",
            "settings": [],
            "example": {
                "type": "heading",
                "label": "{title}",
                "is_required": false
            }
        },
        {
            "type": "paragraph",
            "label": "Paragraph",
            "group": "layout",
            "display_only": true,
            "requires_options": false,
            "label_required": false,
            "generatable": true,
            "use_when": "A sentence of explanation or instruction. Put the text in `content` as HTML; leave `label` empty.",
            "settings": [],
            "example": {
                "type": "paragraph",
                "content": "<p>Fill in the form below and we will get back to you within one business day.</p>",
                "is_required": false
            }
        },
        {
            "type": "divider",
            "label": "Divider",
            "group": "layout",
            "display_only": true,
            "requires_options": false,
            "label_required": false,
            "generatable": true,
            "use_when": "A thin rule separating two groups of fields on the same page. No label, no content.",
            "settings": [],
            "example": {
                "type": "divider",
                "is_required": false
            }
        },
        {
            "type": "image",
            "label": "Image",
            "group": "layout",
            "display_only": true,
            "requires_options": false,
            "label_required": false,
            "generatable": false,
            "use_when": "Shows a picture the form owner uploaded in the editor.",
            "settings": [],
            "example": {
                "type": "image",
                "is_required": false
            }
        },
        {
            "type": "hidden",
            "label": "Hidden field",
            "group": "layout",
            "display_only": false,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "A value the visitor never sees but that is stored with the answer, such as a campaign or source tag. Set `default_value`.",
            "settings": [],
            "example": {
                "type": "hidden",
                "label": "Source",
                "default_value": "website",
                "is_required": false
            }
        },
        {
            "type": "page_break",
            "label": "Page break",
            "group": "layout",
            "display_only": true,
            "requires_options": false,
            "label_required": false,
            "generatable": true,
            "use_when": "Splits a long form into steps. Only for forms of roughly ten fields or more, and never directly before the submit button.",
            "settings": [],
            "example": {
                "type": "page_break",
                "is_required": false
            }
        },
        {
            "type": "payment",
            "label": "Products & payment",
            "group": "input",
            "display_only": true,
            "requires_options": false,
            "label_required": true,
            "generatable": false,
            "use_when": "Configured manually by the form owner for product checkout.",
            "settings": [],
            "example": {
                "type": "payment",
                "label": "Choose products",
                "is_required": false
            }
        },
        {
            "type": "submit_button",
            "label": "Submit button",
            "group": "layout",
            "display_only": true,
            "requires_options": false,
            "label_required": true,
            "generatable": true,
            "use_when": "Always the very last field, exactly once. Label it with the action (\"Send message\", \"Book my seat\") rather than \"Submit\".",
            "settings": [
                "button_alignment"
            ],
            "example": {
                "type": "submit_button",
                "label": "Send message",
                "is_required": false
            }
        }
    ],
    "setting_shapes": {
        "rows": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "description": "Visible height of a long text box, in lines (2-12).",
            "applies_to": [
                "long_text"
            ]
        },
        "min": {
            "type": "number",
            "description": "Smallest value a number field accepts.",
            "applies_to": [
                "number"
            ]
        },
        "max": {
            "type": "number",
            "description": "Largest value a number field accepts.",
            "applies_to": [
                "number"
            ]
        },
        "field_width": {
            "type": "string",
            "enum": [
                "small",
                "medium",
                "large",
                "full"
            ],
            "description": "How wide the field sits on the page: small, medium, large or full.",
            "applies_to": [
                "short_text",
                "long_text",
                "email",
                "number",
                "phone",
                "date",
                "dropdown",
                "radio",
                "checkbox",
                "file"
            ]
        },
        "button_alignment": {
            "type": "string",
            "enum": [
                "left",
                "center",
                "right"
            ],
            "description": "Where the submit button sits: left, center or right.",
            "applies_to": [
                "submit_button"
            ]
        }
    },
    "invariants": [
        "The first field is always a heading; one is inserted with the form title if you omit it.",
        "The last field is always exactly one submit_button; extras are removed and one is appended.",
        "Leading, trailing and repeated divider/page_break elements are collapsed.",
        "The 'image' element cannot be created through this API.",
        "Paragraph HTML is sanitised on every save; what you send is not always what is stored.",
        "Positions are re-stamped 0..n-1 after every write."
    ],
    "error_codes": [
        "bad_request",
        "unauthenticated",
        "insufficient_scope",
        "forbidden",
        "form_not_found",
        "field_not_found",
        "submission_not_found",
        "template_not_found",
        "form_encryption_locked",
        "validation_failed",
        "generation_failed",
        "rate_limited",
        "generation_unavailable",
        "server_error"
    ]
}
