Measure logo
REST API ReferenceSDK APIBuilds

Upload Over-The-Air patch mappings

PUT/builds/ota

Uploads 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_id is required and must be a UUID. Tag your OTA patch with a UUID; it is echoed back on each mapping in the response.
  • patch_version is 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.
  • mappings is required and must contain at least one mapping. Mapping type can be proguard, dsym, elf_debug, or jsbundle (React Native).
  • For React Native, upload the JS bundle and its sourcemap as two separate jsbundle mappings in the same request (same tarball and <bundle> / <bundle>.map conventions as PUT /builds).
  • For mapping filename, only provide the filename, not a path.
  • Each pre-signed URL expires at expires_at, and includes a headers object 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
AuthorizationBearer <token>

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"}
Empty
Empty
{  "error": "string"}
Empty

Think this page can be better?

Open an issue