Make a key in Settings → Developer API. A key acts as you: apps it makes appear in your account, and builds it starts use your generations, exactly as in the app. Send it on every request as Authorization: Bearer nm_….
Build an app
curl https://nativemade.app/api/public/v1/apps \
-H "Authorization: Bearer $NATIVE_MADE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Tide",
"idea": "A calm tide tracker for surfers: today’s tides for a saved beach, with the next good window highlighted.",
"features": ["Save up to three beaches", "Tide chart for today", "A widget with the next high tide"],
"build": true
}'The response carries the app and its first build. A build takes 10 to 20 minutes: the agent writes the Swift, compiles it on a Mac, runs it in the iOS Simulator and fixes what breaks. Poll the build every 30 to 60 seconds.
# Status curl https://nativemade.app/api/public/v1/builds/$BUILD_ID \ -H "Authorization: Bearer $NATIVE_MADE_API_KEY" # Transcript: pass next_cursor back as ?after= to read only what is new curl "https://nativemade.app/api/public/v1/builds/$BUILD_ID/events?after=$CURSOR" \ -H "Authorization: Bearer $NATIVE_MADE_API_KEY"
When status is ready, GET /apps/{appId}/assets returns the icon, the Simulator screenshots and a link to the Xcode project.
Change it
curl https://nativemade.app/api/public/v1/apps/$APP_ID/changes \
-H "Authorization: Bearer $NATIVE_MADE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "message": "Make the chart line teal and add a sunrise time under it." }'A change patches the built app and rebuilds it. It does not use a generation.
Endpoints
Base URL https://nativemade.app/api/public/v1. The full schema is in the OpenAPI document.
GET | /me | The account, its plan and generations left this month |
GET | /apps | Your apps, each with its latest build |
POST | /apps | Create an app from a brief; build: true starts the first build |
GET | /apps/{appId} | One app |
GET | /apps/{appId}/builds | Its builds, newest first |
POST | /apps/{appId}/builds | Start a full build (uses one generation) |
POST | /apps/{appId}/changes | Send a change to a built app (free, a few per app) |
GET | /apps/{appId}/assets | Icon, Simulator screenshots, source download URL |
GET | /apps/{appId}/source | The Xcode project as a zip |
GET | /builds/{buildId} | Build status |
GET | /builds/{buildId}/events | The build transcript, paged with ?after= |
Errors are { "error": { "code", "message" } }. A full build answers 402 or 403 with quota_exceeded when the month's generations are used up, and a change answers 409 while a build is running. Each key may make 120 requests a minute; responses carry X-RateLimit-* headers, and a 429 carries Retry-After.
Use it from Claude, Cursor and other MCP clients
The MCP server is at https://nativemade.app/api/mcp (Streamable HTTP). Add it with your key as a header:
{
"mcpServers": {
"native-made": {
"type": "http",
"url": "https://nativemade.app/api/mcp",
"headers": { "Authorization": "Bearer nm_…" }
}
}
}In Claude Code:
claude mcp add --transport http native-made https://nativemade.app/api/mcp \ --header "Authorization: Bearer nm_…"
Or run it locally over stdio:
{
"mcpServers": {
"native-made": {
"command": "npx",
"args": ["-y", "@nativemade/mcp"],
"env": { "NATIVE_MADE_API_KEY": "nm_…" }
}
}
}create_app | Create an app from a brief, optionally building it |
build_app | Start a full build |
get_build_status | Queued, running, ready, failed or cancelled |
get_build_events | What the agent said, wrote and checked |
request_change | Patch a built app in plain words |
get_app_assets | Icon, screenshots and the Xcode project |
list_apps, get_app, get_account | Apps, one app, plan and quota |
Ask your agent something like “build me an iOS app that tracks tides for surfers”, and it will create the app, start the build and check on it until it is ready.