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/adobe-suite-dynamic-graphics-render-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: 3.2.0
info:
version: 1.0.0
title: Firefly Services Audio and Video Dynamic Graphics Render API
description: This RESTful API provides resources to use Firefly Services AI for audio and video generation and processing.
termsOfService: https://www.adobe.com/content/dam/cc/en/legal/terms/enterprise/pdfs/PSLT-AdobeCreativeAPI-WW-2024v2.pdf
servers:
- url: https://audio-video-api.adobe.io
description: Production server.
security:
- AccessToken: []
X-Api-Key: []
tags:
- name: Dynamic Graphics Render
description: 'Endpoints for Dynamic Graphics Render (DGR): template describe, presets, render, job status, cancel a render job, and list render jobs. The Cancel (`PUT /v1/cancel/{jobId}`) and List Render Jobs (`GET /v1/templates/render-jobs`) endpoints, as well as the extended status fields (`createdDate`, `totalJobItems`, `retryPayloadUrl`, `startedDate`, `completedDate`, and the `canceling`/`canceled` statuses), apply **only to render jobs** submitted via `POST /v1/templates/render`.'
paths:
/v1/templates/describe:
post:
tags:
- Dynamic Graphics Render
summary: Describe template
description: Analyzes a MOGRT (video template) file and returns a manifest of editable controls; fonts, images, audio, video and other supported values.
operationId: template-describe
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TemplateDescribeRequest'
examples:
SampleExample:
summary: MOGRT template
value:
source:
url: <pre-signed_URL_to_download_the_template>
AEPDescribeExample:
summary: After Effects project (AEP)
value:
type: aep
source:
url: <pre-signed_URL_to_download_the_.zip>
compName: A. Variable Duration
responses:
'202':
description: Accepted
content:
application/json:
schema:
$ref: '#/components/schemas/TemplateDescribeResponse'
examples:
SuccessResponse:
value:
jobId: <job_ID>
statusUrl: https://audio-video-api.adobe.io/v1/status/<job_ID>
headers:
Link:
schema:
type: string
description: URL to monitor the status of the job.
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidJsonError:
value:
error_code: invalid_json
message: Invalid request. Please check the input data.
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidToken:
value:
error_code: '401013'
message: OAuth token is not valid.
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidContext:
value:
error_code: access_error
message: Token not allowed in the current context.
ApiKeyIsRequired:
value:
error_code: '403000'
message: API key is required.
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
ValidationError:
value:
error_code: validation_error
message: Validation error occurred
messageId: '42206000'
InvalidTemplateTypeError:
value:
error_code: validation_error
message: Input must contain a valid template type
messageId: '42206001'
InvalidTemplateSourceError:
value:
error_code: validation_error
message: Invalid template source
messageId: '42206002'
InvalidTemplateSourceUrlError:
value:
error_code: validation_error
message: Invalid template source URL
messageId: '42206003'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
ServerError:
value:
messageId: '50006000'
message: Internal Server Error
error_code: runtime_error
/v1/presets:
get:
tags:
- Dynamic Graphics Render
summary: Fetch video rendering presets
description: Returns a list of predefined social-first encoding presets for rendering outputs.
operationId: get-presets
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/PresetsResponse'
examples:
PresetsExample:
$ref: '#/components/examples/PresetsResponse'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
Unauthorized:
value:
error_code: '401013'
message: OAuth token is not valid.
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
Forbidden:
value:
error_code: '403000'
message: API key is required.
/v1/templates/render:
post:
tags:
- Dynamic Graphics Render
summary: Render template
description: Renders one or more video variations by applying overrides and export presets. Submit up to 10 overrides per call for a subset of editable layers and get a pre-signed URL link to download the video file. For layers that are not editable, the system defaults are automatically applied at export.
operationId: template-render
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TemplateRenderRequest'
examples:
RenderExample:
summary: Sample render request
value:
source:
url: <pre-signed mogrt url>
fonts:
- name: <Font postscript name>
source:
url: <pre-signed url for font .ttf/otf>
config:
handleMissingFonts: use_default
assets:
- source:
url: <pre-signed url for image or video asset>
- source:
url: <pre-signed url for audio asset>
presets:
- source:
presetId: ffs_video_api_vert_1920p_hq
- source:
url: <pre-signed url for Encoder preset file>
variations:
- variables:
- variableId: <unique template variable id>
selectedCheckboxValue: true
- variableId: <unique template variable id>
assetIndex: 0
scale: no_scale
- variableId: <unique template variable id>
selectedDropdownValue: '0'
- variableId: <unique template variable id>
text: First Name
fontName: font_name_1
- variableId: <unique template variable id>
selectedSliderValue: -18
- variableId: <unique template variable id>
assetIndex: 1
audioPreference: replace
- variables:
- variableId: <unique template variable id>
selectedCheckboxValue: true
- variableId: <unique template variable id>
assetIndex: 0
scale: fit_to_frame
- variableId: <unique template variable id>
selectedDropdownValue: '0'
- variableId: <unique template variable id>
text: First Name
fontName: font_name_1
- variableId: <unique template variable id>
selectedSliderValue: -18
- variableId: <unique template variable id>
assetIndex: 1
audioPreference: mix
outputs:
- variationIndex: 0
presetIndex: 0
fileName: some_custom_file_name
destination: <pre-signed_URL_for_output_video>
- variationIndex: 1
presetIndex: 0
fileName: output_vert_1920p_hq
destination: <pre-signed_URL_for_output_video>
- variationIndex: 1
presetIndex: 1
fileName: my_custom_file_name
destination: <pre-signed_URL_for_output_video>
AEPRenderExample:
summary: 'AEP: replace media with scaling'
value:
type: aep
compName: A. Variable Duration
source:
url: <pre-signed_URL_to_download_the_.zip>
config:
handleMissingFonts: use_default
presets:
- source:
presetId: ffs_video_api_land_1080p_hq
assets:
- source:
url: <pre-signed_URL_for_video_asset>
variations:
- variables:
- variableId: c259:l261:media
assetIndex: 0
scale: fill_frame
outputs:
- variationIndex: 0
presetIndex: 0
fileName: aep_media_replace
AEPRenderTextExample:
summary: 'AEP: replace a text control'
value:
type: aep
compName: A. Variable Duration
source:
url: <pre-signed_URL_to_download_the_.zip>
config:
handleMissingFonts: use_default
fonts:
- name: SourceSans3-Bold
source:
url: <pre-signed_URL_for_font_.ttf>
presets:
- source:
presetId: ffs_video_api_land_1080p_hq
variations:
- variables:
- variableId: c169:l193:layer:sourceText
text: Certification Test Title
outputs:
- variationIndex: 0
presetIndex: 0
fileName: aep_text_replacement
AEPRenderAudioExample:
summary: 'AEP: replace audio'
value:
type: aep
compName: C. Audio Replacement
source:
url: <pre-signed_URL_to_download_the_.zip>
config:
handleMissingFonts: use_default
presets:
- source:
presetId: ffs_video_api_land_1080p_hq
assets:
- source:
url: <pre-signed_URL_for_audio_asset>
variations:
- variables:
- variableId: c840:l921:audio
assetIndex: 0
audioPreference: replace
outputs:
- variationIndex: 0
presetIndex: 0
fileName: aep_audio_replace
AEPRenderLayerOperationsExample:
summary: 'AEP: layer operations (variable-duration timeline)'
value:
type: aep
compName: A. Variable Duration
source:
url: <pre-signed_URL_to_download_the_.zip>
config:
handleMissingFonts: use_default
fonts:
- name: SourceSans3-Bold
source:
url: <pre-signed_URL_for_font_.ttf>
presets:
- source:
presetId: ffs_video_api_land_1080p_hq
assets:
- source:
url: <pre-signed_URL_for_video_asset>
variations:
- variables:
- variableId: c259:l261:media
assetIndex: 0
layerOperations:
- operation: match_source_duration
layerId: c259:l261:layer
- operation: shift_inpoint
layerId: c259:l263:layer
refLayerId: c259:l261:layer
refInOut: out
offsetSeconds: -1
- operation: shift_inpoint
layerId: c259:l265:layer
refLayerId: c259:l263:layer
refInOut: in
offsetFrames: 90
- operation: trim_comp
startSeconds: 0
endLayerId: c259:l265:layer
- operation: trim_outpoint
layerId: c259:l263:layer
refLayerId: c259:l265:layer
refInOut: out
- operation: trim_outpoint
layerId: c259:l262:layer
refLayerId: c259:l261:layer
refInOut: out
- operation: trim_outpoint
layerId: c259:l819:layer
refLayerId: c259:l265:layer
refInOut: out
- operation: enable_layer
layerId: c259:l398:layer
videoEnabled: false
outputs:
- variationIndex: 0
presetIndex: 0
fileName: aep_layer_operations
responses:
'202':
description: Accepted
content:
application/json:
schema:
$ref: '#/components/schemas/TemplateRenderResponse'
examples:
SuccessResponse:
value:
jobId: <job_ID>
statusUrl: https://audio-video-api.adobe.io/v1/status/<job_ID>
cancelUrl: https://audio-video-api.adobe.io/v1/cancel/<job_ID>
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidJsonError:
value:
error_code: invalid_json
message: Invalid request. Please check the input data.
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidToken:
value:
error_code: '401013'
message: OAuth token is not valid.
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidContext:
value:
error_code: access_error
message: Token not allowed in the current context.
ApiKeyIsRequired:
value:
error_code: '403000'
message: API key is required.
'422':
description: Unprocessable Entity
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidTemplateTypeError:
value:
error_code: validation_error
message: Input must contain a valid template type
messageId: '42205000'
InvalidTemplateSourceUrlError:
value:
error_code: validation_error
message: Invalid template source URL
messageId: '42205001'
InvalidPresetIdError:
value:
error_code: validation_error
message: '{presetId} export preset does not exist'
messageId: '42205002'
InvalidFontDetailsError:
value:
error_code: validation_error
message: Invalid font details in variation {variationIndex} control {controlIndex}
messageId: '42205003'
InvalidMediaDetailsError:
value:
error_code: validation_error
message: Invalid media details in variation {variationIndex} control {controlIndex}
messageId: '42205004'
InvalidScaleTypeError:
value:
error_code: validation_error
message: Invalid scale type in variation {variationIndex} control {controlIndex}
messageId: '42205005'
InvalidControlTypeError:
value:
error_code: validation_error
message: Invalid control type in variation {variationIndex} control {controlIndex}
messageId: '42205006'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InternalServerError:
value:
error_code: runtime_error
message: Internal Server Error
messageId: '50005001'
/v1/cancel/{jobId}:
put:
tags:
- Dynamic Graphics Render
summary: Cancel a render job
description: 'Aborts an in-flight render job. Returns `202 Accepted` as soon as the cancellation has been accepted; subsequent calls to `GET /v1/status/{jobId}` will report `"status": "canceled"` once the worker has fully stopped the underlying render.
**Applicable only to render jobs submitted via `POST /v1/templates/render`.** This endpoint does not apply to Describe, Reframe, TLS, TTS, or Avatar jobs.
**Notes:**
- Cancellation is idempotent.
- Once propagated to the worker, in-progress outputs are not uploaded to the destinations specified in the original render request.
- For a short window after the PUT, the status endpoint may still report `running`; poll until it transitions to `canceled`.'
operationId: cancel-render-job
parameters:
- name: jobId
in: path
required: true
schema:
type: string
format: uuid
description: UUID of the render job to cancel, as returned in the `jobId` field of the original 202 submit response or in the `cancelUrl` property of a List Render Jobs response item.
- $ref: '#/components/parameters/XRequestIdHeader'
responses:
'202':
description: Cancellation accepted. The job is transitioning to `canceled`; poll `GET /v1/status/{jobId}` to observe the terminal state.
content:
application/json:
schema:
$ref: '#/components/schemas/CancelAcceptedResponse'
examples:
CancelAccepted:
$ref: '#/components/examples/CancelAccepted'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidJsonError:
value:
error_code: invalid_json
message: Invalid request. Please check the input data.
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidToken:
value:
error_code: '401013'
message: OAuth token is not valid.
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidContext:
value:
error_code: access_error
message: Token not allowed in the current context.
'404':
description: Not Found — `jobId` is unknown or no longer accessible.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
JobNotFound:
$ref: '#/components/examples/CancelJobNotFound'
'409':
description: Conflict — the job is already in a terminal state and cannot be canceled.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
JobAlreadyCompleted:
$ref: '#/components/examples/CancelJobAlreadyCompleted'
JobAlreadyCanceled:
$ref: '#/components/examples/CancelJobAlreadyCanceled'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
RateLimited:
value:
error_code: rate_limit_exceeded
message: Too many requests. Please retry after some time.
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InternalServerError:
value:
error_code: runtime_error
message: Internal Server Error
messageId: '50005001'
/v1/templates/render-jobs:
get:
tags:
- Dynamic Graphics Render
summary: List render jobs
description: 'Returns a paginated list of template render jobs owned by the authenticated caller, optionally filtered by status and creation date.
**Applicable only to render jobs submitted via `POST /v1/templates/render`.** Jobs from other API types (Describe, Reframe, TLS, TTS, Avatar) are not returned.
**Filter syntax (FIQL):**
- `status==running` — single status equality
- `status=in=(running,not_started)` — status set membership
- `createdDate=ge=2026-05-01T00:00:00Z` — absolute ISO 8601 lower bound
- `createdDate=ge=-P7D` — relative ISO 8601 duration (last 7 days)
- Combine with `;` (AND): `status==running;createdDate=ge=-P7D`
**Default filter:** all statuses, `createdDate` within the last 30 days.
**Retention:** `createdDate` filter values must fall within the 30-day retention window.
**Pagination:** follow `paging.nextUrl` until it is absent (last page).'
operationId: list-render-jobs
parameters:
- name: filter
in: query
required: false
description: 'FIQL filter string. Supported sub-params: `status` (enum) and `createdDate` (ISO 8601 date-time or relative duration). Default: `createdDate=ge=-P30D;status=in=(not_started,running,succeeded,partially_succeeded,failed,canceled)`.'
schema:
type: string
examples:
RunningOnly:
summary: Running jobs only
value: status==running
Last7DaysRunning:
summary: Running jobs in last 7 days
value: createdDate=ge=-P7D;status==running
AbsoluteDateRange:
summary: Absolute date range
value: createdDate=ge=2026-05-14T00:00:00Z;createdDate=le=2026-05-21T00:00:00Z
MultipleStatuses:
summary: Multiple statuses
value: status=in=(running,not_started)
- name: limit
in: query
required: false
description: Maximum number of job entries to return per page. Must be between 1 and 100 (inclusive). Defaults to 20.
schema:
type: integer
minimum: 1
maximum: 100
default: 20
- name: cursor
in: query
required: false
description: Opaque pagination cursor returned in `paging.nextUrl` of a previous response. Omit to fetch the first page.
schema:
type: string
- $ref: '#/components/parameters/XRequestIdHeader'
responses:
'200':
description: Success — list of render jobs (may be empty).
content:
application/json:
schema:
$ref: '#/components/schemas/RenderJobListResponse'
examples:
FirstPageWithMore:
$ref: '#/components/examples/RenderJobListFirstPage'
LastPage:
$ref: '#/components/examples/RenderJobListLastPage'
EmptyResult:
$ref: '#/components/examples/RenderJobListEmpty'
'400':
description: Bad request — invalid filter, limit, cursor, or date range.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidStatusFilter:
$ref: '#/components/examples/ListJobsInvalidStatusFilter'
LimitOutOfRange:
$ref: '#/components/examples/ListJobsLimitOutOfRange'
InvalidCursor:
$ref: '#/components/examples/ListJobsInvalidCursor'
InvalidFilter:
$ref: '#/components/examples/ListJobsInvalidFilter'
FilterOutOfRetention:
$ref: '#/components/examples/ListJobsFilterOutOfRetention'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidToken:
value:
error_code: '401013'
message: OAuth token is not valid.
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidContext:
value:
error_code: access_error
message: Token not allowed in the current context.
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
RateLimited:
value:
error_code: rate_limit_exceeded
message: Too many requests. Please retry after some time.
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InternalServerError:
value:
error_code: runtime_error
message: Internal Server Error
messageId: '50005001'
components:
examples:
ListJobsInvalidStatusFilter:
summary: Invalid status value in filter
value:
error_code: invalid_status_filter
message: status must be one of not_started, running, succeeded, partially_succeeded, failed, canceled.
ListJobsInvalidFilter:
summary: Syntactically invalid FIQL expression
value:
error_code: invalid_filter
message: 'Invalid filter: unexpected token at position 5.'
PresetsResponse:
summary: List of supported presets
value:
items:
- presetId: ffs_video_api_land_1080p_hq
label: Landscape 1920×1080 – HQ
mediaType: video/mp4
codec: H.264
maxFps:
numerator: 30
denominator: 1
bitrateMode: vbr
targetBitrateInKbps: 8000
maxBitrateInKbps: 12000
alpha: false
primaryUsage: Youtube, Web Promos
- presetId: ffs_video_api_land_1080p_lq
label: Landscape 1920×1080 – LQ
mediaType: video/mp4
codec: H.264
maxFps:
numerator: 30
denominator: 1
bitrateMode: vbr
targetBitrateInKbps: 6000
maxBitrateInKbps: 8000
alpha: false
primaryUsage: Previews
- presetId: ffs_video_api_square_1080p_hq
label: Square 1080×1080 – HQ
mediaType: video/mp4
codec: H.264
maxFps:
numerator: 30
denominator: 1
bitrateMode: vbr
targetBitrateInKbps: 6000
maxBitrateInKbps: 8000
alpha: false
primaryUsage: IG / FB feed ads, LinkedIn videos, X
- presetId: ffs_video_api_square_1080p_lq
label: Square 1080×1080 – LQ
mediaType: video/mp4
codec: H.264
maxFps:
numerator: 30
denominator: 1
bitrateMode: vbr
targetBitrateInKbps: 3000
maxBitrateInKbps: 4000
alpha: false
primaryUsage: Previews
- presetId: ffs_video_api_vert_1920p_hq
label: Vertical 1080×1920 – HQ
mediaType: video/mp4
codec: H.264
profile: high
maxFps:
numerator: 30
denominator: 1
bitrateMode: vbr
targetBitrateInKbps: 6000
maxBitrateInKbps: 8000
alpha: false
primaryUsage: Reels, TikTok, Snapchat Paid Ads
- presetId: ffs_video_api_vert_1920p_lq
label: Vertical 1080×1920 – LQ
mediaType: video/mp4
codec: H.264
profile: high
maxFps:
numerator: 30
denominator: 1
bitrateMode: vbr
targetBitrateInKbps: 3000
maxBitrateInKbps: 4000
alpha: false
primaryUsage: Previews
- presetId: ffs_video_api_prores
label: ProRes export preset supporting Alpha channel
mediaType: video/quicktime
codec: Apple ProRes 4444
profile: high
maxFps:
numerator: 30
denominator: 1
bitrateMode: vbr
alpha: true
pr
# --- truncated at 32 KB (55 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/adobe-suite/refs/heads/main/openapi/adobe-suite-dynamic-graphics-render-api-openapi.yml