Loops Uploads API

Upload image assets

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/loops-so-uploads-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

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

OpenAPI Specification

loops-so-uploads-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Loops OpenAPI Spec API key Uploads API
  description: This is the OpenAPI Spec for the [Loops API](https://loops.so/docs/api).
  version: 1.8.0
servers:
- url: https://app.loops.so/api/v1
tags:
- name: Uploads
  description: Upload image assets
paths:
  /uploads:
    post:
      tags:
      - Uploads
      summary: Create an upload
      description: Request a pre-signed URL to upload an image asset. Upload the file with an HTTP `PUT` to the returned `presignedUrl` (sending the same `Content-Type` and `Content-Length`), then call `/uploads/{id}/complete` to finalize the asset.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUploadRequest'
      responses:
        '200':
          description: Pre-signed upload URL created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateUploadResponse'
        '400':
          description: Invalid request body or unsupported `contentType`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UploadFailureResponse'
        '401':
          description: Invalid API key or content API not enabled for this team.
        '405':
          description: Wrong HTTP request method.
        '413':
          description: Upload exceeds the maximum allowed size.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UploadFailureResponse'
      security:
      - apiKey: []
  /uploads/{id}/complete:
    parameters:
    - name: id
      in: path
      required: true
      description: The `emailAssetId` returned when the upload was created.
      schema:
        type: string
    post:
      tags:
      - Uploads
      summary: Complete an upload
      description: Finalize an asset after the file has been uploaded to the pre-signed URL. Returns the public URL of the uploaded asset.
      responses:
        '200':
          description: Upload completed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompleteUploadResponse'
        '400':
          description: Upload id is missing or the uploaded file has an unsupported content type.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UploadFailureResponse'
        '401':
          description: Invalid API key or content API not enabled for this team.
        '404':
          description: Upload not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UploadFailureResponse'
        '405':
          description: Wrong HTTP request method.
        '425':
          description: Uploaded object not yet visible in storage. Retry shortly.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UploadFailureResponse'
      security:
      - apiKey: []
components:
  schemas:
    CreateUploadRequest:
      type: object
      properties:
        contentType:
          type: string
          description: The MIME type of the file to upload. Supported types are `image/jpeg`, `image/png`, `image/gif` and `image/webp`.
          examples:
          - image/png
        contentLength:
          type: integer
          description: The size of the file in bytes. Must be a positive integer no greater than 4,000,000 bytes.
          examples:
          - 102400
      required:
      - contentType
      - contentLength
      additionalProperties: false
    CreateUploadResponse:
      type: object
      properties:
        success:
          type: boolean
          examples:
          - true
        emailAssetId:
          type: string
          description: The ID of the created asset. Pass this as `id` to `/uploads/{id}/complete` once the file has been uploaded.
        presignedUrl:
          type: string
          description: The pre-signed URL to upload the file to with an HTTP `PUT` request. Send the same `Content-Type` and `Content-Length` used in the create request.
      required:
      - success
      - emailAssetId
      - presignedUrl
    UploadFailureResponse:
      type: object
      properties:
        success:
          type: boolean
          examples:
          - false
        message:
          type: string
        supportedContentTypes:
          type: array
          description: Present when the request was rejected for an unsupported `contentType`. Lists the accepted MIME types.
          items:
            type: string
        maxBytes:
          type: integer
          description: Present when the upload exceeds the size limit. The maximum allowed size in bytes.
      required:
      - success
      - message
    CompleteUploadResponse:
      type: object
      properties:
        success:
          type: boolean
          examples:
          - true
        emailAssetId:
          type: string
        finalUrl:
          type: string
          description: The public URL of the uploaded asset.
      required:
      - success
      - emailAssetId
      - finalUrl
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer