Skip to content
SoundSyncAudio software platform

Guide

Private Uploads and Package Download Links

Use verified private upload jobs and short-lived generated-package downloads.

Delivery files up to 10 GB each

Each private delivery file can be up to 10 GB (10,000,000,000 bytes). Local multipart uploads retry interrupted parts. After a page reload, reselect the same file to reuse completed parts within 24 hours of starting the upload; the browser cannot silently reopen a local file.

Upload history shows the product, progress, and resume deadline. A remote-link import copies the file into private storage; retrying it may restart from the source rather than resume at the same byte. Protected or expired download links need a new direct link.

A file is attached only after its stored object, size, and upload session are checked. Incomplete uploads are not customer downloads. Public artwork and demos remain separate from private delivery files; attaching a file does not publish the product or grant ownership.

SoundSync

Direct upload parts

POST /api/products/:id/files/direct-uploads

Start or resume a direct upload

Auth
Account Bearer JWT
Scope
Workspace permissions and product assignments are checked.
Request fields
  • filename: string (required)
  • sizeBytes: integer (required)
  • mimeType: string
  • multipart: boolean
  • fileFingerprint: string
Returns
Job and signed upload instructions; follow the returned mode and part limits.
Notes
Use returned upload instructions. Local multipart resume requires reselecting the identical file within the returned deadline; the browser cannot reopen it silently.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "filename": {
      "type": "string"
    },
    "sizeBytes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10000000000
    },
    "mimeType": {
      "type": "string"
    },
    "multipart": {
      "type": "boolean"
    },
    "fileFingerprint": {
      "type": "string",
      "pattern": "^v1:[a-f0-9]{64}$"
    }
  },
  "required": [
    "filename",
    "sizeBytes"
  ],
  "additionalProperties": true
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "job": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "productId": {
          "type": "integer",
          "minimum": 1
        },
        "sourceType": {
          "type": "string"
        },
        "originalFilename": {
          "type": "string"
        },
        "filename": {
          "type": "string"
        },
        "storageKey": {
          "type": "string"
        },
        "fileSizeBytes": {
          "type": [
            "integer",
            "null"
          ]
        },
        "mimeType": {
          "type": "string"
        },
        "checksum": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "progress": {
          "type": "number"
        },
        "errorCode": {
          "type": "string"
        },
        "errorMessage": {
          "type": "string"
        },
        "attachedProductFileId": {
          "type": [
            "string",
            "integer"
          ]
        },
        "createdAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "updatedAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "completedAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "expectedSizeBytes": {
          "type": [
            "integer",
            "null"
          ]
        },
        "resumable": {
          "type": "boolean"
        },
        "resumeExpiresAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        }
      },
      "additionalProperties": true
    },
    "upload": {
      "type": "object",
      "properties": {
        "method": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "headers": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "partSize": {
          "type": "integer"
        },
        "partNumber": {
          "type": "integer",
          "minimum": 1
        },
        "parts": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "partNumber": {
                "type": "integer",
                "minimum": 1
              },
              "url": {
                "type": "string"
              },
              "headers": {
                "type": "object",
                "additionalProperties": true,
                "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
              }
            },
            "additionalProperties": true
          }
        },
        "expiresIn": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    },
    "processing": {
      "type": "boolean"
    },
    "deduplicated": {
      "type": "boolean"
    },
    "file": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "key": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "product": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "name": {
          "type": "string"
        }
      },
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 500, 503.

POST /api/products/:id/files/direct-uploads/:jobId/parts/:partNumber

Prepare the specified part

Auth
Account Bearer JWT
Scope
Workspace permissions and product assignments are checked.
Returns
Temporary PUT instructions for the permitted part.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "upload": {
      "type": "object",
      "properties": {
        "method": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "headers": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "partSize": {
          "type": "integer"
        },
        "partNumber": {
          "type": "integer",
          "minimum": 1
        },
        "parts": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "partNumber": {
                "type": "integer",
                "minimum": 1
              },
              "url": {
                "type": "string"
              },
              "headers": {
                "type": "object",
                "additionalProperties": true,
                "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
              }
            },
            "additionalProperties": true
          }
        },
        "expiresIn": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 500, 503.

POST /api/products/:id/files/direct-uploads/:jobId/part

Prepare a part using JSON

Auth
Account Bearer JWT
Scope
Workspace permissions and product assignments are checked.
Request fields
  • partNumber: integer (required)
Returns
Temporary PUT instructions for the permitted part.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "partNumber": {
      "type": "integer",
      "minimum": 1
    }
  },
  "required": [
    "partNumber"
  ],
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "upload": {
      "type": "object",
      "properties": {
        "method": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "headers": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "partSize": {
          "type": "integer"
        },
        "partNumber": {
          "type": "integer",
          "minimum": 1
        },
        "parts": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "partNumber": {
                "type": "integer",
                "minimum": 1
              },
              "url": {
                "type": "string"
              },
              "headers": {
                "type": "object",
                "additionalProperties": true,
                "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
              }
            },
            "additionalProperties": true
          }
        },
        "expiresIn": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 500, 503.

POST /api/products/:id/files/direct-uploads/:jobId/complete

Verify and attach a stored upload

Auth
Account Bearer JWT
Scope
Workspace permissions and product assignments are checked.
Request fields
  • sizeBytes: integer
Returns
Job and attachment result after stored-object/session checks.
Notes
Completes only after object/session/size verification. Do not manually attach an unfinished storage key.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "sizeBytes": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "job": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "productId": {
          "type": "integer",
          "minimum": 1
        },
        "sourceType": {
          "type": "string"
        },
        "originalFilename": {
          "type": "string"
        },
        "filename": {
          "type": "string"
        },
        "storageKey": {
          "type": "string"
        },
        "fileSizeBytes": {
          "type": [
            "integer",
            "null"
          ]
        },
        "mimeType": {
          "type": "string"
        },
        "checksum": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "progress": {
          "type": "number"
        },
        "errorCode": {
          "type": "string"
        },
        "errorMessage": {
          "type": "string"
        },
        "attachedProductFileId": {
          "type": [
            "string",
            "integer"
          ]
        },
        "createdAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "updatedAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "completedAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "expectedSizeBytes": {
          "type": [
            "integer",
            "null"
          ]
        },
        "resumable": {
          "type": "boolean"
        },
        "resumeExpiresAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        }
      },
      "additionalProperties": true
    },
    "upload": {
      "type": "object",
      "properties": {
        "method": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "headers": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "partSize": {
          "type": "integer"
        },
        "partNumber": {
          "type": "integer",
          "minimum": 1
        },
        "parts": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "partNumber": {
                "type": "integer",
                "minimum": 1
              },
              "url": {
                "type": "string"
              },
              "headers": {
                "type": "object",
                "additionalProperties": true,
                "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
              }
            },
            "additionalProperties": true
          }
        },
        "expiresIn": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    },
    "processing": {
      "type": "boolean"
    },
    "deduplicated": {
      "type": "boolean"
    },
    "file": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "key": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "product": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "name": {
          "type": "string"
        }
      },
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 500, 503.

Generated HISE and JUCE packages return JSON links

Successful package generation/download preparation returns JSON containing url, filename, and expiresIn, not an archive blob. Fetch the signed URL to retrieve the ZIP; current links expire after 300 seconds. Never log or publish a live signed URL.

A private cached package is matched to its package source, product credentials, and branding. Changing those inputs requires the appropriate regeneration. A busy generator can return 429; missing storage/configuration can return 503. Handle these states rather than saving the JSON response as a ZIP.

SoundSync

Package link response shape (illustrative)

Package link response shape (illustrative)
{
  "url": "https://storage.example.invalid/signed-package-url",
  "filename": "product-package.zip",
  "expiresIn": 300
}

SoundSync

Full operation map

Upload and package methods

Existing chunk, remote, retry, cancel, and package routes.

Customer downloads

Separate ownership and download authorization.

SoundSync

HISE package requests

Package Management API

Product status, HISEScript/native generation, rotation, storefront package, and private ZIP links.