Mobile apps

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.

Step 01

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.

01
Step 02

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.

javascript
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);
  });
Step 03

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.

03

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.

Swift / iOS
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()
Kotlin / Android
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
}
React Native
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",
  }),
});
Flutter / Dart
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.