Metricool Media - S3 Direct Upload API

Operations for direct S3 uploads using presigned URLs

Operations 4

GET /v2/media/s3/upload-transactions Get upload transaction information #
PUT /v2/media/s3/upload-transactions Create upload transaction #
DELETE /v2/media/s3/upload-transactions Abort/cancel upload transaction #
PATCH /v2/media/s3/upload-transactions Complete upload transaction #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/metricool:metricool-media-s3-direct-upload-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

metricool-media-s3-direct-upload-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Metricool Media - S3 Direct Upload API
  description: 'Metricool API


    The base URL for all endpoints is: https://app.metricool.com/api


    All endpoints require authentication.'
  version: 2.0.0
servers:
- url: https://app.metricool.com/api
tags:
- name: Media - S3 Direct Upload
  description: Operations for direct S3 uploads using presigned URLs
paths:
  /v2/media/s3/upload-transactions:
    get:
      tags:
      - Media - S3 Direct Upload
      summary: Get upload transaction information
      description: Retrieves metadata about a file that has been uploaded to S3.
      operationId: getUploadTransactionInfo
      parameters:
      - name: key
        in: query
        description: S3 object key
        required: true
        schema:
          minLength: 1
          type: string
      - name: bucket
        in: query
        description: S3 bucket name
        required: true
        schema:
          minLength: 1
          type: string
      responses:
        '200':
          description: File information retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonOkResponseS3FileInfoResponse'
        '401':
          description: User not authenticated
        '403':
          description: Feature not enabled for user
        '404':
          description: File not found
    put:
      tags:
      - Media - S3 Direct Upload
      summary: Create upload transaction
      description: Creates a new upload transaction. Specify resourceType (e.g. PLANNER) and the list of parts. The backend derives the storage bucket and path from the resource type and your user ID. Single-part → simple presigned URL. Multi-part → multipart upload with per-part presigned URLs.
      operationId: createUploadTransaction
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/S3PresignedUploadRequest'
        required: true
      responses:
        '200':
          description: Upload transaction created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonOkResponseS3UploadResponse'
        '400':
          description: Invalid request parameters or part configuration
        '401':
          description: User not authenticated
        '403':
          description: Feature not enabled for user
    delete:
      tags:
      - Media - S3 Direct Upload
      summary: Abort/cancel upload transaction
      description: Aborts an upload transaction and cleans up any uploaded parts.
      operationId: abortUploadTransaction
      parameters:
      - name: uploadId
        in: query
        description: Multipart upload ID
        required: true
        schema:
          minLength: 1
          type: string
      - name: key
        in: query
        description: S3 object key
        required: true
        schema:
          minLength: 1
          type: string
      - name: bucket
        in: query
        description: S3 bucket name
        required: true
        schema:
          minLength: 1
          type: string
      responses:
        '204':
          description: Upload transaction aborted successfully
        '400':
          description: Invalid request parameters
        '401':
          description: User not authenticated
        '403':
          description: Feature not enabled for user
    patch:
      tags:
      - Media - S3 Direct Upload
      summary: Complete upload transaction
      description: 'Completes an upload transaction. For multipart: provide uploadId, key and parts. For simple: provide the fileUrl of the already-uploaded file. PLANNER resources are automatically moved/converted to metricool-download on completion.'
      operationId: completeUploadTransaction
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/S3UploadCompleteRequest'
        required: true
      responses:
        '200':
          description: Upload completed successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonOkResponseS3CompleteMultipartUploadResponse'
        '400':
          description: Invalid request or missing parts
        '401':
          description: User not authenticated
        '403':
          description: Feature not enabled for user
        '404':
          description: Upload ID not found
components:
  schemas:
    JsonOkResponseS3CompleteMultipartUploadResponse:
      type: object
      properties:
        metadata:
          type: object
        page:
          $ref: '#/components/schemas/JsonPaging'
        data:
          $ref: '#/components/schemas/S3CompleteMultipartUploadResponse'
    JsonOkResponseS3UploadResponse:
      type: object
      properties:
        metadata:
          type: object
        page:
          $ref: '#/components/schemas/JsonPaging'
        data:
          $ref: '#/components/schemas/S3UploadResponse'
    S3CompleteMultipartUploadRequest:
      required:
      - key
      - parts
      - uploadId
      type: object
      properties:
        uploadId:
          minLength: 1
          type: string
          description: AWS multipart upload ID returned from start multipart
          example: abc123xyz...
        key:
          minLength: 1
          type: string
          description: S3 object key returned from start multipart
          example: temporal/12345/202601/abc123_video.mp4
        parts:
          minItems: 1
          type: array
          description: List of completed parts with their ETags
          items:
            $ref: '#/components/schemas/S3CompletedPart'
      description: Request to complete a multipart upload to S3
    S3FileInfoResponse:
      required:
      - bucket
      - fileUrl
      - key
      - size
      type: object
      properties:
        key:
          type: string
          description: S3 object key
          example: temporal/12345/202601/abc123_video.mp4
        bucket:
          type: string
          description: Name of the S3 bucket
          example: metricool-temp
        fileUrl:
          type: string
          description: Full URL to access the file
          example: https://metricool-temp.s3.eu-west-1.amazonaws.com/temporal/12345/202601/abc123_video.mp4
        size:
          type: integer
          description: Size of the file in bytes
          format: int64
          example: 52428800
        contentType:
          type: string
          description: Content type of the file
          example: video/mp4
        lastModified:
          type: string
          description: Last modified timestamp
          format: date-time
          example: '2026-01-26T12:30:00Z'
        etag:
          type: string
          description: ETag of the object
          example: '"d41d8cd98f00b204e9800998ecf8427e"'
      description: Information about a file stored in S3
    S3UploadResponse:
      required:
      - bucket
      - expiresAt
      - key
      - uploadType
      type: object
      properties:
        key:
          type: string
          description: S3 object key where the file will be stored
          example: uploads/123/202601/abc123_video.mp4
        bucket:
          type: string
          description: S3 bucket name
          example: metricool-upload
        expiresAt:
          type: string
          description: Expiration time of the presigned URLs
          format: date-time
          example: '2026-01-26T12:15:00Z'
        fileUrl:
          type: string
          description: Final file URL (available after upload completes)
          example: https://metricool-upload.s3.eu-west-1.amazonaws.com/uploads/123/202601/abc123_video.mp4
        presignedUrl:
          type: string
          description: Presigned URL for simple upload (only for files < 5MB)
          example: https://metricool-upload.s3.eu-west-1.amazonaws.com/...?X-Amz-Signature=...
        uploadId:
          type: string
          description: Upload ID for multipart upload (only for files >= 5MB)
          example: abc123xyz...
        parts:
          type: array
          description: List of parts with presigned URLs for multipart upload (only for files >= 5MB)
          items:
            $ref: '#/components/schemas/S3PartPresignedUrl'
        totalSize:
          type: integer
          description: Total file size in bytes
          format: int64
          example: 10485760
        uploadType:
          type: string
          description: 'Upload type: SIMPLE or MULTIPART'
          example: MULTIPART
      description: Response containing presigned URLs for S3 upload (simple or multipart)
    S3PresignedUploadRequest:
      required:
      - contentType
      - parts
      - resourceType
      type: object
      properties:
        resourceType:
          minLength: 1
          type: string
          description: 'Type of resource being uploaded. Determines the storage strategy (bucket and path). Case-insensitive. Supported values: ''planner'', ''studio-logo''.'
          example: planner
          enum:
          - planner
          - studio-logo
        contentType:
          type: string
          description: MIME type of the file
          example: image/png
        parts:
          minItems: 1
          type: array
          description: List of parts that compose the file. Each part includes size, byte range, and verification hash. Parts must be consecutive without gaps, and the total must cover the entire file. A single-part list results in a simple upload. Multiple parts trigger multipart upload.
          items:
            $ref: '#/components/schemas/S3UploadPart'
        fileExtension:
          type: string
          description: Optional file extension hint (e.g., 'mp4', 'jpg'). If not provided, derived from contentType.
          example: mp4
      description: Request to generate presigned URLs for direct S3 upload
    S3PartPresignedUrl:
      required:
      - endByte
      - partNumber
      - partSize
      - presignedUrl
      - startByte
      type: object
      properties:
        partNumber:
          type: integer
          description: Part number (1-based index)
          format: int32
          example: 1
        presignedUrl:
          type: string
          description: Presigned URL to upload this part
          example: https://bucket.s3.amazonaws.com/key?partNumber=1&uploadId=...
        partSize:
          type: integer
          description: Size of this part in bytes
          format: int64
          example: 5242880
        startByte:
          type: integer
          description: Start byte offset of this part in the original file
          format: int64
          example: 0
        endByte:
          type: integer
          description: End byte offset of this part in the original file (exclusive)
          format: int64
          example: 5242880
      description: Presigned URL for a single part of a multipart upload
    JsonPaging:
      type: object
      properties:
        next:
          type: string
    JsonOkResponseS3FileInfoResponse:
      type: object
      properties:
        metadata:
          type: object
        page:
          $ref: '#/components/schemas/JsonPaging'
        data:
          $ref: '#/components/schemas/S3FileInfoResponse'
    S3UploadCompleteRequest:
      type: object
      properties:
        multipart:
          $ref: '#/components/schemas/S3CompleteMultipartUploadRequest'
        simple:
          $ref: '#/components/schemas/S3SimplePart'
      description: Complete S3 upload request - supports multipart or single-part uploads
    S3UploadPart:
      required:
      - endByte
      - hash
      - size
      - startByte
      type: object
      properties:
        size:
          minimum: 1
          type: integer
          description: Size of this part in bytes
          format: int64
          example: 5242880
        startByte:
          minimum: 0
          type: integer
          description: Starting byte position in the original file (0-based, inclusive)
          format: int64
          example: 0
        endByte:
          minimum: 1
          type: integer
          description: Ending byte position in the original file (0-based, exclusive)
          format: int64
          example: 5242880
        hash:
          minLength: 1
          type: string
          description: Base64-encoded SHA-256 hash of this part's content. Used for integrity verification with S3 Object Lock.
          example: x3b2yqV2wFk8B0LBDYhRGwXlNRgzTqnm4WIaxKnIRWQ=
      description: Represents a single part of a file to be uploaded with size, byte range, and verification hash
    S3SimplePart:
      required:
      - fileUrl
      type: object
      properties:
        fileUrl:
          minLength: 1
          type: string
          description: Complete URL of the file already uploaded to S3
          example: https://metricool-temp.s3.amazonaws.com/temp/uploads/1770724258286/video.mov
      description: Single-part S3 upload information
    S3CompletedPart:
      required:
      - etag
      - partNumber
      type: object
      properties:
        partNumber:
          minimum: 1
          type: integer
          description: Part number (1-based index)
          format: int32
          example: 1
        etag:
          minLength: 1
          type: string
          description: ETag returned by S3 after uploading the part
          example: '"d41d8cd98f00b204e9800998ecf8427e"'
      description: Information about a completed part of a multipart upload
    S3CompleteMultipartUploadResponse:
      required:
      - bucket
      - fileUrl
      - key
      type: object
      properties:
        key:
          type: string
          description: S3 object key where the file is stored
          example: temporal/12345/202601/abc123_video.mp4
        bucket:
          type: string
          description: Name of the S3 bucket
          example: metricool-temp
        fileUrl:
          type: string
          description: Full URL to access the uploaded file
          example: https://metricool-temp.s3.eu-west-1.amazonaws.com/temporal/12345/202601/abc123_video.mp4
        etag:
          type: string
          description: ETag of the completed object
          example: '"d41d8cd98f00b204e9800998ecf8427e"'
        convertedFileUrl:
          type: string
          description: Final URL of the file after conversion (if applicable). Contains converted video URL if MOV was converted to MP4, otherwise same as fileUrl.
          example: https://metricool-data.s3.eu-west-1.amazonaws.com/video-converter/converted/abc123_video.mp4
      description: Response after completing a multipart upload to S3