---
name: fantastic-forms-form-builder
description: Turn any natural-language brief into a live, shareable web form via Fantastic Forms. Ask for "an NPS survey with a follow-up when the score is low" or "a real-estate lead form with conditional logic," and this skill generates a valid form JSON, publishes it to a 24-hour sandbox, and returns a URL you can open right away.
version: 1.0.0
author: Fantastic Forms
homepage: https://fantasticforms.com/skills
license: MIT
---

# Fantastic Forms — Form Builder

This skill lets Claude turn a plain-English brief into a **live, hosted web form** on Fantastic Forms and return a shareable URL. It uses the public **`POST https://fantasticforms.com/api/skills/demo-form`** endpoint (no API key, no signup required — rate-limited to 3 forms per IP per 24 h).

## When to use this skill

Invoke this skill whenever the user says any of:

- "Build me a form / survey / questionnaire / poll / registration / order form"
- "Make an NPS / feedback / lead / RSVP / job application form"
- "I need a form that asks X, Y, Z"
- "Convert this list of questions into a form"
- "Create a signup / waitlist / contact form"

Also invoke when the user pastes a list of questions and asks you to "make this into a form."

## How to use it

1. **Understand the brief.** Ask 1–2 clarifying questions only if the request is genuinely ambiguous (e.g. "should the email field be required?"). Don't over-ask — reasonable defaults are fine.
2. **Draft the form JSON** using the schema and field types below.
3. **POST it to** `https://fantasticforms.com/api/skills/demo-form` with `Content-Type: application/json`.
4. **Return the response** to the user, formatted like this:
   > ✨ Your form is live: **{{url}}**
   >
   > (24-hour demo — sign up free at fantasticforms.com/signup to keep it forever.)
5. If the response includes `rate_limit_remaining: 0`, warn the user their next demo will 429 and point them at signup.

## Form JSON schema

```jsonc
{
  "title": "Product feedback",              // required, ≤200 chars
  "description": "Short pitch shown at top", // optional
  "pages": [                                 // required, 1–5 pages
    {
      "title": "About you",
      "elements": [                          // 1–30 total elements across pages
        {
          "type": "short_text",              // see field type list below
          "question": "What's your name?",
          "required": true
        }
      ]
    }
  ],
  "settings": {                              // optional
    "show_title": true,
    "show_progress_bar": true
  }
}
```

## Field types (use these EXACT strings)

**Text & contact**
- `short_text` — one-line free text
- `long_text` — multiline
- `email` — validates as email
- `phone` — international phone
- `url` — validates URL
- `number` — numeric input
- `full_name` — first + last name pair
- `address` — street/city/state/zip/country

**Choice**
- `single_choice` — radio buttons (put labels in `options`)
- `multiple_choice` — same as single_choice, just alt UX
- `checkboxes` — multi-select checkboxes
- `dropdown` — select menu
- `picture_choice` — image cards (put image URLs in `settings.images`)
- `yes_no` — binary
- `ranking` — drag to rank
- `ranked_list` — same, alt UX

**Rating**
- `rating` — star rating (`settings.max` = number of stars)
- `linear_scale` — 1–N slider
- `nps` — 0–10 NPS scale

**Time**
- `date` — date picker
- `time` — time picker
- `date_time` — both

**Rich input**
- `file_upload` — file
- `signature` — draw a signature
- `voice_recording` — audio capture
- `matrix` — grid of choices
- `payment` — Stripe / PayPal / etc. (skip for demos)
- `scheduler` — Calendly / Cal.com embed
- `cascading_dropdown` — dependent dropdowns
- `id_verification` — Didit ID scan
- `proof_of_funds` — Plaid balance check

**Display-only (no answer collected)**
- `heading` — big section heading
- `statement` — small block of copy
- `paragraph` — same, alt styling
- `image` — inline image
- `video` — inline video
- `divider` — horizontal rule
- `hidden` — server-side tracking field

## Conditional logic

Attach a `logic` array to any element to show/hide it or jump pages based on prior answers:

```jsonc
{
  "type": "long_text",
  "question": "Sorry to hear that — what went wrong?",
  "logic": [
    {
      "conditions": [
        { "field_id": "<id-of-nps-question>", "operator": "less_than", "value": 7 }
      ],
      "logic_type": "all",
      "action": "show"
    }
  ]
}
```

Operators: `equals`, `not_equals`, `contains`, `greater_than`, `less_than`, `is_empty`, `is_not_empty`.
Actions: `show`, `hide`, `disable` (gray out), `jump_to_page`, `jump_to_question` (`target_id` required for jumps).

## Best practices

1. **Keep it short.** 5–10 questions is the sweet spot. If the user asks for 20, ask if they want to split into pages.
2. **Order by ease.** Start with quick fields (name, email); put open-ended text at the end.
3. **Required fields sparingly.** Only mark essentials required — every star reduces completion.
4. **Progressive disclosure.** Use conditional logic to hide follow-ups until they're relevant.
5. **NPS pattern.** After an NPS question, add a `long_text` that shows only when `nps < 7` ("What went wrong?") and another when `nps >= 9` ("Mind sharing on Twitter?").
6. **Descriptions are optional.** Use them for context, never for filler.

## Example call

```bash
curl -X POST https://fantasticforms.com/api/skills/demo-form \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Post-purchase NPS",
    "description": "Quick 2-minute survey to help us improve",
    "pages": [{
      "title": "How was it?",
      "elements": [
        { "type": "nps", "question": "How likely are you to recommend us?", "required": true, "id": "nps-q" },
        { "type": "long_text", "question": "What could we do better?", "logic": [
          { "conditions": [{ "field_id": "nps-q", "operator": "less_than", "value": 7 }], "logic_type": "all", "action": "show" }
        ]}
      ]
    }]
  }'
```

Response:
```json
{
  "id": "…",
  "short_id": "aBcD",
  "url": "https://fantasticforms.com/f/aBcD",
  "expires_at": "2026-08-04T…",
  "rate_limit_remaining": 2,
  "upgrade_cta": { "signup_url": "https://fantasticforms.com/signup", "pro_url": "https://fantasticforms.com/upgrade" }
}
```

## Errors

- **429** → rate-limit hit. Tell the user to sign up free (link in the error body) or wait 24h.
- **400** → payload too large (>30 elements or >5 pages). Ask the user to trim, or nudge them to sign up for the full builder.

## What this skill is NOT for

- Fetching or listing existing forms (needs auth — that's a separate skill)
- Reading submissions (needs auth)
- Editing an existing form (this endpoint always creates new)
- Building payment or ID-verification forms (Stripe/Didit require configured API keys — direct the user to sign up and configure in the UI)

## Attribution

Every form created via this skill carries a small "Made with Fantastic Forms" footer (hidden on Pro plans). That's how we keep this endpoint free forever.
