New · Pro plan

Your forms.
In your git repo.

The only major form builder with a real CLI. Declare your forms in YAML, commit them to git, review them in PRs, deploy them with ff push. Same workflow your code uses.

Requires Pro.

npm install -g @fantasticforms/cli

ff login --token ff_live_xxxxxxxxxxxx
ff init                       # scaffold form.yaml
ff push form.yaml             # deploy
ff pull <form-id> -o form.yaml
ff list

Built for builders

Tally, Typeform, Jotform — all GUI-only. Fantastic Forms gives you the same elegant builder, plus a CLI for when clicking gets old.

Form-as-code

YAML in your repo. Reviews, history, blame, rollback — all the things git already gives you for code.

Schema validation

`ff validate` exits 1 on errors. Drop it in your pre-commit hook or your GitHub Action.

Same API surface

Reuses your Pro API key. No new auth model, no new endpoints. Hits the same backend the web app does.

Pro-only

API keys are gated to the Pro plan. Free-plan keys are rejected with HTTP 402.

A form is just a YAML file.

All 44+ field types from the Form Builder map cleanly to YAML. The CLI ships with a starter template and a schema validator. Pull any existing form into YAML to use as a reference:

ff pull <form-id> -o my-form.yaml
  • Round-trips losslessly (`ff push` after `ff pull` is a no-op)
  • Server-managed fields (created_at, version, short_id) auto-stripped on pull
  • Re-pushing keeps the same form ID — no duplicates
  • Works with any text editor, any git provider, any CI
# form.yaml — commit this to git
title: Customer feedback
status: published
pages:
  - id: p1
    title: Page 1
    elements:
      - id: name
        type: full_name
        label: What's your name?
        required: true
      - id: rating
        type: rating
        label: How likely are you to recommend us?
        required: true
      - id: feedback
        type: long_text
        label: Tell us more
        required: false

Every command

CommandWhat it does
ff login --token <key>Save your Pro API key (chmod 600 on the config file).
ff logoutForget your saved key.
ff whoamiShow which account is logged in.
ff init [--from <form-id>]Scaffold a form.yaml, or pull an existing form into one.
ff push [file] [--dry-run]Create or update a form from YAML.
ff pull <form-id> [-o file]Export a form to YAML (stdout or file).
ff listList your forms.
ff validate [file]Schema-check a YAML file. Exits 1 on errors.
ff submissions list <form-id> [-n 50]Recent submissions, newest first.
ff submissions export <form-id> -f csvBulk export to CSV or JSON.
ff webhook test <url>POST a realistic fake submission to debug your endpoint.
Recommended

Validate forms in CI.

Drop `ff validate forms/*.yaml` into your pull-request workflow. Catch broken field types, missing labels, and orphaned conditional rules before they ever reach production.

Zero runtime, zero infrastructure — the validator runs entirely client-side from the npm package.

# .github/workflows/forms.yml
name: Validate forms
on: [pull_request]
jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npm install -g @fantasticforms/cli
      - run: ff validate forms/*.yaml

Common questions

Do I need to be on the Pro plan?+
Yes. API keys are gated to Pro ($99/mo). Free-plan keys are rejected with HTTP 402. Generate a key at /developer once you upgrade.
Is the CLI open source?+
Yes, MIT-licensed. The source lives at github.com/fantasticforms/cli. PRs welcome.
What happens if I push a YAML file that's invalid?+
The CLI runs a local schema validation first. If it passes locally, the backend re-validates on receive. Bad fields are rejected with a clear error — your form is never left in a half-updated state.
Can I use the CLI against a self-hosted instance?+
Yes. Set FF_API_URL (or pass --api-url to `ff login`) and point it at your backend. Auth flow is identical.
Does the CLI work with the MCP server?+
They're siblings — both use the same Pro API key. The CLI is for humans typing in a terminal; MCP is for LLM agents calling tools. Use whichever fits your workflow.

Ship forms like you ship code.

Generate a Pro API key and install the CLI in under 60 seconds.