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.
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 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
openapi: 3.2.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:
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
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
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
securitySchemes:
apiKey:
type: http
scheme: bearer