NomonoPlatform docs

Reference

Uploads

An upload sends one audio file to us in parts over presigned URLs, and completing it creates a source that you can add to a session.

When you create an upload, the response has a URL for each part. PUT each part to its URL, keep the ETag header from each response, and then complete the upload with the part numbers and their ETags. Every part except the last is 64 MiB. The upload and its URLs expire 24 hours after you create it.

The upload object

  • upload_idstring

    The upload's ID.

  • part_sizeinteger

    The size in bytes of every part except the last, which can be smaller.

  • partsarray of objects

    A presigned URL for each part.

  • expires_attimestamp

    When the upload and its part URLs expire.

POST/v1/uploads

Create an upload

Starts an upload and returns a presigned URL for each part.

Needs the jobs:write scope.

Body

  • filenamestringrequired

    The file's name, which the source returns as filename. We detect the format from the file's contents.

  • size_bytesintegerrequired

    The file's exact size in bytes, from 1 up to 4294967296, which is 4 GiB.

curl -X POST "https://platform-api.nomono.co/v1/uploads" \  -H "Authorization: Bearer $NOMONO_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "filename": "host.wav",    "size_bytes": 176084204  }'
201 Created
{  "upload_id": "upl_01a1446f235c7448abbe096bfd043ae3",  "part_size": 67108864,  "parts": [    {      "part_number": 1,      "url": "https://....s3.eu-west-1.amazonaws.com/...?uploadId=...&partNumber=1&X-Amz-Expires=86400&X-Amz-Signature=..."    },    {      "part_number": 2,      "url": "https://...&partNumber=2&..."    },    {      "part_number": 3,      "url": "https://...&partNumber=3&..."    }  ],  "expires_at": "2026-10-17T09:02:11.204518Z"}

POST/v1/uploads/{upload_id}/parts

Reissue part URLs

Returns new presigned URLs for a range of parts of an incomplete upload, and they expire together with the upload.

Needs the jobs:write scope.

Path parameters

  • upload_idstringrequired

    The ID of the upload.

Query parameters

  • fromintegerrequired

    The first part to return, up to the upload's last part.

    at least 1

  • countintegerrequired

    How many parts to return.

    1 to 100

Returns

  • upload_idstring

    The upload's ID.

  • partsarray of objects

    A presigned URL for each part asked for, up to the upload's last part.

  • expires_attimestamp

    When the upload and these URLs expire.

curl -X POST "https://platform-api.nomono.co/v1/uploads/upl_01a1446f235c7448abbe096bfd043ae3/parts?from=2&count=100" \  -H "Authorization: Bearer $NOMONO_API_KEY"
200 OK
{  "upload_id": "upl_01a1446f235c7448abbe096bfd043ae3",  "parts": [    {      "part_number": 2,      "url": "https://..."    },    {      "part_number": 3,      "url": "https://..."    }  ],  "expires_at": "2026-10-17T09:02:11.204518Z"}

POST/v1/uploads/{upload_id}/complete

Complete an upload

Completes an upload and returns the new source, or the same source again if the upload is already complete. If the parts don't add up to the file's size or don't match the parts you uploaded, the request returns 409 upload_incomplete and the upload stays open. If the file isn't a PCM or float WAV file or a FLAC file, or is shorter than one second, it returns 422 source_rejected and the upload is deleted.

Needs the jobs:write scope.

Path parameters

  • upload_idstringrequired

    The ID of the upload.

Body

  • partsarray of objectsrequired

    Every uploaded part, each with the ETag its PUT returned.

Returns

  • source_idstring

    The source's ID.

  • upload_idstring

    The ID of the upload the source came from.

  • filenamestring

    The file name sent when the upload was created.

  • formatstring

    The file's format: wav or flac.

  • channelsinteger

    The number of channels.

  • sample_rateinteger

    The sample rate in Hz.

  • duration_snumber

    The length of the audio in seconds.

  • size_bytesinteger

    The file's size in bytes.

  • devicenull

    Always null.

  • statusstring

    Always ready.

  • created_attimestamp

    When the upload was created.

  • expires_atnullable timestamp

    When the source expires, after which we delete it. For a source in a session, this is the session's expires_at.

curl -X POST "https://platform-api.nomono.co/v1/uploads/upl_01a1446f235c7448abbe096bfd043ae3/complete" \  -H "Authorization: Bearer $NOMONO_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "parts": [      {        "part_number": 1,        "etag": "\"5d41402abc4b2a76b9719d911017c592\""      },      {        "part_number": 2,        "etag": "7d793037a0760186574b0282f2f435e7"      },      {        "part_number": 3,        "etag": "\"e4d909c290d0fb1ca068ffaddf22cbd0\""      }    ]  }'
201 Created
{  "source_id": "src_01a1446f235c7448abbe096c9b9adf6c",  "upload_id": "upl_01a1446f235c7448abbe096bfd043ae3",  "filename": "host.wav",  "format": "wav",  "channels": 1,  "sample_rate": 48000,  "duration_s": 1834.21,  "size_bytes": 176084204,  "device": null,  "status": "ready",  "created_at": "2026-10-16T09:02:11.204518Z",  "expires_at": "2026-10-23T09:04:37.880912Z"}

DELETE/v1/uploads/{upload_id}

Abandon an upload

Abandons an incomplete upload and deletes the parts sent so far. A completed upload can't be abandoned and returns 409 conflict. To remove its file, delete the source instead.

Needs the jobs:write scope.

Path parameters

  • upload_idstringrequired

    The ID of the upload.

Returns

An empty body, with the status 204 No Content.

curl -X DELETE "https://platform-api.nomono.co/v1/uploads/upl_01a1446f8e917b23a4c06d1e5f7a8b92" \  -H "Authorization: Bearer $NOMONO_API_KEY"
204 No Content