{"openapi":"3.1.0","info":{"title":"Native Made API","version":"2026-11-02","description":"Generate native SwiftUI iOS apps. Create an app from a brief, start a build, follow its transcript, then fetch the icon, Simulator screenshots and the Xcode project.\n\nAuthenticate with `Authorization: Bearer nm_…`; create keys in Settings → Developer API. Each key may make 120 requests per 60 seconds; every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset.\n\nA full build uses one of the account's monthly generations, exactly as in the web app. Changes to a built app are free, a few per app."},"servers":[{"url":"https://docs.nativemade.app/api/public/v1"}],"security":[{"apiKey":[]}],"paths":{"/me":{"get":{"operationId":"getAccount","summary":"The account that owns this key, its plan and remaining generations","responses":{"200":{"description":"The account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/apps":{"get":{"operationId":"listApps","summary":"List apps, newest activity first","responses":{"200":{"description":"The apps.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/App"}}}}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createApp","summary":"Create an app from a brief, optionally starting its first build","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAppInput"}}}},"responses":{"201":{"description":"The app, and its build when `build` was true.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAppResult"}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Free allowance used up for this month.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan allowance, or this app's free changes, used up.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/apps/{appId}":{"get":{"operationId":"getApp","summary":"Get an app with its latest build","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The app.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/App"}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such app or build on this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/apps/{appId}/builds":{"get":{"operationId":"listBuilds","summary":"List an app's builds, newest first","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The builds.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Build"}}}}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such app or build on this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"startBuild","summary":"Start a full build (uses one generation)","description":"If a build is already running for this app, it is returned with status 200 instead of starting another.","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"A build was already running; this is it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Build"}}}},"201":{"description":"Build started.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Build"}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Free allowance used up for this month.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan allowance, or this app's free changes, used up.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such app or build on this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/apps/{appId}/changes":{"post":{"operationId":"requestChange","summary":"Send a change to a built app","description":"The agent patches the existing app and rebuilds it. Does not use a generation; each app gets a few free changes.","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","minLength":1,"maxLength":2000}}}}}},"responses":{"201":{"description":"Change started.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Build"}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Plan allowance, or this app's free changes, used up.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such app or build on this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"A build is already running, or the app has not been built yet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/apps/{appId}/assets":{"get":{"operationId":"getAppAssets","summary":"Icon, Simulator screenshots and the source download URL","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The assets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAssets"}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such app or build on this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/apps/{appId}/source":{"get":{"operationId":"downloadSource","summary":"Download the Xcode project as a zip","parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The zip.","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"302":{"description":"Redirect to a short-lived signed download URL."},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such app or build on this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/builds/{buildId}":{"get":{"operationId":"getBuild","summary":"Build status","parameters":[{"name":"buildId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The build.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Build"}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such app or build on this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/builds/{buildId}/events":{"get":{"operationId":"getBuildEvents","summary":"The build transcript, oldest first","description":"Poll with `after` set to the previous `next_cursor` to read only new events. Stop when `done` is true.","parameters":[{"name":"buildId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"after","in":"query","required":false,"schema":{"type":"string","format":"uuid"},"description":"`next_cursor` from the previous page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":200}}],"responses":{"200":{"description":"A page of events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildEventsPage"}}}},"400":{"description":"The request is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such app or build on this account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. See Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"A Native Made API key, `nm_…`."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","not_found","invalid_request","quota_exceeded","conflict","rate_limited","internal"]},"message":{"type":"string"}}}}},"Build":{"type":"object","required":["id","app_id","status","stage","error","created_at","started_at","completed_at","web_url"],"properties":{"id":{"type":"string","format":"uuid"},"app_id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["queued","running","ready","failed","cancelled"]},"stage":{"anyOf":[{"type":"string","enum":["planning","designing","directing","architecting","building","testing","releasing"]},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"web_url":{"type":"string","format":"uri"}}},"App":{"type":"object","required":["id","name","description","idea","status","icon_url","created_at","updated_at","web_url","latest_build"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"idea":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["draft","generating","ready","failed"]},"icon_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"web_url":{"type":"string","format":"uri"},"latest_build":{"anyOf":[{"$ref":"#/components/schemas/Build"},{"type":"null"}]}}},"CreateAppInput":{"type":"object","required":["name","idea"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100},"idea":{"type":"string","minLength":20,"maxLength":4000,"description":"What the app does and for whom."},"pitch":{"type":"string","maxLength":500},"audience":{"type":"string","maxLength":300},"features":{"description":"Must-have features: an array, or one string with a feature per line.","anyOf":[{"type":"array","maxItems":20,"items":{"type":"string","minLength":1,"maxLength":300}},{"type":"string","maxLength":2000}]},"out_of_scope":{"type":"string","maxLength":1000},"inspiration":{"type":"string","maxLength":500},"build":{"type":"boolean","default":false,"description":"Start the first build now (uses one generation)."}}},"CreateAppResult":{"type":"object","required":["app","build"],"properties":{"app":{"$ref":"#/components/schemas/App"},"build":{"anyOf":[{"$ref":"#/components/schemas/Build"},{"type":"null"}]}}},"BuildEvent":{"type":"object","required":["id","created_at","type","text","path","ok"],"properties":{"id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"type":{"type":"string","enum":["message","action","tool","check","icon","error","note"]},"text":{"type":"string"},"path":{"anyOf":[{"type":"string"},{"type":"null"}]},"ok":{"anyOf":[{"type":"boolean"},{"type":"null"}]}}},"BuildEventsPage":{"type":"object","required":["build_id","build_status","events","next_cursor","done"],"properties":{"build_id":{"type":"string","format":"uuid"},"build_status":{"type":"string","enum":["queued","running","ready","failed","cancelled"]},"events":{"type":"array","items":{"$ref":"#/components/schemas/BuildEvent"}},"next_cursor":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"done":{"type":"boolean"}}},"AppAssets":{"type":"object","required":["app_id","build_id","icon","screenshots","video_url","source_zip_url"],"properties":{"app_id":{"type":"string","format":"uuid"},"build_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"icon":{"anyOf":[{"type":"object","required":["png_url","svg_url"],"properties":{"png_url":{"type":"string","format":"uri"},"svg_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}}},{"type":"null"}]},"screenshots":{"type":"array","items":{"type":"string","format":"uri"}},"video_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"source_zip_url":{"type":"string","format":"uri"}}},"Account":{"type":"object","required":["user","key","plan","generations","rate_limit"],"properties":{"user":{"type":"object","required":["id","email"],"properties":{"id":{"type":"string","format":"uuid"},"email":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"key":{"type":"object","required":["id","name","prefix"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"prefix":{"type":"string"}}},"plan":{"type":"string"},"generations":{"type":"object","required":["used","limit","unlimited"],"properties":{"used":{"type":"integer"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}]},"unlimited":{"type":"boolean"}}},"rate_limit":{"type":"object","required":["requests","window_seconds"],"properties":{"requests":{"type":"integer"},"window_seconds":{"type":"integer"}}}}}}}}