foxform_list_forms
List FoxForm forms
List the forms owned by the authenticated FoxForm account, newest first.
Args:
- page (number): 1-based page number (default 1)
- limit (number): page size, 1-100 (default 20)
- response_format ('markdown' | 'json'): output format (default markdown)
Returns: { total, page, limit, count, forms: [{ id, title, status, slug, public_url, questions_count, updated_at }] }
The public link of a form is `public_url` (`https://forms.foxform.app/<slug>`) — always use this exact value, do NOT build the URL yourself (the public domain is forms.foxform.app, not foxform.app). `public_url` is only live when `status` is 'published'.
Use this first to discover form IDs, then call foxform_get_form / foxform_get_form_analytics.
输入参数pagelimitresponse_format
foxform_get_form
Get a FoxForm form
Fetch a single form by ID, including its full question list, per-screen conditional logic and settings.
Args:
- form_id (string): the form's ID (from foxform_list_forms)
- response_format ('markdown' | 'json')
Returns { form, public_url }: the full form object (id, title, description, slug, status, theme, questions[], thank_you_message, timestamps, plus `format` and — when set — `sections`, `chatbot_skin`, `chatbot_profile`) plus `public_url` — the public link (`https://forms.foxform.app/<slug>`), which is live only when status is 'published'. Use `public_url` verbatim; never build the URL yourself (the public domain is forms.foxform.app, not foxform.app).
Each screen in `questions[]` carries its own `logic` (branching / conditional display) and, for choice screens, `choices[]`/`images[]` with their `points` and `value`. The markdown output summarises every rule; use response_format 'json' to get the exact stored objects (that's the shape foxform_update_form expects back).
Form format (DEVF-296 / DEVF-322): pass `format` to choose how the form is presented.
- 'single_question' (default): one screen at a time (classic).
- 'single_page': every screen on one scrollable page. Optionally group screens into pages with `sections`: `[{ id }]` in order (the 'Section N' label comes from position; no editable title).
- 'chatbot': an Instagram/WhatsApp DM-style conversation. Set `chatbot_skin` ('instagram' | 'whatsapp', default instagram) and `chatbot_profile` (all fields optional, each with a fallback). The question/branching engine is unchanged — only the presentation differs.
These fields require the account's form-format feature to be enabled (live in production); when off the API ignores them and the form stays single_question.
CONDITIONAL LOGIC (branching), per screen — stored in `questions[].logic`:
logic.conditionalNavigationV2 = {
enabled: true,
groups: [ // groups are OR-joined; FIRST matching group wins
{
id: "gr
输入参数form_id必填response_format
foxform_list_responses
List form responses
List submitted responses for a form, newest first.
Args:
- form_id (string): the form's ID
- page (number): 1-based page (default 1)
- limit (number): page size, 1-100 (default 20)
- response_format ('markdown' | 'json')
Returns: { total, page, limit, count, responses: [{ id, submitted_at, answers }] }.
For aggregate metrics use foxform_get_form_analytics; for a full dump use foxform_export_responses.
输入参数pagelimitform_id必填response_format
foxform_get_response
Get a single response
Fetch one response by its ID (from foxform_list_responses).
Args:
- response_id (string)
- response_format ('markdown' | 'json')
Returns the full response object (id, form_id, answers, submitted_at, metadata).
输入参数response_id必填response_format
foxform_get_form_analytics
Get form analytics
Aggregated analytics for a form: overview KPIs (total responses, form views, response rate, avg response time), the responses-over-time timeline, and per-question stats.
Args:
- form_id (string)
- response_format ('markdown' | 'json')
Returns: { overview, timeline: [{date,count}], questions: [...], response_time_distribution?, views_timeline? }.
Note: form_views / response_rate are null until the form has tracked views (forward-only).
输入参数form_id必填response_format
foxform_export_responses
Export responses as CSV
Export all responses for a form as CSV text (one row per response, columns = questions). Large exports are truncated — use foxform_list_responses with pagination for very large datasets.
Args:
- form_id (string)
Returns: raw CSV text.
输入参数form_id必填
foxform_create_form
Create a FoxForm form
Create a new form, including per-screen conditional logic. Requires a WRITE-scoped API key.
Args:
- title (string): form title (required)
- description (string, optional)
- theme (string, optional): one of amber|base|midnight|ocean|sunset|forest|lavender|minimal (default amber, the copper-to-amber FoxForm theme)
- questions (array, optional): array of screen objects ({ id, type, title, required, variableName?, choices?, logic?, ... }); omit to start empty
- thank_you_message (string, optional)
- format ('single_question' | 'single_page' | 'chatbot', optional): how the form is presented (see below)
- sections (array, optional): single_page page groups, [{ id }]
- chatbot_skin ('instagram' | 'whatsapp', optional): chatbot chrome
- chatbot_profile (object, optional): chatbot header profile ({ name, handle, followers_text, phone, status, verified, avatar_url })
Returns: { form } with the created form (including its id and slug). The form starts as a draft — call foxform_publish_form to make it live.
Screen fields are validated: unknown fields are REJECTED instead of being stored and ignored, and branching rules are cross-checked against the screen ids in the same payload.
Form format (DEVF-296 / DEVF-322): pass `format` to choose how the form is presented.
- 'single_question' (default): one screen at a time (classic).
- 'single_page': every screen on one scrollable page. Optionally group screens into pages with `sections`: `[{ id }]` in order (the 'Section N' label comes from position; no editable title).
- 'chatbot': an Instagram/WhatsApp DM-style conversation. Set `chatbot_skin` ('instagram' | 'whatsapp', default instagram) and `chatbot_profile` (all fields optional, each with a fallback). The question/branching engine is unchanged — only the presentation differs.
These fields require the account's form-format feature to be enabled (live in production); when off the API ignores them and the form stays single_question.
CONDITIONAL LOGIC (branchin
输入参数themetitle必填formatsectionsquestionsdescriptionchatbot_skinchatbot_profilethank_you_message
foxform_update_form
Update a FoxForm form
Update an existing form's fields, including each screen's conditional logic (branching). Requires a WRITE-scoped API key. Only the fields you pass are changed.
Args:
- form_id (string): the form to update (required)
- title (string, optional)
- description (string, optional)
- theme (string, optional): one of amber|base|midnight|ocean|sunset|forest|lavender|minimal
- questions (array, optional): replaces the FULL screen list — there is no per-screen patch. To add logic to one screen: call foxform_get_form with response_format 'json', edit that screen's `logic`, and send the whole array back.
- thank_you_message (string, optional)
- format ('single_question' | 'single_page' | 'chatbot', optional)
- sections (array, optional): single_page page groups, [{ id }]
- chatbot_skin ('instagram' | 'whatsapp', optional)
- chatbot_profile (object, optional): chatbot header profile ({ name, handle, followers_text, phone, status, verified, avatar_url })
Returns: { form } with the updated form.
Screen fields are validated: unknown fields are REJECTED instead of being stored and ignored (the API accepts arbitrary keys but no renderer reads them), `then.targetScreenId` must be the id of a screen in the same payload, and `{{variables}}` that no screen exposes come back as warnings.
Form format (DEVF-296 / DEVF-322): pass `format` to choose how the form is presented.
- 'single_question' (default): one screen at a time (classic).
- 'single_page': every screen on one scrollable page. Optionally group screens into pages with `sections`: `[{ id }]` in order (the 'Section N' label comes from position; no editable title).
- 'chatbot': an Instagram/WhatsApp DM-style conversation. Set `chatbot_skin` ('instagram' | 'whatsapp', default instagram) and `chatbot_profile` (all fields optional, each with a fallback). The question/branching engine is unchanged — only the presentation differs.
These fields require the account's form-format feature to be enabled (live in product
输入参数themetitleformatform_id必填sectionsquestionsdescriptionchatbot_skinchatbot_profilethank_you_message
foxform_publish_form
Publish a form
Publish a form so it's live at its public URL and can accept responses. Requires a WRITE-scoped API key.
Args:
- form_id (string)
Returns: { form, public_url } — the published form (status 'published') and its live public link `https://forms.foxform.app/<slug>`. When sharing the link with the user, use `public_url` EXACTLY as returned; do NOT build the URL yourself (the public domain is forms.foxform.app, NOT foxform.app or the API/app domain). (May fail with a plan-limit error on Free accounts.)
输入参数form_id必填
foxform_unpublish_form
Unpublish a form
Unpublish a form (takes it offline; stops accepting responses). Requires a WRITE-scoped API key.
Args:
- form_id (string)
Returns: a confirmation message.
输入参数form_id必填