Argil Webhooks API
Register, list, update, and delete webhooks that fire on video render events (VIDEO_GENERATION_SUCCESS, VIDEO_GENERATION_FAILED) so integrations can react to completed or failed renders without polling.
Register, list, update, and delete webhooks that fire on video render events (VIDEO_GENERATION_SUCCESS, VIDEO_GENERATION_FAILED) so integrations can react to completed or failed renders without polling.
openapi: 3.0.3
info:
title: Argil API
version: '1.0'
description: >-
The Argil API programmatically generates AI avatar videos. Create a video
from moments (transcript or audio) mapped to an avatar and voice, render it
asynchronously, clone avatars and voices, manage B-roll assets, and receive
render events via webhooks. All requests authenticate with an `x-api-key`
header.
contact:
name: Argil
url: https://www.argil.ai
termsOfService: https://www.argil.ai/terms
servers:
- url: https://api.argil.ai/v1
description: Argil production API
security:
- ApiKeyAuth: []
tags:
- name: Videos
description: Create, render, and manage avatar videos.
- name: Avatars
description: Create and list avatars and digital twins.
- name: Voices
description: Clone, list, and sync voices.
- name: Assets
description: Upload and manage B-roll and media assets.
- name: Webhooks
description: Register and manage render-event webhooks.
paths:
/videos:
post:
tags:
- Videos
operationId: createVideo
summary: Create a new video
description: >-
Creates a video from an array of moments. Each moment binds a transcript
or audio URL to an avatar and voice. The video is created in an IDLE
state and must be rendered to produce an MP4.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateVideoRequest'
responses:
'201':
description: Video created.
content:
application/json:
schema:
$ref: '#/components/schemas/Video'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
get:
tags:
- Videos
operationId: listVideos
summary: List videos
description: Returns a paginated list of videos for the authenticated account.
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/PageSize'
responses:
'200':
description: A paginated list of videos.
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/Video'
page:
type: integer
pageSize:
type: integer
total:
type: integer
'401':
$ref: '#/components/responses/Unauthorized'
/videos/{id}:
parameters:
- $ref: '#/components/parameters/VideoId'
get:
tags:
- Videos
operationId: getVideo
summary: Get a video
description: Retrieves a single video by its ID, including status and output URLs.
responses:
'200':
description: The requested video.
content:
application/json:
schema:
$ref: '#/components/schemas/Video'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
tags:
- Videos
operationId: deleteVideo
summary: Delete a video
description: Permanently deletes a video by its ID.
responses:
'204':
description: Video deleted.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/videos/{id}/render:
parameters:
- $ref: '#/components/parameters/VideoId'
post:
tags:
- Videos
operationId: renderVideo
summary: Render a video
description: >-
Triggers asynchronous rendering of a video. Optionally accepts a
one-shot `callbackUrl` (HTTPS) that receives a webhook when this
specific render completes.
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
callbackUrl:
type: string
format: uri
description: >-
Optional HTTPS URL to receive a one-shot notification when
this render completes.
responses:
'200':
description: Render started; returns the updated video with status.
content:
application/json:
schema:
$ref: '#/components/schemas/Video'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/avatars:
post:
tags:
- Avatars
operationId: createAvatar
summary: Create an avatar
description: >-
Creates a new avatar from training media. See also the video-based
avatar creation flow.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateAvatarRequest'
responses:
'201':
description: Avatar created (training may be asynchronous).
content:
application/json:
schema:
$ref: '#/components/schemas/Avatar'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
get:
tags:
- Avatars
operationId: listAvatars
summary: List avatars
description: Returns all avatars available to the account, including stock avatars.
responses:
'200':
description: A list of avatars.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Avatar'
'401':
$ref: '#/components/responses/Unauthorized'
/avatars/{id}:
parameters:
- $ref: '#/components/parameters/AvatarId'
get:
tags:
- Avatars
operationId: getAvatar
summary: Get an avatar
description: Retrieves a single avatar by its ID.
responses:
'200':
description: The requested avatar.
content:
application/json:
schema:
$ref: '#/components/schemas/Avatar'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/voices:
post:
tags:
- Voices
operationId: createVoice
summary: Clone a voice
description: Clones a custom voice from an audio sample.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateVoiceRequest'
responses:
'201':
description: Voice created (cloning may be asynchronous).
content:
application/json:
schema:
$ref: '#/components/schemas/Voice'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
get:
tags:
- Voices
operationId: listVoices
summary: List voices
description: Returns all voices available to the account.
responses:
'200':
description: A list of voices.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Voice'
'401':
$ref: '#/components/responses/Unauthorized'
/voices/{id}:
parameters:
- $ref: '#/components/parameters/VoiceId'
get:
tags:
- Voices
operationId: getVoice
summary: Get a voice
description: Retrieves a single voice by its ID.
responses:
'200':
description: The requested voice.
content:
application/json:
schema:
$ref: '#/components/schemas/Voice'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/voices/sync:
post:
tags:
- Voices
operationId: syncVoices
summary: Sync voices
description: >-
Re-syncs voices from underlying providers (ElevenLabs, Minimax) into the
account's voice library.
responses:
'200':
description: Voices synced.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Voice'
'401':
$ref: '#/components/responses/Unauthorized'
/assets:
post:
tags:
- Assets
operationId: uploadAsset
summary: Upload an asset
description: Creates a new asset from a URL for use as B-roll or background music.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- url
properties:
url:
type: string
format: uri
description: Public URL of the media to import.
name:
type: string
responses:
'201':
description: Asset created (processing may be asynchronous).
content:
application/json:
schema:
$ref: '#/components/schemas/Asset'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
get:
tags:
- Assets
operationId: listAssets
summary: List assets
description: Returns all assets in the account's library.
responses:
'200':
description: A list of assets.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Asset'
'401':
$ref: '#/components/responses/Unauthorized'
/assets/{id}:
parameters:
- $ref: '#/components/parameters/AssetId'
get:
tags:
- Assets
operationId: getAsset
summary: Get an asset
description: Retrieves an asset and its processing status by ID.
responses:
'200':
description: The requested asset.
content:
application/json:
schema:
$ref: '#/components/schemas/Asset'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
tags:
- Assets
operationId: deleteAsset
summary: Delete an asset
description: Removes an uploaded asset by ID.
responses:
'204':
description: Asset deleted.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/webhooks:
post:
tags:
- Webhooks
operationId: createWebhook
summary: Create a webhook
description: >-
Registers a webhook that fires on the specified render events. Argil
POSTs the event payload to `callbackUrl`.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateWebhookRequest'
responses:
'201':
description: Webhook created.
content:
application/json:
schema:
$ref: '#/components/schemas/Webhook'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
get:
tags:
- Webhooks
operationId: listWebhooks
summary: List webhooks
description: Retrieves all webhooks registered for the account.
responses:
'200':
description: A list of webhooks.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Webhook'
'401':
$ref: '#/components/responses/Unauthorized'
/webhooks/{id}:
parameters:
- $ref: '#/components/parameters/WebhookId'
put:
tags:
- Webhooks
operationId: updateWebhook
summary: Update a webhook
description: Modifies an existing webhook's configuration.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateWebhookRequest'
responses:
'200':
description: Webhook updated.
content:
application/json:
schema:
$ref: '#/components/schemas/Webhook'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
tags:
- Webhooks
operationId: deleteWebhook
summary: Delete a webhook
description: Removes a webhook by ID.
responses:
'204':
description: Webhook deleted.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
components:
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: x-api-key
description: API key issued in the Argil dashboard.
parameters:
VideoId:
name: id
in: path
required: true
schema:
type: string
format: uuid
AvatarId:
name: id
in: path
required: true
schema:
type: string
VoiceId:
name: id
in: path
required: true
schema:
type: string
AssetId:
name: id
in: path
required: true
schema:
type: string
WebhookId:
name: id
in: path
required: true
schema:
type: string
Page:
name: page
in: query
required: false
schema:
type: integer
default: 1
PageSize:
name: pageSize
in: query
required: false
schema:
type: integer
default: 20
responses:
Unauthorized:
description: Missing or invalid API key.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Resource not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
ValidationError:
description: Request validation failed.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Moment:
type: object
description: A segment of a video pairing a script or audio with an avatar and voice.
properties:
transcript:
type: string
maxLength: 500
description: Text the avatar speaks. Mutually exclusive with audioUrl.
audioUrl:
type: string
format: uri
description: URL of pre-recorded audio (up to ~40s). Mutually exclusive with transcript.
avatarId:
type: string
description: Avatar that presents this moment.
voiceId:
type: string
description: Voice used to synthesize the transcript.
gestureSlug:
type: string
description: Optional gesture applied during the moment.
zoom:
type: number
description: Optional zoom level for the moment.
required:
- avatarId
Subtitles:
type: object
properties:
enabled:
type: boolean
style:
type: string
position:
type: string
size:
type: integer
CreateVideoRequest:
type: object
required:
- name
- moments
properties:
name:
type: string
description: Video title.
moments:
type: array
items:
$ref: '#/components/schemas/Moment'
subtitles:
$ref: '#/components/schemas/Subtitles'
aspectRatio:
type: string
enum:
- '16:9'
- '9:16'
enableAutoBrolls:
type: boolean
model:
type: string
enum:
- ARGIL_V1
- ARGIL_ATOM
extras:
type: object
additionalProperties:
type: string
description: Up to 10 custom key-value pairs (max 256 chars each).
Video:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
status:
type: string
enum:
- IDLE
- GENERATING_AUDIO
- GENERATING_VIDEO
- DONE
- FAILED
duration:
type: number
nullable: true
aspectRatio:
type: string
moments:
type: array
items:
$ref: '#/components/schemas/Moment'
videoUrl:
type: string
format: uri
nullable: true
videoUrlSubtitled:
type: string
format: uri
nullable: true
previewUrl:
type: string
format: uri
nullable: true
extras:
type: object
additionalProperties:
type: string
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
CreateAvatarRequest:
type: object
required:
- name
properties:
name:
type: string
videoUrl:
type: string
format: uri
description: Source video used for video-based avatar cloning.
imageUrl:
type: string
format: uri
Avatar:
type: object
properties:
id:
type: string
name:
type: string
status:
type: string
enum:
- TRAINING
- READY
- FAILED
thumbnailUrl:
type: string
format: uri
nullable: true
createdAt:
type: string
format: date-time
CreateVoiceRequest:
type: object
required:
- name
- sampleUrl
properties:
name:
type: string
sampleUrl:
type: string
format: uri
description: URL of an audio sample used to clone the voice.
Voice:
type: object
properties:
id:
type: string
name:
type: string
provider:
type: string
enum:
- ELEVENLABS
- MINIMAX
- ARGIL
status:
type: string
enum:
- PROCESSING
- READY
- FAILED
createdAt:
type: string
format: date-time
Asset:
type: object
properties:
id:
type: string
name:
type: string
url:
type: string
format: uri
status:
type: string
enum:
- PROCESSING
- READY
- FAILED
createdAt:
type: string
format: date-time
CreateWebhookRequest:
type: object
required:
- callbackUrl
- events
properties:
callbackUrl:
type: string
format: uri
description: HTTPS URL that receives event payloads.
events:
type: array
items:
type: string
enum:
- VIDEO_GENERATION_SUCCESS
- VIDEO_GENERATION_FAILED
Webhook:
type: object
properties:
id:
type: string
callbackUrl:
type: string
format: uri
events:
type: array
items:
type: string
createdAt:
type: string
format: date-time
Error:
type: object
properties:
message:
type: string
code:
type: string
statusCode:
type: integer