Connect with your entire stack.
From modern React meta-frameworks and static site generators to transactional SMTP providers and outbound webhook automations.
One API. Any frontend or framework.
Whatever technology you use to render your user interface, submitting a form is as simple as making a single HTTPS POST request to FormLynk.
Next.js
App Router / PagesNative Client Component fetch with TypeScript typings & zero bundle bloat.
React
Vite / CRA / SPAsStandard async event handlers and hook integration in any React frontend.
Vue.js / Nuxt
Vue 3 Composition APIReactive v-model bindings sending direct REST JSON payloads.
Svelte / SvelteKit
Reactive Web AppsLightweight fetch dispatch with Svelte stores or standard forms.
Static HTML
Vanilla WebWorks with pure <form> tags or micro JS snippets with file attachments.
WordPress
Custom Blocks & ThemesBypass bloated form plugins and heavy database bloat on WP hosting.
Shopify
Liquid & HydrogenCustom wholesale, return, and lead capture forms without monthly app fees.
PHP
Server-to-ServerSend server-side form payloads securely using Private API Keys (sk_live_).
Mobile Apps
iOS / Android / FlutterSubmit in-app feedback, bug reports, and KYC documents via standard HTTPS.
Deploy your frontend anywhere.
Build pure static or serverless Next.js applications on Vercel, Cloudflare, Netlify, or AWS without provisioning server databases or custom API route workers.
Avoid burning serverless execution limits on form submission processing.
Store NEXT_PUBLIC_FORM_API_KEY safely in client bundles. Protected via strict domain CORS whitelisting.
Included in the payload without loading heavy third-party client scripts.
1"use client";2import { useState } from "react";34export default function ContactForm() {5 const [status, setStatus] = useState<{6 loading: boolean;7 success: boolean;8 error: string | null;9 }>({ loading: false, success: false, error: null });1011 async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {12 e.preventDefault();13 setStatus({ loading: true, success: false, error: null });1415 const form = e.currentTarget;16 const formData = new FormData(form);17 const data = Object.fromEntries(formData.entries());1819 try {20 const response = await fetch("https://api.formlynk.io/api/v1/forms/submit", {21 method: "POST",22 headers: {23 "Content-Type": "application/json",24 "X-API-Key": process.env.NEXT_PUBLIC_FORM_API_KEY!,25 },26 body: JSON.stringify({27 form_id: "contact",28 ...data,29 }),30 });3132 const result = await response.json();33 if (response.ok && result.success) {34 setStatus({ loading: false, success: true, error: null });35 form.reset();36 } else {37 setStatus({38 loading: false,39 success: false,40 error: result.error?.message || "Submission failed. Please try again.",41 });42 }43 } catch (err) {44 setStatus({ loading: false, success: false, error: "Network connection error." });45 }46 }4748 return (49 <form onSubmit={handleSubmit} className="space-y-4">50 {/* Honeypot field (hidden from real users, traps automated bots) */}51 <input52 type="text"53 name="_gotcha"54 style={{ display: "none" }}55 tabIndex={-1}56 autoComplete="off"57 />5859 <div>60 <label htmlFor="name" className="block text-sm font-medium text-slate-700">Name</label>61 <input id="name" type="text" name="name" required className="w-full border px-3 py-2 rounded" />62 </div>6364 <div>65 <label htmlFor="email" className="block text-sm font-medium text-slate-700">Email</label>66 <input id="email" type="email" name="email" required className="w-full border px-3 py-2 rounded" />67 </div>6869 <div>70 <label htmlFor="message" className="block text-sm font-medium text-slate-700">Message</label>71 <textarea id="message" name="message" required rows={4} className="w-full border px-3 py-2 rounded" />72 </div>7374 {status.error && <p className="text-sm text-red-600">{status.error}</p>}75 {status.success && <p className="text-sm text-green-600">Thank you! Your message was received.</p>}7677 <button78 type="submit"79 disabled={status.loading}80 className="px-5 py-2.5 bg-ink text-white font-medium rounded hover:bg-black transition"81 >82 {status.loading ? "Sending..." : "Send Message"}83 </button>84 </form>85 );86}
From form to API in minutes.
Copy and paste production-ready snippets into your codebase. No proprietary SDKs, bloated dependencies, or complex setup steps.
1"use client";2import { useState } from "react";34export default function ContactForm() {5 const [status, setStatus] = useState<{6 loading: boolean;7 success: boolean;8 error: string | null;9 }>({ loading: false, success: false, error: null });1011 async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {12 e.preventDefault();13 setStatus({ loading: true, success: false, error: null });1415 const form = e.currentTarget;16 const formData = new FormData(form);17 const data = Object.fromEntries(formData.entries());1819 try {20 const response = await fetch("https://api.formlynk.io/api/v1/forms/submit", {21 method: "POST",22 headers: {23 "Content-Type": "application/json",24 "X-API-Key": process.env.NEXT_PUBLIC_FORM_API_KEY!,25 },26 body: JSON.stringify({27 form_id: "contact",28 ...data,29 }),30 });3132 const result = await response.json();33 if (response.ok && result.success) {34 setStatus({ loading: false, success: true, error: null });35 form.reset();36 } else {37 setStatus({38 loading: false,39 success: false,40 error: result.error?.message || "Submission failed. Please try again.",41 });42 }43 } catch (err) {44 setStatus({ loading: false, success: false, error: "Network connection error." });45 }46 }4748 return (49 <form onSubmit={handleSubmit} className="space-y-4">50 {/* Honeypot field (hidden from real users, traps automated bots) */}51 <input52 type="text"53 name="_gotcha"54 style={{ display: "none" }}55 tabIndex={-1}56 autoComplete="off"57 />5859 <div>60 <label htmlFor="name" className="block text-sm font-medium text-slate-700">Name</label>61 <input id="name" type="text" name="name" required className="w-full border px-3 py-2 rounded" />62 </div>6364 <div>65 <label htmlFor="email" className="block text-sm font-medium text-slate-700">Email</label>66 <input id="email" type="email" name="email" required className="w-full border px-3 py-2 rounded" />67 </div>6869 <div>70 <label htmlFor="message" className="block text-sm font-medium text-slate-700">Message</label>71 <textarea id="message" name="message" required rows={4} className="w-full border px-3 py-2 rounded" />72 </div>7374 {status.error && <p className="text-sm text-red-600">{status.error}</p>}75 {status.success && <p className="text-sm text-green-600">Thank you! Your message was received.</p>}7677 <button78 type="submit"79 disabled={status.loading}80 className="px-5 py-2.5 bg-ink text-white font-medium rounded hover:bg-black transition"81 >82 {status.loading ? "Sending..." : "Send Message"}83 </button>84 </form>85 );86}
Bring your own SMTP or use our shared mailer.
Every project workspace can connect its own dedicated transactional SMTP credentials. Passwords and API tokens are encrypted at rest with AES-256.
SendGrid
Connect your SendGrid API key or SMTP user with TLS authentication.
Postmark
Ultra-fast transactional deliverability with Postmark server tokens.
Amazon SES
Low-cost high-volume deliverability via your dedicated AWS SES credentials.
Mailgun
Custom domain routing with Mailgun SMTP credentials per project.
Brevo (Sendinblue)
European data-residency compliant transactional relay integration.
Default Shared Mailer
Zero configuration needed. Included out-of-the-box on all plans.
Outbound HMAC webhooks in real time.
Sync submissions directly to Zapier, Make, HubSpot, Slack, or internal REST APIs with cryptographically verifiable HMAC-SHA256 signatures.
{
"event": "submission.created",
"timestamp": "2026-09-26T15:20:00Z",
"project_id": "prj_01h9x4b9e28k",
"submission_id": "sub_8f92ab31c4e2",
"form": {
"id": "contact",
"name": "Main Contact Form"
},
"data": {
"name": "Sarah Chen",
"email": "sarah@techcorp.com",
"phone": "+1 415-555-0199",
"message": "We need a custom enterprise SLA for high-volume lead capture."
},
"client": {
"ip_address": "198.51.100.42",
"origin": "https://techcorp.com"
}
}X-Webhook-Signature header with timing-safe equality to verify authenticity.