A submission backend for iOS, Android, and beyond
onsubmit.dev isn't just for HTML forms on websites. Any app that can send an HTTP request — a native iOS app in Swift, an Android app in Kotlin, a React Native or Flutter app, or any other system — can POST straight to your endpoint and get the same delivery, filtering, and notifications.
Most form backend services assume the request is coming from a browser: an HTML <form> with an action attribute, a redirect on success, maybe some client-side JavaScript. That's a fine default, but it's not the whole story. A form endpoint is just a URL that accepts a POST request — and any HTTP client can send one.
That means a submission backend for iOS and Android apps is exactly the same endpoint you'd use on a website. Your Swift code calls URLSession, your Kotlin code calls OkHttp, your React Native or Flutter code calls fetch or http — each sends a JSON body to the same URL, and onsubmit.dev processes it identically: validate, filter spam, store, notify.
You don't need a native SDK, a backend service of your own, or a cloud function just to let users send feedback, submit a support request, or sign up for a waitlist from inside your app. The endpoint you already have for your website works for your mobile app too.
How to send submissions from a mobile app
One endpoint, any HTTP client, live in minutes.
Create an endpoint
Sign up at onsubmit.dev and create a form. You get a unique endpoint URL — the same one you'd use in an HTML form's action attribute — but it works from anywhere that can send an HTTP POST request, not only from a browser.
There's nothing mobile-specific to configure. The endpoint doesn't care whether the request came from a website, a native app, or a script — it just receives JSON or form-encoded data.
POST JSON from your app
From Swift, Kotlin, React Native, or any language with an HTTP client, send a POST request with a JSON body to your endpoint URL. It's the same fetch-like call you'd make to any REST API.
fetch("https://onsubmit.dev/f/your-form-id", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name: "Jane Doe",
email: "jane@example.com",
message: "Feedback from the iOS app",
}),
})
.then((res) => res.json())
.then((data) => {
if (data.ok) console.log("Submitted!", data);
});Get notified instantly
Every submission is spam-filtered, stored in your dashboard, and emailed to you the moment it arrives. Mirror it to Slack, Telegram, Discord, Google Sheets, Notion, Airtable, or any webhook.
Your app doesn't need to know about any of that. It sends one request and gets back a simple JSON response — the same contract regardless of which client sent it.
Not just for websites
The same endpoint that powers an HTML form works from any system that can make an HTTP request.
Not just for websites
The endpoint is a plain HTTP POST target. Any client that can make a network request — a native app, a CLI tool, a script, an IoT device — can submit to it exactly like a browser does.
No backend to run
Your app already ships without a server component. Adding a feedback form, a contact form, or a bug report screen shouldn't force you to stand one up just to receive the data.
One endpoint, every client
Use the same form endpoint from your website, your iOS app, and your Android app at once. Every submission lands in the same inbox and dashboard, regardless of where it came from.
Spam stopped before your inbox
Keyword filters and validation catch abusive or malformed submissions before they reach you, so an in-app feedback form doesn't become a target for junk data.
Instant delivery
Submissions are emailed to you within seconds and can be mirrored to Slack, Telegram, or Discord — useful for catching crash reports or urgent feedback as it happens.
Free to start
The free tier covers 50 submissions a month with no credit card — enough to validate an in-app feedback or support form before you need more.
Works from any language or platform
The request shape is the same everywhere — a POST with a JSON body.
var request = URLRequest(url: URL(string: "https://onsubmit.dev/f/your-form-id")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body: [String: Any] = [
"name": "Jane Doe",
"email": "jane@example.com",
"message": "Feedback from the iOS app"
]
request.httpBody = try? JSONSerialization.data(withJSONObject: body)
URLSession.shared.dataTask(with: request) { data, response, error in
// handle response
}.resume()val client = OkHttpClient()
val json = """{"name":"Jane Doe","email":"jane@example.com","message":"Feedback from the Android app"}"""
val body = json.toRequestBody("application/json".toMediaType())
val request = Request.Builder()
.url("https://onsubmit.dev/f/your-form-id")
.post(body)
.build()
client.newCall(request).execute().use { response ->
// handle response
}await fetch("https://onsubmit.dev/f/your-form-id", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name: "Jane Doe",
email: "jane@example.com",
message: "Feedback from the React Native app",
}),
});await http.post(
Uri.parse("https://onsubmit.dev/f/your-form-id"),
headers: {"Content-Type": "application/json"},
body: jsonEncode({
"name": "Jane Doe",
"email": "jane@example.com",
"message": "Feedback from the Flutter app",
}),
);One endpoint for your website and your app
Teams that ship both a website and a mobile app often end up building the submission handling twice: an HTML form on the marketing site, and a separate backend endpoint for the app to hit. That's duplicated infrastructure for the same job — receiving a name, an email, and a message, then routing it somewhere useful.
Because an onsubmit.dev endpoint is just a URL that accepts a POST request, you can point both at it. The website's <form action=""> and the app's fetch() or URLSession call reach the same place, get filtered by the same spam rules, and show up in the same dashboard and inbox. You maintain one integration instead of two.
Common uses inside an app
In-app feedback forms, support and bug-report screens, waitlist and beta signup flows, contact forms in a companion app, and lightweight surveys are all a good fit — anywhere your app collects a short structured message and needs it delivered somewhere a human will see it, without standing up and maintaining a backend service just for that one screen.
Frequently asked questions
Can I use onsubmit.dev from a native iOS or Android app, not just a website?
Yes. The endpoint accepts a POST request with a JSON or form-encoded body from any HTTP client — URLSession in Swift, OkHttp or HttpURLConnection in Kotlin, fetch in React Native, or http in Flutter/Dart all work the same way a browser form submission does.
Do I need an SDK to submit from my app?
No SDK is required. Any HTTP client that can send a POST request with a JSON body works. There are official packages for React, Vue, Svelte, Astro, and Next.js if you want a thinner wrapper, but plain fetch or your platform's native HTTP client is all you need.
What response does the endpoint return?
A successful submission returns HTTP 200 with `{ "ok": true, "id": "sub_abc123" }`. On error you get a non-2xx status with an error message you can surface to the user.
Can I use the same form endpoint for my website and my mobile app?
Yes. The endpoint doesn't distinguish between clients — a web form's action attribute and a mobile app's fetch call can point at the exact same URL, and both sets of submissions land in the same dashboard.
Does this work for feedback forms, bug reports, or support requests inside an app?
Yes. Any screen that collects a name, email, message, or structured data can POST it to your endpoint — feedback forms, in-app support requests, waitlist signups, and crash/bug reports are all common uses.
Is there rate limiting or CORS I need to worry about?
Native mobile HTTP clients aren't subject to browser CORS restrictions, so requests from Swift, Kotlin, or React Native work without extra configuration. Reasonable rate limits apply per plan to prevent abuse.
Give your app a submission backend today
Free forever for up to 50 submissions a month. Works from any platform, no credit card.
