Upload Over-The-Air patch mappings
/builds/otaUploads mapping files for an Over-The-Air (OTA) patch, a remote update that
ships new code without a new store build (for example CodePush for React
Native, Shorebird for Flutter). It is driven by a patch_id (a UUID) and
takes no app version, build number or build size.
Like PUT /builds, this API accepts metadata and returns pre-signed URLs
for uploading the mapping files directly. Upload each file with a standard
HTTP PUT using the returned upload_url and headers.
Usage notes:
patch_idis required and must be a UUID. Tag your OTA patch with a UUID; it is echoed back on each mapping in the response.patch_versionis optional. Set it to the human-facing version of the patch (max 256 characters); it is echoed back on each mapping in the response.- The app is determined from your API key. Do not send an app identifier in the body.
mappingsis required and must contain at least one mapping. Mappingtypecan beproguard,dsym,elf_debug, orjsbundle(React Native).- For React Native, upload the JS bundle and its sourcemap as two separate
jsbundlemappings in the same request (same tarball and<bundle>/<bundle>.mapconventions as PUT/builds). - For mapping filename, only provide the filename, not a path.
- Each pre-signed URL expires at
expires_at, and includes aheadersobject whose entries must all be added to the upload request, otherwise it will fail. - File upload requests must use the PUT http method.
Authorization
measureApiKey Measure API key for the app, sent as Authorization: Bearer <api-key>.
The app is determined from the API key.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
The patch_id and at least one mapping.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X PUT "https://example.com/builds/ota" \ -H "Content-Type: application/json" \ -d '{ "patch_id": "550e8400-e29b-41d4-a716-446655440000", "patch_version": "1.4.2-patch.3", "mappings": [ { "type": "jsbundle", "filename": "main.jsbundle.tgz" }, { "type": "jsbundle", "filename": "main.jsbundle.map.tgz" } ] }'{ "mappings": [ { "id": "e2bbcad8-0566-44ea-af43-9dd114c64e8c", "type": "jsbundle", "filename": "main.jsbundle.tgz", "upload_url": "http://localhost:9119/msr-symbols-sandbox/incoming/e2bbcad8-0566-44ea-af43-9dd114c64e8c.tgz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=3600&x-id=PutObject", "expires_at": "2025-08-13T01:59:45.577889184Z", "headers": { "x-amz-meta-mapping_id": "e2bbcad8-0566-44ea-af43-9dd114c64e8c", "x-amz-meta-original_file_name": "main.jsbundle.tgz" }, "patch_id": "550e8400-e29b-41d4-a716-446655440000", "patch_version": "1.4.2-patch.3" }, { "id": "77ac8159-9f0e-4cc7-a9f1-60c05fccd4dc", "type": "jsbundle", "filename": "main.jsbundle.map.tgz", "upload_url": "http://localhost:9119/msr-symbols-sandbox/incoming/77ac8159-9f0e-4cc7-a9f1-60c05fccd4dc.tgz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=3600&x-id=PutObject", "expires_at": "2025-08-13T01:59:45.577980476Z", "headers": { "x-amz-meta-mapping_id": "77ac8159-9f0e-4cc7-a9f1-60c05fccd4dc", "x-amz-meta-original_file_name": "main.jsbundle.map.tgz" }, "patch_id": "550e8400-e29b-41d4-a716-446655440000", "patch_version": "1.4.2-patch.3" } ]}{ "error": "string", "details": "string"}{ "error": "string"}{ "error": "string"}{ "error": "string"}Think this page can be better?
Open an issue