Guide
Formulaire de contact SvelteKit (sans backend)
SvelteKit n'a pas besoin de son propre endpoint d'actions de formulaire pour recevoir une soumission de contact. Vous pouvez déposer le même formulaire HTML brut dans un +page.svelte, ou - si vous voulez des états succès/erreur inline - utiliser un petit composant Svelte 5 avec $state et fetch.
Utilisez un formulaire HTML brut
Vous n'avez pas besoin d'une route API. Le formulaire POSTe directement vers Formhook, et votre framework n'a jamais à toucher la soumission.
<form action="https://formhook.app/f/YOUR_API_KEY" method="POST">
<label>
Email
<input type="email" name="email" required />
</label>
<label>
Message
<textarea name="message" required></textarea>
</label>
<!-- honeypot: bots fill this; humans don't see it -->
<input type="text" name="_gotcha" tabindex="-1" autocomplete="off" hidden />
<!-- optional: send users to a thank-you page after a native POST -->
<input type="hidden" name="_redirect" value="https://example.com/thanks" />
<button type="submit">Send</button>
</form>Ou envoyez avec fetch dans SvelteKit
Utilisez cette version si vous voulez des états succès/erreur côté client sans rechargement de page.
<!-- src/routes/contact/+page.svelte -->
<script lang="ts">
let status = $state<"idle" | "sending" | "ok" | "error">("idle");
async function onSubmit(e: SubmitEvent) {
e.preventDefault();
status = "sending";
const form = e.currentTarget as HTMLFormElement;
const data = Object.fromEntries(new FormData(form));
const res = await fetch("https://formhook.app/f/YOUR_API_KEY", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
});
status = res.ok ? "ok" : "error";
if (res.ok) form.reset();
}
</script>
{#if status === "ok"}
<p>Thanks - we'll be in touch.</p>
{:else}
<form onsubmit={onSubmit}>
<input type="email" name="email" placeholder="Email" required />
<textarea name="message" placeholder="Message" required></textarea>
<input type="text" name="_gotcha" tabindex="-1" hidden />
<button type="submit" disabled={status === "sending"}>
{status === "sending" ? "Sending…" : "Send"}
</button>
{#if status === "error"}
<p>Something went wrong. Please try again.</p>
{/if}
</form>
{/if}Comment ça marche
Le snippet de formulaire brut fonctionne dans n'importe quel +page.svelte - pas de +page.server.ts, pas de handler de form action SvelteKit. Si vous voulez une UX côté client, le deuxième snippet utilise les runes Svelte 5 ($state) et poste directement vers formhook.app/f/YOUR_API_KEY. L'endpoint accepte JSON, form-encoded ou multipart, donc Object.fromEntries(new FormData(form)) sérialisé en JSON est le chemin le plus simple.
Ce qui se passe ensuite
- La soumission arrive dans votre tableau de bord Formhook en moins d'une seconde.
- Une notification push se déclenche sur chaque appareil où vous l'avez activée.
- Répondez directement depuis le tableau de bord (Pro et au-dessus) sans monter votre propre infrastructure d'envoi d'e-mails.
- Votre déploiement SvelteKit reste un build statique (ou quasi-statique) - pas d'adaptateur serveur requis pour le formulaire de contact.
Lancez votre formulaire de contact SvelteKit aujourd'hui.
Inscrivez-vous gratuitement, créez un formulaire, collez la clé API. Cinq minutes.
Commencer gratuitementNiveau gratuit : 5 formulaires · 250 soumissions/mois · Sans carte bancaire.
Formulaire de contact SvelteKit - FAQ
Dois-je écrire une form action SvelteKit ou un fichier +page.server.ts ?
Comment gérer l'état de succès sans rechargement de page complet ?
Est-ce que cela fonctionne avec adapter-static / GitHub Pages ?
Guides pour les autres frameworks
Migrating from Formspree? See how Formhook compares.