Svelte

Submit forms from Svelte or SvelteKit with reactive bindings and fetch.

Basic Svelte form

ContactForm.svelte
<script>
  let status = "idle";

  async function handleSubmit(e) {
    e.preventDefault();
    status = "loading";

    const data = Object.fromEntries(new FormData(e.target));

    const res = await fetch("https://formfa.st/f/your_endpoint_id", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Accept: "application/json",
      },
      body: JSON.stringify(data),
    });

    status = res.ok ? "success" : "error";
  }
</script>

{#if status === "success"}
  <p>Thanks! We'll be in touch.</p>
{:else}
  <form on:submit={handleSubmit}>
    <input type="text" name="name" placeholder="Name" required />
    <input type="email" name="email" placeholder="Email" required />
    <textarea name="message" placeholder="Message"></textarea>

    <input type="hidden" name="_gotcha" style="display:none" />

    <button type="submit" disabled={status === "loading"}>
      {status === "loading" ? "Sending..." : "Send"}
    </button>

    {#if status === "error"}
      <p>Something went wrong. Please try again.</p>
    {/if}
  </form>
{/if}

SvelteKit form action

In SvelteKit, you can submit to FormFast from a server-side form action:

src/routes/contact/+page.server.ts
import { fail } from "@sveltejs/kit";

export const actions = {
  default: async ({ request }) => {
    const formData = await request.formData();
    const data = Object.fromEntries(formData);

    const res = await fetch("https://formfa.st/f/your_endpoint_id", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Accept: "application/json",
      },
      body: JSON.stringify(data),
    });

    if (!res.ok) {
      return fail(500, { error: "Submission failed" });
    }

    return { success: true };
  },
};
src/routes/contact/+page.svelte
<script>
  export let form;
</script>

{#if form?.success}
  <p>Thanks for your message!</p>
{:else}
  <form method="POST">
    <input type="text" name="name" required />
    <input type="email" name="email" required />
    <textarea name="message"></textarea>
    <button type="submit">Send</button>
  </form>

  {#if form?.error}
    <p>{form.error}</p>
  {/if}
{/if}

Plain HTML (no JavaScript)

You can also use a plain HTML form in Svelte components. The browser handles the POST and redirect:

Svelte
<form action="https://formfa.st/f/your_endpoint_id" method="POST">
  <input type="text" name="name" required />
  <input type="email" name="email" required />
  <textarea name="message"></textarea>
  <input type="hidden" name="_gotcha" style="display:none" />
  <button type="submit">Send</button>
</form>