> ## Documentation Index
> Fetch the complete documentation index at: https://developer.ammdistro.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get an upload URL

> For a file slot sent as `{ "upload": true }`. PUT the file to the returned URL with the returned headers, then call complete. Needs a key with `delivery:write`.



## OpenAPI

````yaml /api-reference/openapi.json post /delivery/releases/{releaseId}/files/{fileId}/upload-url
openapi: 3.1.0
info:
  title: AMM Distro API
  version: '2026-10-22'
  description: >-
    Deliver releases and catalog transfers to AMM Distro from your own systems,
    check readiness, and follow each release's status.


    API access is turned on per account by AMM Distro. The account's admins then
    create keys in **Settings → API**.
  contact:
    name: AMM Distro support
    email: support@ammdistro.com
    url: https://ammdistro.com
servers:
  - url: https://api.ammdistro.com/api/v2/external
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Accounts
  - name: Releases
    description: Create, update, validate and submit releases, and read their status.
  - name: Files
    description: Upload artwork and audio yourself instead of sending URLs.
  - name: Catalog transfers
    description: Move already-released catalog from another distributor.
  - name: Reference data
  - name: Ingestion check
    description: Look up any UPC or ISRC in the account's catalog.
paths:
  /delivery/releases/{releaseId}/files/{fileId}/upload-url:
    post:
      tags:
        - Files
      summary: Get an upload URL
      description: >-
        For a file slot sent as `{ "upload": true }`. PUT the file to the
        returned URL with the returned headers, then call complete. Needs a key
        with `delivery:write`.
      operationId: createUploadUrl
      parameters:
        - name: releaseId
          in: path
          required: true
          description: Your ID for the release.
          schema:
            type: string
            pattern: ^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$
          example: NOVA-004
        - name: fileId
          in: path
          required: true
          description: '`file.id` from the release''s artwork or track audio.'
          schema:
            type: string
        - name: accountId
          in: query
          required: false
          description: Required when the key covers more than one account.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UploadUrlRequest'
      responses:
        '200':
          description: Signed upload URL.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UploadUrl'
        '400':
          description: Bad file.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                unsupported_type:
                  value:
                    error: unsupported_type
                    message: >-
                      contentType must be one of audio/wav, audio/x-wav,
                      audio/wave, audio/flac, audio/x-flac
                invalid_size:
                  value:
                    error: invalid_size
                    message: sizeBytes must be a whole number up to 2147483648
        '401':
          description: No key, or a revoked key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                missing_api_key:
                  value:
                    error: missing_api_key
                    message: 'Send your API key as `Authorization: Bearer <key>`.'
                invalid_api_key:
                  value:
                    error: invalid_api_key
                    message: API key is invalid or has been revoked.
        '403':
          description: The key can't do this, or API access is off for its accounts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                insufficient_scope:
                  value:
                    error: insufficient_scope
                    message: This key does not grant delivery:write.
                api_access_disabled:
                  value:
                    error: api_access_disabled
                    message: >-
                      API access is not turned on for the accounts this key
                      covers.
        '404':
          description: No such upload.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                upload_not_found:
                  value:
                    error: upload_not_found
                    message: No pending upload with that ID on this release.
        '409':
          description: Already uploaded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                upload_in_progress:
                  value:
                    error: upload_in_progress
                    message: >-
                      This file was already uploaded. Send upload: true for the
                      slot again to replace it.
        '429':
          description: >-
            Rate limit reached. Wait for the time in the `RateLimit-Reset`
            header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                rate_limited:
                  value:
                    error: rate_limited
                    message: >-
                      Rate limit of 60 requests per minute exceeded for this
                      key.
components:
  schemas:
    UploadUrlRequest:
      type: object
      required:
        - contentType
        - sizeBytes
      properties:
        contentType:
          type: string
          enum:
            - image/jpeg
            - image/png
            - audio/wav
            - audio/flac
        sizeBytes:
          type: integer
          minimum: 1
          description: Exact file size. Up to 50 MB for artwork, 2 GB for audio.
          example: 52428800
        filename:
          type: string
          example: night-drive.wav
    UploadUrl:
      type: object
      properties:
        uploadUrl:
          type: string
          format: uri
          description: PUT the file here within 6 hours.
        method:
          type: string
          const: PUT
        headers:
          type: object
          additionalProperties:
            type: string
          description: Send these headers with the PUT.
        expiresIn:
          type: integer
          example: 21600
    Error:
      type: object
      required:
        - error
        - message
      properties:
        error:
          type: string
          description: Stable code to branch on.
          example: invalid_payload
        message:
          type: string
          description: What happened, in plain words.
        details:
          type: array
          description: >-
            Per-field problems (payload errors) or per-release problems
            (transfer submit).
          items:
            oneOf:
              - $ref: '#/components/schemas/PayloadProblem'
              - $ref: '#/components/schemas/Issue'
              - $ref: '#/components/schemas/TransferReleaseProblem'
    PayloadProblem:
      type: object
      required:
        - path
        - message
      properties:
        path:
          type: string
          description: Where in your request body the problem is.
          example: tracks[2].credits[0].roles[1]
        message:
          type: string
          example: '"Wizard" is not a known role (see GET /reference/credit-roles)'
    Issue:
      type: object
      required:
        - severity
        - message
      properties:
        severity:
          type: string
          enum:
            - error
            - warning
        rule:
          type: string
          description: Stable rule code, when the problem comes from a release rule.
          example: credit.production
        field:
          type:
            - string
            - 'null'
          example: credits
        track:
          type: object
          description: Which track, when the problem is on one.
          properties:
            externalId:
              type:
                - string
                - 'null'
            discNumber:
              type: integer
            trackNumber:
              type: integer
        message:
          type: string
    TransferReleaseProblem:
      type: object
      properties:
        externalId:
          type: string
        errors:
          type: array
          items:
            $ref: '#/components/schemas/Issue'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: An API key from Settings → API in AMM Distro.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.