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/opal-assets-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: 3.2.0
info:
version: 2.0.0
title: Opal Assets API
license:
name: Opal API License
url: https://www.workwithopal.com/api-license
description: The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
servers:
- url: https://login.ouropal.com
tags:
- name: Assets
description: '## Assets Overview
Assets represent images, videos, PDFs, and any other file uploads.'
paths:
/assets/v2:
post:
tags:
- Assets
operationId: CreateAssetV2
summary: Upload an asset available to the authenticated user
security:
- oauth2:
- offline_access
- api_key:
- Session-Token
parameters:
- in: header
name: X-File-Name
schema:
type: string
required: true
description: This header must contain the desired filename including file extension. If the client does not support sending UTF-8 Unicode characters, it may Base64 encode this value, which the server will decode.
requestBody:
description: The request body should be the file binary itself passed as application/octet-stream. This endpoint does not currently support multipart uploads.
content:
application/octet-stream:
schema:
type: string
format: binary
responses:
'201':
description: A single asset with basic metadata.
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
title: asset
type: object
required:
- id
- type
- attributes
- relationships
additionalProperties: false
properties:
id:
type: string
format: uuid
type:
type: string
enum:
- asset
attributes:
type: object
required:
- bytes
- created_at
- download_url_override
- duration
- file_extension
- file_name
- height
- mime_type
- updated_at
- url
- width
additionalProperties: false
properties:
url:
type: string
download_url_override:
type:
- string
- 'null'
description: 'An alternative download URL for the file. If set, downloading the
asset will result in a redirect to the overridden location instead of
downloading the asset data directly. When not present, `url` should
be used.
'
width:
type:
- integer
- 'null'
description: When applicable, the width in pixels of an image or video.
height:
type:
- integer
- 'null'
description: When applicable, the height in pixels of an image or video.
duration:
type:
- integer
- 'null'
description: When applicable, the play time of a video in seconds.
pages:
type:
- integer
- 'null'
description: When applicable, the number of pages in a PDF document.
mime_type:
type: string
description: The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) that corresponds to the uploaded file.
file_name:
type: string
file_extension:
type: string
bytes:
type: integer
description: The size of the file in bytes.
created_at:
type: string
format: date-time
description: An ISO8601 date-time.
readOnly: true
updated_at:
type: string
format: date-time
description: An ISO8601 date-time.
readOnly: true
relationships:
required:
- opal
type: object
additionalProperties: false
properties:
opal:
type: object
required:
- data
additionalProperties: false
properties:
data:
type: object
required:
- id
- type
additionalProperties: false
properties:
id:
type: string
type:
type: string
enum:
- opal
'400':
description: Bad request
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
'422':
description: Unprocessable entity
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
get:
tags:
- Assets
operationId: GetAssetsV2
summary: '[UNSTABLE] Get a collection of assets available to the authenticated user'
security:
- oauth2:
- offline_access
- api_key:
- Session-Token
parameters:
- name: filter
in: query
description: 'Filters for limiting the results.
'
required: false
schema:
type: object
properties:
id:
type: array
description: 'The IDs of the resources that should be returned.
Comma separated list of IDs. If included, will only attempt to fetch resources matching those IDs. (Note that some or all resources may not be available.) If not included, will return all resources matching the other provided filters. For example, `filter[id]=798ac6d9-b3fc-4155-88ee-237f43f3404b` will fetch the resource with id `798ac6d9-b3fc-4155-88ee-237f43f3404b`, while `filter[id]=798ac6d9-b3fc-4155-88ee-237f43f3404b,d79e513e-9246-454e-80bf-8268bc39cd6e,f2b19a4a-ba0c-49be-8aa7-a1bf68a4a4ed` will fetch each of the resources with the ids `798ac6d9-b3fc-4155-88ee-237f43f3404b`, `d79e513e-9246-454e-80bf-8268bc39cd6e`, or `f2b19a4a-ba0c-49be-8aa7-a1bf68a4a4ed`.
'
items:
type: string
format: uuid
created_at:
type: object
description: 'Filter for exact dates or for dates greater than or less than a given date.
Supports the comparison operators: `eq` (equal to), `gt` (greater than),
`gteq` (greater than or equal to), `lt` (less than), and `lteq` (less than or
equal to).
Filters are formatted as `filter[created_at][gt]=2025-01-01T12:01:00Z` where
`created_at` is the field you want to filter on, `gt` is the operator, and
`2025-01-01T12:01:00Z` can be either a date or date-time value.
If no operator is specified, `eq` is assumed but date values without time
components will have the semantics of matching all records "on the same day"
as the given date. For example, `filter[created_at]=2025-01-01T12:01:00Z` is
equivalent to `filter[created_at][eq]=2025-01-01T12:01:00Z` which will only
match that exact date and time. Alternatively,
`filter[created_at]=2025-01-01` has the semantics "greater than midnight on
2025-01-01 and less than midnight on 2025-01-02."
'
properties:
eq:
type: string
description: 'Equal to filter. If no other filter is specified, `eq` will be assumed.
'
gt:
type: string
description: Greater than filter
gteq:
type: string
description: Greater than or equal to filter
lt:
type: string
description: Less than filter
lteq:
type: string
description: Less than or equal to filter
updated_at:
type: object
description: 'Filter for exact dates or for dates greater than or less than a given date.
Supports the comparison operators: `eq` (equal to), `gt` (greater than),
`gteq` (greater than or equal to), `lt` (less than), and `lteq` (less than or
equal to).
Filters are formatted as `filter[created_at][gt]=2025-01-01T12:01:00Z` where
`created_at` is the field you want to filter on, `gt` is the operator, and
`2025-01-01T12:01:00Z` can be either a date or date-time value.
If no operator is specified, `eq` is assumed but date values without time
components will have the semantics of matching all records "on the same day"
as the given date. For example, `filter[created_at]=2025-01-01T12:01:00Z` is
equivalent to `filter[created_at][eq]=2025-01-01T12:01:00Z` which will only
match that exact date and time. Alternatively,
`filter[created_at]=2025-01-01` has the semantics "greater than midnight on
2025-01-01 and less than midnight on 2025-01-02."
'
properties:
eq:
type: string
description: 'Equal to filter. If no other filter is specified, `eq` will be assumed.
'
gt:
type: string
description: Greater than filter
gteq:
type: string
description: Greater than or equal to filter
lt:
type: string
description: Less than filter
lteq:
type: string
description: Less than or equal to filter
style: deepObject
explode: true
- name: page
description: Specify an offset and limit for pagination
in: query
required: false
schema:
type: object
properties:
limit:
type: integer
default: 50
offset:
type: integer
style: deepObject
explode: true
responses:
'200':
description: A collection of assets
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
type: array
items:
title: asset
type: object
required:
- id
- type
- attributes
- relationships
additionalProperties: false
properties:
id:
type: string
format: uuid
type:
type: string
enum:
- asset
attributes:
type: object
required:
- bytes
- created_at
- download_url_override
- duration
- file_extension
- file_name
- height
- mime_type
- updated_at
- url
- width
additionalProperties: false
properties:
url:
type: string
download_url_override:
type:
- string
- 'null'
description: 'An alternative download URL for the file. If set, downloading the
asset will result in a redirect to the overridden location instead of
downloading the asset data directly. When not present, `url` should
be used.
'
width:
type:
- integer
- 'null'
description: When applicable, the width in pixels of an image or video.
height:
type:
- integer
- 'null'
description: When applicable, the height in pixels of an image or video.
duration:
type:
- integer
- 'null'
description: When applicable, the play time of a video in seconds.
pages:
type:
- integer
- 'null'
description: When applicable, the number of pages in a PDF document.
mime_type:
type: string
description: The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) that corresponds to the uploaded file.
file_name:
type: string
file_extension:
type: string
bytes:
type: integer
description: The size of the file in bytes.
created_at:
type: string
format: date-time
description: An ISO8601 date-time.
readOnly: true
updated_at:
type: string
format: date-time
description: An ISO8601 date-time.
readOnly: true
relationships:
required:
- opal
type: object
additionalProperties: false
properties:
opal:
type: object
required:
- data
additionalProperties: false
properties:
data:
type: object
required:
- id
- type
additionalProperties: false
properties:
id:
type: string
type:
type: string
enum:
- opal
meta:
type: object
required:
- total
- page
- resource_type
properties:
resource_type:
type: string
total:
type: integer
page:
type: object
required:
- limit
- offset
properties:
limit:
type: integer
offset:
type: integer
'400':
description: Bad request
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
/assets/v2/{asset_id}:
get:
tags:
- Assets
operationId: GetAssetV2
summary: Get an assets metadata
security:
- oauth2:
- offline_access
- api_key:
- Session-Token
parameters:
- name: asset_id
in: path
required: true
description: The ID of the Asset
schema:
type: string
responses:
'200':
description: An single asset reference.
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
title: asset
type: object
required:
- id
- type
- attributes
- relationships
additionalProperties: false
properties:
id:
type: string
format: uuid
type:
type: string
enum:
- asset
attributes:
type: object
required:
- bytes
- created_at
- download_url_override
- duration
- file_extension
- file_name
- height
- mime_type
- updated_at
- url
- width
additionalProperties: false
properties:
url:
type: string
download_url_override:
type:
- string
- 'null'
description: 'An alternative download URL for the file. If set, downloading the
asset will result in a redirect to the overridden location instead of
downloading the asset data directly. When not present, `url` should
be used.
'
width:
type:
- integer
- 'null'
description: When applicable, the width in pixels of an image or video.
height:
type:
- integer
- 'null'
description: When applicable, the height in pixels of an image or video.
duration:
type:
- integer
- 'null'
description: When applicable, the play time of a video in seconds.
pages:
type:
- integer
- 'null'
description: When applicable, the number of pages in a PDF document.
mime_type:
type: string
description: The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) that corresponds to the uploaded file.
file_name:
type: string
file_extension:
type: string
bytes:
type: integer
description: The size of the file in bytes.
created_at:
type: string
format: date-time
description: An ISO8601 date-time.
readOnly: true
updated_at:
type: string
format: date-time
description: An ISO8601 date-time.
readOnly: true
relationships:
required:
- opal
type: object
additionalProperties: false
properties:
opal:
type: object
required:
- data
additionalProperties: false
properties:
data:
type: object
required:
- id
- type
additionalProperties: false
properties:
id:
type: string
type:
type: string
enum:
- opal
'400':
description: Bad request
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
'403':
description: Forbidden
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
'404':
description: Not found
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
'422':
description: Unprocessable entity
content:
application/json:
schema:
type: object
required:
- errors
properties:
errors:
type: array
items:
type: object
properties:
status:
type: string
title:
type: string
detail:
type: string
required:
- status
components:
securitySchemes:
oauth2:
type: oauth2
description: This API uses OAuth 2.0 with the authorization code grant flow. You can find more detailed authentication instructions in the [Authentication Strategies](/api/documentation#section/Authentication-Strategies/OAuth-2.0) section.
flows:
authorizationCode:
authorizationUrl: /oauth2/auth
tokenUrl: /oauth2/token
scopes:
offline_access: Include this scope if you wish to receive a refresh token
api_key:
type: apiKey
description: (Deprecated) This API also supports authentication via an API or session token set in the request headers.
in: header
name: Session-Token
x-tagGroups:
- name: JSON:API
tags:
- Accounts
- Activities
- Annotations
- Asset Reference Options
- Asset Reference Usage Rights Options
- Asset References
- Assets
- Brand Settings
- Brands
- Checkpoints
- Content
- Delivery Records
- Label Sets
- Labels
- Messages
- Moments
- Phase Items
- Placements
- Post Types
- Privacy
- Reactions
- Rich Texts
- Services
- Stamps
- Stories
- Url Uploads
- User Domain Views
- Users
- Workflows
- name: Other
tags:
- Budgets
- URL Previews
- Search
- Stories V1
- name: ⚠️ Unstable
tags: []
- name: Additional Resources
tags:
- secondary_resources