Integration details
Description
FormEdge helps users create, edit, preview, and publish forms and landing pages, review submissions, manage notification settings and assets, and configure custom domains through ChatGPT.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Form & Survey Builders
- Secondary Subcategories
- None listed
- Brand
- FormEdge
- Access
- Account required
- First tracked
- 2026-07-31
- Tool count
- 48
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT Form & Survey Builders
View Category48 tools agents can invoke
Changes the subdomain (slug) of the workspace's public URL (requires the write:tenant-settings scope). [Destructive operation] Changing it after it has been exposed (exposed=true) permanently retires the old URL with a redirect — it can never be claimed again — and consumes the change allowance (3 changes in the last 365 days; see remaining_changes). Run it only on an explicit instruction from the user, and before running it check exposed and the remaining allowance with get_tenant_slug and tell the user about the impact (the old URL is retired permanently and the allowance is consumed). An invalid format or a reserved word returns 422; a taken slug or an exhausted allowance returns 409. It also returns 409 while the slug host feature is disabled (base_domain=null).
update_tenant_slug
Checks whether a slug (the subdomain of the public URL) is available (requires the read:tenant-settings scope). Intended as a pre-check before update_tenant_slug. When available=false, reason is invalid (bad format), reserved (reserved word) or taken (already in use).
check_tenant_slug_availability
Call this after the PUT to the upload_url has completed; it validates the upload and finalizes it as an asset (requires the write:assets scope; it then counts toward storage usage). After confirmation, the public_url in the response can be used on pages (as an image URL in update_page_draft, etc.). Calling it again for an already confirmed asset succeeds idempotently. Calling it before the PUT or after the URL has expired returns 422.
confirm_asset_upload
Creates a form in draft status. fields can create the field definitions at the same time (display order follows the array order). Check the available field types and constraints with get_form_field_types first. Validation violations are returned as 422 with errors ([{field, message}]); fix them following the field path and retry. Publish with publish_form (requires the publish:forms scope). For a form meant to be embedded in a page, you may go straight through update_form standalone_public=false → publish_form → placing it on the page (see the publish_form description).
create_form
Creates a page in draft state from a template. Get template_key from get_page_templates. blocks are not sent to this tool; edit them after creation with update_page_draft (follow the vocabulary and rules in capabilities / authoring_notes from get_page_templates(include_capabilities: true)). [Data minimization] Build a new page only from get_page_templates(include_capabilities: true) (vocabulary and structure) and this new draft (get_page only for this new page). Do not call list_pages or get_page on other existing pages to look at examples or block structures (do not read existing pages unrelated to the request).
create_page
Deletes a custom domain (requires the write:custom-domains scope). A domain that is referenced as the publishing domain (custom_domain_id) of a page or form cannot be deleted and returns 409 (change the publishing domain on those pages/forms first). Returns 404 for an unknown ID. Returns 204 (no body) on success.
delete_custom_domain
Deletes the form (requires the delete:forms scope). This cannot be undone. Not only the definition but also the submission data becomes inaccessible, so use unpublish_form if you only want to stop accepting submissions. A form placed on a published page cannot be deleted and returns 409 (remove the form from the page and republish it first). Returns 404 for a deleted or unknown ID. Returns 204 (no body) on success.
delete_form
Deletes the page (requires the delete:pages scope). This cannot be undone. A published page can also be deleted, in which case it is unpublished at the same time (the public URL returns 404). If you only want to rebuild it, edit it with update_page_draft instead of deleting it. If you only want to stop publishing it, use unpublish_page. Returns 404 for a deleted or unknown ID. Returns 204 (no body) on success.
delete_page
Returns the workspace's branding settings (requires the read:tenant-settings scope). hide_powered_by is whether the "Powered by" badge in the footer is hidden, and hide_powered_by_allowed is whether the current plan allows hiding it. The badge setting is per workspace and applies at once to the footer of every page, every form and every completion screen (there is no per-page control). favicon_url is the workspace-wide favicon image URL (null = not set): it is used by every public page without its own favicon_url (set with patch_page_draft or update_page_draft) and always by the page assigned to the root of a public domain.
get_branding_settings
Returns a single form with its field definitions. fields can be passed to replace_form_fields as is. auto_reply in the response is the acknowledgement email sent to the respondent (enabled=false with the other members null means it is not configured); change it with update_form. acceptance in the response is the acceptance control (submission window, response limit and the notice shown while not accepting); all of its members being null means nothing is configured, and it is changed with update_form too.
get_form
Returns the workspace's language (locale) and time zone (timezone) (requires the read:tenant-settings scope). The settings are per workspace and determine the language of the notification emails sent to the workspace (submission notifications, invitations and the default wording of auto-reply emails) and the time zone used for submission timestamps in notification bodies and CSV exports, for the day boundaries of from/to date ranges, and for automatically named page versions (they are independent of the display language of public pages and forms). A value that is not configured is returned as null and falls back to its default (locale → ja, timezone → Asia/Tokyo); only one of the two may be unset. If anything is null, ask the user what they want and offer to set it with update_tenant_locale_settings (both values are required, so re-send the current value of the one that is already set). timezone is an IANA time zone name (e.g. Asia/Tokyo).
get_tenant_locale_settings
Returns the form's notification settings (webhook/slack/line/email) (requires the read:notifications scope; contains sensitive data).
get_notification_settings
Returns a single page together with the draft being edited (blocks/theme/custom_css/title/meta_description/favicon_url). is_domain_root tells whether the page is currently assigned to the root URL of its public domain; such a page always uses the workspace-wide favicon (get_branding_settings) instead of its own favicon_url.
get_page
Returns the page's allowed IPs (whitelist), denied IPs (blacklist) and whether the current plan can use IP restrictions (plan_eligible). Entries are single IPv4 addresses or CIDR notation. An empty whitelist means no restriction (all allowed). IP restriction is a feature of the pro plan and above.
get_page_ip_rules
Returns the status of the workspace's public URL subdomain (slug) (requires the read:tenant-settings scope). The public URL is {slug}.{base_domain}. confirmed = whether it is confirmed, exposed = whether it has been exposed publicly, and used_changes/change_limit/remaining_changes = the change allowance (last 365 days). While base_domain is null, the slug host feature is disabled and update_tenant_slug returns 409.
get_tenant_slug
Returns a single submission in detail (answers, attachments, screening score). The source IP and User-Agent are not returned by default; set include_source_metadata=true only when you need them (real values are returned only on the Starter plan and above).
get_submission
Returns the workspace's storage usage and limit.
get_usage
Issues a signed upload URL (presigned PUT) for an image asset (requires the write:assets scope). This tool cannot send the file body itself, so send the file to the upload_url in the response with an HTTP PUT that carries the Content-Type header (e.g. in Claude Code: curl -X PUT -H 'Content-Type: image/png' --data-binary @file.png <upload_url>). The asset does not become usable until you call confirm_asset_upload after a successful PUT. In sandboxed execution environments such as claude.ai, the upload host may need to be added to the allowed domains in Settings (Additional allowed domains for code execution). Supported formats are PNG, JPEG, GIF and WebP.
create_asset_upload_url
Issues a time-limited preview URL that renders the draft being edited with the production renderer (re-issuing invalidates the previous URL, including the one shown in the admin app's preview modal and any URL already shared). Use it for the review step "the AI creates the draft → a human checks the preview URL → publish_page".
issue_page_preview_url
Returns the confirmed image assets (newest first, paginated, with their public URLs; requires the read:assets scope). The public_url of an existing asset can be used as is for a page's background or feature image.
list_assets
Returns the files attached to submissions (newest first, paginated).
list_attachments
Returns the custom domains (requires the read:custom-domains scope). The status of each item is pending (just registered, DNS not yet configured), verifying (verification in progress) or active (usable). The id of a domain that is active and disabled=false can be passed as custom_domain_id to update_form / update_page_draft to publish that page or form on it. root_page_id is the ID of the page currently assigned to the root URL (https://{hostname}/), or null when nothing is assigned. Change the assignment with use_as_domain_root on the page draft (patch_page_draft) followed by publish_page. A domain cannot be used for publishing on a plan with plan_eligible=false.
list_custom_domains
Returns the field types available for forms and their constraints (whether options are required, availability on this workspace's plan, the field_key format and the maximum number of fields). Always check it before create_form / replace_form_fields.
get_form_field_types
Returns the forms (newest first, with the submission count and the public URL). acceptance in each entry is the acceptance control (submission window, response limit and the notice shown while not accepting); all of its members being null means nothing is configured.
list_forms
Returns the notification types available for notification settings and their constraints (availability on this workspace's plan, the per-type registration limit and the allowed values of content) (requires the read:notifications scope, which is not included in the default scopes). Always check it before update_notification_settings.
get_notification_types
Returns the page templates (template_key / name / tags). [Use include_capabilities: true before creating or editing] The canonical page authoring rules (the allowed block types, theme keys, fonts, value ranges, block_style_keys (the standard style vocabulary of a block), css_class_* (the rules for stable selectors used from custom_css) and anchor_id_* (the rules for the in-page link landing point) = capabilities) and the authoring guide authoring_notes (theme colors, how to use style, gradients, inline Markdown and other important rules) are returned only when include_capabilities is true. Always fetch them with true and follow them before assembling blocks or themes with create_page / update_page_draft / patch_page_draft (omitting it returns a light response with the template list only). Express the design with block.style and theme first, and limit custom_css to decorations that the standard vocabulary does not cover.
get_page_templates
Returns the page's saved versions (revisions) as metadata only (id, revision_number, label, created_at, published), newest first. retention_limit in the response is the maximum number of versions kept; saving a version while the number of versions has reached it may push out and delete an old version that falls outside the limit (the published version is protected, so it is not always deleted). Use the order of versions (newest first) and the published flag to judge whether a version would be pushed out. The content (blocks/theme) is not included. To inspect the content of a version, restore it into the draft with restore_page_version and then read it with get_page.
list_page_versions
Returns the pages (landing pages) ordered by last update, newest first.
list_pages
Returns the form's submissions in ascending order of submission time (oldest first, paginated, filterable by period). The source IP and User-Agent are not returned by default. Set include_source_metadata=true only when you need them (investigating abuse, detecting duplicates, access analysis); real values are returned only on the Starter plan and above.
list_submissions
Publishes the form so that it can accept submissions (requires the publish:forms scope). form.public_url in the response is the public URL to share with respondents (it is null for a form with standalone_public=false, which is expected — it is delivered through a page). Returns 409 if the form is already published. If the response contains warnings, tell the user about them: a form published with no enabled notification destination (has_enabled_notification=false) notifies nobody of incoming submissions, so offer to set one up with update_notification_settings (requires write:notifications). For an embed-only form you may run update_form standalone_public=false → publish_form → placing it on the page without asking the user to confirm publishing (the standalone public URL (/forms/{id}) is closed so there is no entry point, and publishing the page itself is a separate user action). Always set standalone_public=false first (publishing before closing it exposes the standalone URL for a moment).
publish_form
Takes a snapshot of the current draft and publishes the page (requires the publish:pages scope). A page whose public page title (title) is unset returns 422 (title is initialized from the name given to create_page, or set it with update_page_draft / patch_page_draft before publishing). public_url in the response is the public URL. Editing the draft after publishing does not change the published version until you publish again. If the draft carries a root assignment reservation (use_as_domain_root, set through patch_page_draft / update_page_draft), publishing applies and consumes it (true = assign this page to the root URL of the public domain; false = unassign it).
publish_page
Provisions or synchronizes the custom domain with Cloudflare and returns the latest verification state (requires the write:custom-domains scope). A manual trigger to call after the user has configured the DNS records shown by register_custom_domain, to confirm that the status has become active. Idempotent (the result does not change while the state is the same). Returns 404 for an unknown ID.
sync_custom_domain
Registers a custom domain (requires the write:custom-domains scope). Registration is provisioned asynchronously, and dns.records in the response holds the DNS records to configure (verification token, etc.). Right after registration the status is pending/verifying. The workflow has three steps: [1] register with this tool, [2] show dns.records to the user so they configure their DNS, [3] call sync_custom_domain afterwards to confirm activation (there is no polling or webhook). The number of registrations is capped at the plan limit (limit in list_custom_domains). Exceeding the limit or a duplicate hostname returns 409, and a plan that does not support custom domains returns 403.
register_custom_domain
Changes only the label of a saved version (the content and the version number do not change). The response is the updated version list (metadata only).
update_page_version
Replaces all of the form's field definitions with the given array (an empty array deletes everything; display order follows the array order). Existing submission data is not affected. Validation violations are returned as 422 with errors; fix them and retry.
replace_form_fields
Replaces all of the form's notification settings with the given array (an empty array deletes everything; requires the write:notifications scope). Check the available types, plan availability and limits with get_notification_types (read:notifications). Violations are returned as 422 with errors.
update_notification_settings
Copies the content of the selected version over the draft (does not publish). [Caution] The current unsaved draft is overwritten and lost, so save it first with save_page_version if you want to keep it. Check the restored draft content with get_page, and publish it with publish_page. The response is the version list (metadata only).
restore_page_version
Discards the draft being edited and reverts it to the content of the currently published version (requires write:pages). The publish state does not change (nothing is published; only the draft reverts). The server identifies the published version. Returns 409 for an unpublished page (there is no published version). The discarded draft is lost, so save it first with save_page_version if you want to keep it. Reverting to the "last published version" of the past is not supported (only the currently published one).
revert_page_draft_to_published
Saves the page draft (name/blocks/theme, etc.) as a full replacement — use it only when rebuilding every block; for partial edits use patch_page_draft, which does not erase omitted fields. [Get page templates first] Assemble blocks/theme only after reading capabilities and authoring_notes from get_page_templates(include_capabilities: true), and follow them. [Propose saving a version before editing] Before changing the blocks/theme of an existing page, check the version count and retention_limit with list_page_versions, then snapshot the current state with save_page_version. Skip it when the page has no versions yet (list_page_versions is empty). Below retention_limit, save without asking (and say you did). At retention_limit the oldest version outside the limit may be pushed out and deleted (the published one is protected; judge from the order and the published flag), so in that case get the user's consent before saving. Without a version, a published page can still be reverted with revert_page_draft_to_published (an unpublished one cannot). [Validation] Violations return 422 with errors ([{field, message}]); fix and retry. warnings on success mean "saved but not rendered" — fix and save again. [Full replacement] Omitted fields are erased — notably custom_css (pass back the one from get_page) and use_custom_domain (reverts to the default domain; use patch_page_draft to change only the publishing domain). title / meta_description / favicon_url are the exception: omitted = unchanged (an empty string clears them).
update_page_draft
Appends the current draft as a named snapshot (append-only). Old versions beyond the retention limit (retention_limit in list_page_versions) are pruned automatically (an old version outside the limit may be deleted; the published version is protected). Check the number of versions with list_page_versions first, and if it has reached retention_limit so that a version would be pushed out, get the user's consent before running it (no confirmation is needed below the limit). When label is omitted / null / empty or whitespace only, the version is named automatically with the date and time in the workspace time zone and language ("yyyy/MM/dd HH:mm" for ja, "MMM d, yyyy HH:mm" for en). This is not publishing (publish with publish_page). The response is the updated version list (metadata only).
save_page_version
Unpublishes a published form (stops accepting submissions; the definition and submission data are kept; requires publish:forms).
unpublish_form
Unpublishes a published page (the draft and past versions are kept; calling it on an unpublished page also succeeds idempotently; requires publish:pages).
unpublish_page
Updates the workspace's branding settings (requires the write:tenant-settings scope). hide_powered_by=true hides the "Powered by" badge in the footer (paid plans only; returns 403 when the plan does not allow it. Setting false to show it again is always allowed). The badge setting is per workspace, so it takes effect immediately on every published page and form at once. Do not use it for a request like "hide it on this page only" (tell the user that per-page control does not exist). favicon_url sets the workspace-wide favicon (null / omitted = unchanged; an empty string clears it; not plan-gated); for a single page use favicon_url of patch_page_draft (or update_page_draft) instead. hide_powered_by is required: pass the current value from get_branding_settings when changing only the favicon. Run it only on an explicit instruction from the user.
update_branding_settings
Partially updates the form's basics (title, admin name, description), the submission completion message, the content locale, the custom domain publishing settings, the standalone public URL setting and the review screen before submit. Omitted / null fields are left unchanged. For an English form, also set completion_title / completion_body in English (a Japanese default is set on creation) and set locale: "en" explicitly. custom_domain_id must be a registered and verified custom domain (status=active and not disabled); get the ID from list_custom_domains. Specifying custom_domain_id implies use_custom_domain = true (use use_custom_domain=false to revert to the default domain). standalone_public=false makes the standalone public URL (/forms/{id}) private, turning the form into an embed-only form (delivery and submissions through pages are not affected). auto_reply sets the acknowledgement email sent to the respondent (the whole object replaces the current setting; enabled=true requires email_field_key of an enabled email-type field of that form, subject and body, otherwise 422; subject / body may contain {{form_title}}, {{form_name}} (alias of {{form_title}}) and {{submitted_at}}). acceptance sets the acceptance window (starts_at / ends_at), the maximum number of responses and the notice shown while not accepting: ends_at at or before now stops acceptance (use unpublish_form to just stop it now); submissions outside the window or over the limit are rejected with 409.
update_form
Saves the workspace's language (locale: ja / en) and time zone (timezone: an IANA time zone name, e.g. Asia/Tokyo / America/New_York / UTC) (requires the write:tenant-settings scope). Both are required and they overwrite the current values (send both even when changing only one; read the current values with get_tenant_locale_settings). The setting is per workspace and applies to the language of subsequent notification emails and to the time zone used for submission timestamps, from/to date ranges, and automatically named page versions (the display language of public pages and forms does not change). An unsupported language or a non-existent time zone (including abbreviations and offset notations such as JST or +09:00) returns 422. Confirm the desired language and time zone with the user before running it (do not pick the values yourself). Returns 204 (no body) on success.
update_tenant_locale_settings
Replaces the page's allowed IPs (whitelist) and denied IPs (blacklist) in full (a list that is not sent becomes empty = that restriction is lifted). Each entry is a single IPv4 address or CIDR notation (e.g. 203.0.113.5 / 203.0.113.0/24); an invalid format returns 422. IP restriction is a feature of the pro plan and above; plans without it return 403. When the whitelist is non-empty, access from outside the allowed ranges returns 403 on the public page. To change only part of the current values, read them with get_page_ip_rules first and send both lists back. [When it takes effect] This setting is independent of the draft and publish_page: it applies to the public page immediately, without publishing.
update_page_ip_rules
Updates only some fields of the page draft (null / omitted = unchanged). Reach for this tool first when editing a draft (update_page_draft erases omitted fields; use it only when rebuilding every block). [Propose saving a version before editing] Before sending blocks/theme that change an existing draft, check the version count and retention_limit with list_page_versions, then snapshot the current state with save_page_version. Below retention_limit, save without asking (and say you did). At retention_limit the oldest version outside the limit may be pushed out and deleted (the published one is protected; judge from the order and the published flag), so in that case get the user's consent before saving (a published page can be reverted with revert_page_draft_to_published). Skip it when the page has no versions yet. Unlike update_page_draft, omitting blocks/theme does not damage the draft content. To change only the publishing domain, send just custom_domain_id (an active domain from list_custom_domains) or use_custom_domain=false to revert to the default domain — this avoids the update_page_draft footgun where omitting them reverts to the default domain. Authoring-rule validation runs only when blocks/theme are specified; violations return 422 with errors ([{field, message}]); assemble them only after reading capabilities and authoring_notes from get_page_templates(include_capabilities: true). [When it takes effect] A domain change reaches the public URL only on publish_page.
patch_page_draft
フォームの投稿を CSV で取得する(期間絞り込み可・プランのダウンロード上限に従う)。投稿元 IP・User-Agent 列は既定で空。必要なときだけ include_source_metadata=true を指定する(対応プラン=Starter 以上でのみ実値が出る)。
export_submissions_csv
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are FormEdge alternatives on ChatGPT?
As of 2026-09-14, FormEdge competes with CalcForms, Clipform, Cognito MCP, CrowdHum, Dayalogs, Formbyte, Formester, Formfacade, FormHug, Formly, Forms AI, Formspry, Fyrebox, Jotform, Letsfind, Neartail, PlatoForms, SurveyMonkey, SurveySparrow: Forms & Surveys, Tally, Typeform, Walla in ChatGPT Form & Survey Builders, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.