> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Topaz Labs

The Topaz Labs connector lets your AI agent act in each user's Topaz Labs account. Each user connects their own Topaz Labs API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 21 tools.

**Authentication:** API Key
**Categories:** Media, AI
**Tools:** 21: 12 read, 6 write, 3 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=TOPAZLABS)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Topaz Labs connection

   In **AgentKit > Connections**, create a Topaz Labs connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'topazlabs'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Topaz Labs:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'topazlabs_get_credit_balance',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "topazlabs"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Topaz Labs:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="topazlabs_get_credit_balance",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Topaz Labs credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'topazlabs_estimate_video_cancellation',
  toolInput: {
    request_id: '<request_id>',
  },
  connector: 'topazlabs',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="topazlabs_estimate_video_cancellation",
    tool_input={
        "request_id": "<request_id>",
    },
    connection_name="topazlabs",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `topazlabs_estimate_video_cancellation`

Estimate Video Cancellation · Read-only

Preview what canceling a Topaz Labs video request would cost, without canceling it.
Returns cancelable, status, progress, creditsReserved, creditsToCommit, creditsToRefund and a message.
Use this before topazlabs_cancel_video_request. Completed or failed requests return an error.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `request_id` (`string`, required): ID (UUID) of the video request, returned as requestId by topazlabs_create_video_request or topazlabs_create_express_video_request, or listed by topazlabs_list_video_requests. Example: 0193b36c-b37f-7997-ab75-c85f61b451e8

Example input: `{"request_id":"<request_id>"}`

### `topazlabs_get_credit_balance`

Get Credit Balance · Read-only

Get the Topaz Labs API credit balance of the account that owns the API key.
Returns available_credits, reserved_credits and total_credits.
Use this to check there are enough credits before starting a job. Use topazlabs_get_credit_usage for consumption over time.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `topazlabs_get_credit_usage`

Get Credit Usage · Read-only

Get the Topaz Labs API credits consumed over a time window, in time buckets.
Returns total_credits, total_requests and usage (period_start and credits per bucket, with a groups breakdown when group_by is set). Buckets with no activity are left out.
Use this to report spending by day, model or API key. Use topazlabs_get_credit_balance for the current balance.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `api_key_id` (`string`, optional): Only count requests made with this API key ID. Example: key_01J8Z3
- `end_date` (`string`, optional): Inclusive end date (UTC) in YYYY-MM-DD format, on or after start_date. Example: 2026-09-30
- `granularity` (`string`, optional): Bucket width for a start_date/end_date range: hour, day (default), 3day, week or month. Ignored with period. Example: week. One of: `hour`, `day`, `3day`, `week`, `month`.
- `group_by` (`string`, optional): Add a per-bucket breakdown by models or api_key_id. Example: models. One of: `models`, `api_key_id`.
- `models` (`array`, optional): Only count usage of these models, by name. Example: ["Standard V2", "Wonder"]
- `period` (`string`, optional): Relative window ending now: 1d (returns 48 hourly buckets), 7d or 30d (daily buckets). Defaults to 30d. Ignored when start_date and end_date are both set. Example: 7d. One of: `1d`, `7d`, `30d`. Default: `30d`.
- `start_date` (`string`, optional): Inclusive start date (UTC) in YYYY-MM-DD format. Use together with end_date to query a custom range instead of period. Example: 2026-09-01

Example input: `{}`

### `topazlabs_get_image_download_url`

Get Image Download URL · Read-only

Get a presigned download link for the enhanced output of a completed Topaz Labs image job.
Returns download_url, head_url and expiry (Unix time). The links expire after 1 hour; outputs are kept for 7 days.
Use this once the job is Completed; a job that is not ready returns a conflict error. Use topazlabs_get_image_input_download_url for the original image.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `process_id` (`string`, required): ID (UUID) of the image processing job: the process_id returned when the job was submitted to the Topaz Image API, or listed by topazlabs_list_image_jobs. Example: d7b3b3b3-7b3b-4b3b-8b3b-3b3b3b3b3b3b

Example input: `{"process_id":"<process_id>"}`

### `topazlabs_get_image_input_download_url`

Get Image Input Download URL · Read-only

Get a presigned download link for the original input image of a Topaz Labs image job.
Returns download_url, head_url and expiry (Unix time). The links expire after 1 hour; inputs are kept for 7 days.
Use this to retrieve the source image. Use topazlabs_get_image_download_url for the enhanced result.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `process_id` (`string`, required): ID (UUID) of the image processing job: the process_id returned when the job was submitted to the Topaz Image API, or listed by topazlabs_list_image_jobs. Example: d7b3b3b3-7b3b-4b3b-8b3b-3b3b3b3b3b3b

Example input: `{"process_id":"<process_id>"}`

### `topazlabs_get_image_job_status`

Get Image Job Status · Read-only

Get the status of one Topaz Labs image processing job.
Returns status (Pending, Processing, Completed, Cancelled or Failed), progress, eta, model, credits, and input and output format and size.
Use this to poll an image job. Once it is Completed, call topazlabs_get_image_download_url for the result.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `process_id` (`string`, required): ID (UUID) of the image processing job: the process_id returned when the job was submitted to the Topaz Image API, or listed by topazlabs_list_image_jobs. Example: d7b3b3b3-7b3b-4b3b-8b3b-3b3b3b3b3b3b

Example input: `{"process_id":"<process_id>"}`

### `topazlabs_get_video_request`

Get Video Request · Read-only

Get the full record of one Topaz Labs video request.
Returns the submitted source, filters and output settings, corrected source metrics, estimates, credit transactions, status and signed download URLs.
Use this for the details of a request, including one still in the requested state. Use topazlabs_get_video_request_status to poll progress.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `request_id` (`string`, required): ID (UUID) of the video request, returned as requestId by topazlabs_create_video_request or topazlabs_create_express_video_request, or listed by topazlabs_list_video_requests. Example: 0193b36c-b37f-7997-ab75-c85f61b451e8

Example input: `{"request_id":"<request_id>"}`

### `topazlabs_get_video_request_metrics`

Get Video Request Metrics · Read-only

Get processing metrics for a Topaz Labs video request.
Returns minutes spent in each state, minutesToEnhance, input and output frame counts and sizes, and per-chunk GPU statistics; only a message when metrics are unavailable.
Use this to analyse how a finished or running job was processed. Use topazlabs_get_video_request_status for progress.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `request_id` (`string`, required): ID (UUID) of the video request, returned as requestId by topazlabs_create_video_request or topazlabs_create_express_video_request, or listed by topazlabs_list_video_requests. Example: 0193b36c-b37f-7997-ab75-c85f61b451e8

Example input: `{"request_id":"<request_id>"}`

### `topazlabs_get_video_request_status`

Get Video Request Status · Read-only

Check the progress of a Topaz Labs video request.
Returns status (requested, accepted, initializing, preprocessing, processing, postprocessing, complete, canceling, canceled or failed), progress percentage, estimates, errorCode on failure, any outstanding upload URLs and, once complete, download.url with its expiry (7 days by default).
Use this to poll a running job and to get the enhanced video's download link. Use topazlabs_get_video_request for the settings that were submitted.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `request_id` (`string`, required): ID (UUID) of the video request, returned as requestId by topazlabs_create_video_request or topazlabs_create_express_video_request, or listed by topazlabs_list_video_requests. Example: 0193b36c-b37f-7997-ab75-c85f61b451e8

Example input: `{"request_id":"<request_id>"}`

### `topazlabs_get_video_system_status`

Get Video System Status · Read-only

Check whether the Topaz Labs video service is available.
Returns isAvailable, availabilityMessage, supportedModels (model short codes such as prob-4 or apo-8) and isFrameInterpolationSupported.
Use this to find the model codes accepted in filters before creating a video request.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `topazlabs_list_image_jobs`

List Image Jobs · Read-only

List the account's Topaz Labs image processing jobs.
Returns job statuses (process_id, filename, model, status, progress, eta, credits, input and output size) and, when paginated, next_cursor and has_next_page.
Use this to find image jobs submitted to the Topaz Image API by your own application. Use topazlabs_get_image_job_status for one job.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): Pagination cursor: the next_cursor value from the previous page. Leave empty for the first page. Example: eyJpZCI6ImQ3YjNiM2IzIn0
- `limit` (`integer`, optional): Jobs per page when paginated, 1 to 100. Defaults to 50. Example: 50. Default: `50`.
- `paginated` (`boolean`, optional): Return results in pages with next_cursor. Defaults to true; false returns every status up to 7 days old in one array, which can be slow on busy accounts. Example: true. Default: `true`.

Example input: `{}`

### `topazlabs_list_video_requests`

List Video Requests · Read-only

List the account's Topaz Labs video requests, newest first, up to 50 per page.
Returns result (request records with status, settings and download URLs) and nextCursor.
Use this to browse past and running jobs. Requests not yet accepted are left out; fetch those with topazlabs_get_video_request. A page can hold fewer than 50 even when more exist, so follow nextCursor until it is null.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `cursor` (`string`, optional): Pagination cursor: the nextCursor value from the previous page. Leave empty for the first page. Example: eyJpZCI6IjAxOTNiMzZjIn0

Example input: `{}`

### `topazlabs_accept_video_request`

Accept Video Request · Write

Accept a video request created by topazlabs_create_video_request, which reserves the estimated credits.
Returns uploadId and urls (presigned upload URLs) when the source must be uploaded, or a message when the request was created with a source_url and processing has started.
Use this after reviewing the estimate. For an upload, PUT the file (or its 500 MB parts, in order) to the returned urls yourself, outside this tool, then call topazlabs_complete_video_upload. Calling it again returns the same URLs.
Requires a requestId from topazlabs_create_video_request.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `request_id` (`string`, required): ID (UUID) of the video request, returned as requestId by topazlabs_create_video_request or topazlabs_create_express_video_request, or listed by topazlabs_list_video_requests. Example: 0193b36c-b37f-7997-ab75-c85f61b451e8

Example input: `{"request_id":"<request_id>"}`

### `topazlabs_complete_video_upload`

Complete Video Upload · Write

Tell Topaz Labs the source video upload is finished so the request starts processing.
Returns a message such as Processing has been queued.
Use this after you have PUT the source file to the URLs from topazlabs_accept_video_request. Not needed when the request was created with a source_url, or for express requests.
Requires the requestId and the ETag of each uploaded part.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `request_id` (`string`, required): ID (UUID) of the video request, returned as requestId by topazlabs_create_video_request or topazlabs_create_express_video_request, or listed by topazlabs_list_video_requests. Example: 0193b36c-b37f-7997-ab75-c85f61b451e8
- `upload_results` (`array`, required): Part number and ETag of every uploaded part, in order. Part numbers start at 1; the ETag is the value of the ETag response header returned by each upload PUT. When accept returned a single URL the values are not checked, but one entry is still required, for example [{"partNum": 1, "eTag": "unused"}]. Example: [{"partNum": 1, "eTag": "ff00a2c854712e4b4765eeefa084baa5-305"}, {"partNum": 2, "eTag": "92ee1d92cda0f9f8de4429c9596773aa-34"}]
- `md5_hash` (`string`, optional): Optional MD5 hash of the whole source file in hex, used to verify the upload before processing. Example: 4d186321c1a7f0f354b297e8914ab240

Example input: `{"request_id":"<request_id>","upload_results":[{"partNum":1,"eTag":"ff00a2c854712e4b4765eeefa084baa5-305"},{"partNum":2,"eTag":"92ee1d92cda0f9f8de4429c9596773aa-34"}]}`

### `topazlabs_create_express_video_request`

Create Express Video Request · Write

Start a Topaz Labs video enhancement job in one step, without source metadata.
Returns requestId, plus uploadId and uploadUrls when no source_url is given, and cost estimates when they can be calculated up front.
Use this for the quickest start: with source_url Topaz fetches the video and begins processing at once; without it, PUT the file to uploadUrls[0] yourself and processing starts after the upload. Use topazlabs_create_video_request to see the credit estimate before committing. Poll topazlabs_get_video_request_status for progress and the download link. This spends API credits.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `container` (`string`, required): Container format of the source video file, matched case-insensitively. Example: mp4. One of: `3gp`, `avi`, `dv`, `flv`, `m1v`, `m2t`, `m2ts`, `m2v`, `m4v`, `mkv`, `mov`, `mp4`, `mpeg`, `mpg`, `mts`, `mxf`, `ser`, `ts`, `vob`, `webm`, `wmv`.
- `filters` (`array`, required): The AI models to run, in order, as a list of filter objects. Each filter needs a model short code. Enhancement models (for example prob-4 Proteus, rhea-1 Rhea, iris-3 Iris, nyx-3 Nyx, slp-2.6 Starlight Precise 2.6, ast-2 Astra 2) upscale, denoise or restore; frame-interpolation models (apo-8 Apollo, chr-2 Chronos, aion-1 Aion) change the frame rate or add slow motion. Call topazlabs_get_video_system_status for the codes the service accepts right now. Enhancement filters also take optional tuning values such as auto (Auto, Relative or Manual), videoType (Progressive or Interlaced), and detail, noise, compression, halo and blur strengths between -1 and 1; frame-interpolation filters take fps (15-240) or slowmo (1-16). Leave the tuning values out to let Topaz pick them. Example: [{"model": "prob-4"}, {"model": "apo-8", "fps": 60}]
- `output_height` (`integer`, required): Output video height in pixels. Topaz rounds it up to a multiple of 4; the encoder maximum applies as for output_width. Example: 2160
- `output_width` (`integer`, required): Output video width in pixels. Topaz rounds it up to a multiple of 4. The maximum depends on the encoder (4096 for H264, 8192 for H265 and VP9, 16384 for AV1 and ProRes). Without an upscaling model in filters the source width is kept. Example: 3840
- `audio_bitrate` (`string`, optional): Audio bitrate in kbps when audio_transfer is Copy or Convert. The codec default is used when empty. Example: 320
- `audio_codec` (`string`, optional): Audio codec for the output: AAC, AC3 or PCM. Required when audio_transfer is Copy or Convert. Example: AAC. One of: `AAC`, `AC3`, `PCM`.
- `audio_transfer` (`string`, optional): What to do with the audio track: Copy keeps it as is, Convert re-encodes it with audio_codec, None drops it. Copy and Convert also need audio_codec. Defaults to None (no audio) on this endpoint. Example: Copy. One of: `Copy`, `Convert`, `None`.
- `crop_to_fit` (`boolean`, optional): Set to true to center-crop the video to the output aspect ratio instead of letterboxing it. Example: false
- `destination_url` (`string`, optional): Optional presigned upload (PUT) URL in your own S3-compatible storage. When set, Topaz writes the enhanced video there instead of its own storage. Example: https://my-bucket.s3.amazonaws.com/out/enhanced.mp4?X-Amz-Signature=...
- `dynamic_compression_level` (`string`, optional): Automatic quality-based compression: Low, Mid or High. Use either this or video_bitrate. Applies to AV1, H264 and H265, and defaults to High when neither is set. Example: Mid. One of: `Low`, `Mid`, `High`.
- `md5_hash` (`string`, optional): Optional MD5 hash of the source file in hex. Topaz uses it to check the file it receives. Example: 5d41402abc4b2a76b9719d911017c592
- `output_container` (`string`, optional): Output file container: mp4 (default), mov, mkv, avi or webm. Replaced with mov for ProRes and with mp4 for AV1 and VP9. Example: mp4. One of: `mp4`, `mov`, `mkv`, `avi`, `webm`.
- `output_frame_rate` (`number`, optional): Output frame rate in frames per second. Without a frame-interpolation filter Topaz keeps the source frame rate. Needed only when a frame-interpolation filter has no fps of its own. Example: 60
- `source_url` (`string`, optional): Presigned download (GET) URL of the source video, for example an S3 presigned URL. Topaz fetches the file from this URL itself and checks that it can read it when the request is created, so no upload is needed. When set, processing starts right away and credits are reserved; no accept or upload step follows. When empty, the response returns uploadUrls and you must HTTP PUT the file to uploadUrls[0] yourself, outside this tool. Example: https://my-bucket.s3.amazonaws.com/in/clip.mp4?X-Amz-Signature=...
- `video_bitrate` (`string`, optional): Constant video bitrate with a k (kilobits) or m (megabits per second) suffix. Use either this or dynamic_compression_level, not both. Required for VP9. Capped at 800m for AV1 and 2000m for H264, H265 and VP9. Example: 50m
- `video_encoder` (`string`, optional): Video encoder for the output: AV1, H264, H265, ProRes or VP9. Defaults to H265. ProRes always produces a mov file and AV1 and VP9 an mp4 file. VP9 also needs video_bitrate. Example: H265. One of: `AV1`, `H264`, `H265`, `ProRes`, `VP9`.
- `video_profile` (`string`, optional): Encoder profile. Accepted values per encoder: AV1 8-bit (default) or 10-bit; H264 High; H265 Main or Main10 (default); ProRes 422 Proxy, 422 LT, 422 Std or 422 HQ (default); VP9 Good (default) or Best. Leave empty for the encoder default. Example: Main10
- `webhook_url` (`string`, optional): Optional HTTPS URL that Topaz POSTs a notification to when the request completes or fails. Example: https://example.com/webhooks/topaz

Example input: `{"container":"3gp","filters":[{"model":"prob-4"},{"model":"apo-8","fps":60}],"output_height":2160,"output_width":3840}`

### `topazlabs_create_video_request`

Create Video Request · Write

Create a Topaz Labs video enhancement request from the source video's metadata and get a cost and time estimate, without spending credits or starting processing.
Returns requestId and estimates (cost in credits and time in seconds, each as a [low, high] range).
Use this when you want the estimate before committing, then call topazlabs_accept_video_request to reserve credits and start. Use topazlabs_create_express_video_request to start in one step without metadata.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `audio_transfer` (`string`, required): What to do with the audio track: Copy keeps it as is, Convert re-encodes it with audio_codec, None drops it. Copy and Convert also need audio_codec. Example: Copy. One of: `Copy`, `Convert`, `None`.
- `container` (`string`, required): Container format of the source video file, matched case-insensitively. Example: mp4. One of: `3gp`, `avi`, `dv`, `flv`, `m1v`, `m2t`, `m2ts`, `m2v`, `m4v`, `mkv`, `mov`, `mp4`, `mpeg`, `mpg`, `mts`, `mxf`, `ser`, `ts`, `vob`, `webm`, `wmv`.
- `filters` (`array`, required): The AI models to run, in order, as a list of filter objects. Each filter needs a model short code. Enhancement models (for example prob-4 Proteus, rhea-1 Rhea, iris-3 Iris, nyx-3 Nyx, slp-2.6 Starlight Precise 2.6, ast-2 Astra 2) upscale, denoise or restore; frame-interpolation models (apo-8 Apollo, chr-2 Chronos, aion-1 Aion) change the frame rate or add slow motion. Call topazlabs_get_video_system_status for the codes the service accepts right now. Enhancement filters also take optional tuning values such as auto (Auto, Relative or Manual), videoType (Progressive or Interlaced), and detail, noise, compression, halo and blur strengths between -1 and 1; frame-interpolation filters take fps (15-240) or slowmo (1-16). Leave the tuning values out to let Topaz pick them. Example: [{"model": "prob-4"}, {"model": "apo-8", "fps": 60}]
- `output_frame_rate` (`number`, required): Output frame rate in frames per second. Without a frame-interpolation filter Topaz keeps the source frame rate. Usually the same as source_frame_rate. Example: 30
- `output_height` (`integer`, required): Output video height in pixels. Topaz rounds it up to a multiple of 4; the encoder maximum applies as for output_width. Example: 2160
- `output_width` (`integer`, required): Output video width in pixels. Topaz rounds it up to a multiple of 4. The maximum depends on the encoder (4096 for H264, 8192 for H265 and VP9, 16384 for AV1 and ProRes). Without an upscaling model in filters the source width is kept. Example: 3840
- `source_duration` (`number`, required): Duration of the source video in seconds. Example: 213
- `source_frame_count` (`integer`, required): Total number of frames in the source video. Example: 6371
- `source_frame_rate` (`number`, required): Frame rate of the source video in frames per second. Example: 30
- `source_height` (`integer`, required): Height of the source video in pixels. Example: 720
- `source_size` (`integer`, required): Size of the source video file in bytes; must be under 100 GB. Example: 16125151
- `source_width` (`integer`, required): Width of the source video in pixels. Example: 1280
- `audio_bitrate` (`string`, optional): Audio bitrate in kbps when audio_transfer is Copy or Convert. The codec default is used when empty. Example: 320
- `audio_codec` (`string`, optional): Audio codec for the output: AAC, AC3 or PCM. Required when audio_transfer is Copy or Convert. Example: AAC. One of: `AAC`, `AC3`, `PCM`.
- `crop_to_fit` (`boolean`, optional): Set to true to center-crop the video to the output aspect ratio instead of letterboxing it. Example: false
- `destination_url` (`string`, optional): Optional presigned upload (PUT) URL in your own S3-compatible storage. When set, Topaz writes the enhanced video there instead of its own storage. Example: https://my-bucket.s3.amazonaws.com/out/enhanced.mp4?X-Amz-Signature=...
- `dynamic_compression_level` (`string`, optional): Automatic quality-based compression: Low, Mid or High. Use either this or video_bitrate. Applies to AV1, H264 and H265, and defaults to High when neither is set. Example: Mid. One of: `Low`, `Mid`, `High`.
- `output_container` (`string`, optional): Output file container: mp4 (default), mov, mkv, avi or webm. Replaced with mov for ProRes and with mp4 for AV1 and VP9. Example: mp4. One of: `mp4`, `mov`, `mkv`, `avi`, `webm`.
- `source_url` (`string`, optional): Presigned download (GET) URL of the source video, for example an S3 presigned URL. Topaz fetches the file from this URL itself and checks that it can read it when the request is created, so no upload is needed. When set, topazlabs_accept_video_request starts processing directly; when empty, accept returns upload URLs that you PUT the file to yourself, outside this tool. Example: https://my-bucket.s3.amazonaws.com/in/clip.mp4?X-Amz-Signature=...
- `video_bitrate` (`string`, optional): Constant video bitrate with a k (kilobits) or m (megabits per second) suffix. Use either this or dynamic_compression_level, not both. Required for VP9. Capped at 800m for AV1 and 2000m for H264, H265 and VP9. Example: 50m
- `video_encoder` (`string`, optional): Video encoder for the output: AV1, H264, H265, ProRes or VP9. Defaults to H265. ProRes always produces a mov file and AV1 and VP9 an mp4 file. VP9 also needs video_bitrate. Example: H265. One of: `AV1`, `H264`, `H265`, `ProRes`, `VP9`.
- `video_profile` (`string`, optional): Encoder profile. Accepted values per encoder: AV1 8-bit (default) or 10-bit; H264 High; H265 Main or Main10 (default); ProRes 422 Proxy, 422 LT, 422 Std or 422 HQ (default); VP9 Good (default) or Best. Leave empty for the encoder default. Example: Main10
- `webhook_url` (`string`, optional): Optional HTTPS URL that Topaz POSTs a notification to when the request completes or fails. Example: https://example.com/webhooks/topaz

Example input: `{"audio_transfer":"Copy","container":"3gp","filters":[{"model":"prob-4"},{"model":"apo-8","fps":60}],"output_frame_rate":30,"output_height":2160,"output_width":3840,"source_duration":213,"source_frame_count":6371,"source_frame_rate":30,"source_height":720,"source_size":16125151,"source_width":1280}`

### `topazlabs_estimate_generative_image_job`

Estimate Generative Image Job · Write

Estimate the credits and processing time of a Topaz Labs image job on a generative model, without running it.
Returns credits and duration (seconds).
Use this to price generative upscaling or restoration (for example Redefine, Wonder or Recovery V2) before submitting it. Use topazlabs_estimate_image_job for standard models such as Standard V2.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `input_height` (`integer`, required): Height of the input image in pixels, 1 to 32000. Example: 1080
- `input_width` (`integer`, required): Width of the input image in pixels, 1 to 32000. Example: 1920
- `category` (`string`, optional): Model category: Enhance (upscaling), Sharpen, Denoise, Restore, Lighting, Matting or Tool. Defaults to Enhance. Example: Enhance. One of: `Enhance`, `Sharpen`, `Denoise`, `Restore`, `Lighting`, `Matting`, `Tool`. Default: `Enhance`.
- `crop_to_fill` (`boolean`, optional): Set to true to crop the image to fill a different aspect ratio instead of letterboxing it. Defaults to false. Example: false
- `model` (`string`, optional): Generative model name. Defaults to Redefine. Known values include Redefine, Wonder, Standard MAX, Recovery V2, Super Focus V2 and Dust-Scratch V2; newer generative models listed on developer.topazlabs.com may also be accepted. Example: Redefine. Default: `Redefine`.
- `model_settings` (`object`, optional): Optional model-specific settings as string key-value pairs, sent alongside the other fields. Only settings the chosen model understands are used; see the model's page on developer.topazlabs.com. Example: {"faceEnhancement": "true"}
- `output_format` (`string`, optional): Output image format: jpeg (default), jpg, png, tiff or tif. Example: png. One of: `jpeg`, `jpg`, `png`, `tiff`, `tif`.
- `output_height` (`integer`, optional): Target output height in pixels (Enhance models only). Set one of output_width or output_height and the other scales proportionally. Example: 2160
- `output_width` (`integer`, optional): Target output width in pixels (Enhance models only). Set one of output_width or output_height and the other scales proportionally. Example: 3840

Example input: `{"input_height":1080,"input_width":1920}`

### `topazlabs_estimate_image_job`

Estimate Image Job · Write

Estimate the credits and processing time of a Topaz Labs image job on a standard (non-generative) model, without running it.
Returns credits and duration (seconds).
Use this to price an image enhancement before submitting it. Use topazlabs_estimate_generative_image_job for generative models such as Redefine or Wonder.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `input_height` (`integer`, required): Height of the input image in pixels, 1 to 32000. Example: 1080
- `input_width` (`integer`, required): Width of the input image in pixels, 1 to 32000. Example: 1920
- `category` (`string`, optional): Model category: Enhance (upscaling), Sharpen, Denoise, Restore, Lighting, Matting or Tool. Defaults to Enhance. Example: Enhance. One of: `Enhance`, `Sharpen`, `Denoise`, `Restore`, `Lighting`, `Matting`, `Tool`. Default: `Enhance`.
- `crop_to_fill` (`boolean`, optional): Set to true to crop the image to fill a different aspect ratio instead of letterboxing it. Defaults to false. Example: false
- `model` (`string`, optional): Standard (non-generative) model name. Defaults to Standard V2. Known values include Standard V2, Low Resolution V2, CGI, High Fidelity V2, Text Refine (Enhance); Standard, Strong, Lens Blur V2, Motion Blur, Natural, Refocus, Wildlife, Portrait (Sharpen); Normal, Strong, Extreme (Denoise); Adjust V2, White Balance, Colorize (Lighting); Object (Matting). Example: High Fidelity V2. Default: `Standard V2`.
- `model_settings` (`object`, optional): Optional model-specific settings as string key-value pairs, sent alongside the other fields. Only settings the chosen model understands are used; see the model's page on developer.topazlabs.com. Example: {"faceEnhancement": "true"}
- `output_format` (`string`, optional): Output image format: jpeg (default), jpg, png, tiff or tif. Example: png. One of: `jpeg`, `jpg`, `png`, `tiff`, `tif`.
- `output_height` (`integer`, optional): Target output height in pixels (Enhance models only). Set one of output_width or output_height and the other scales proportionally. Example: 2160
- `output_width` (`integer`, optional): Target output width in pixels (Enhance models only). Set one of output_width or output_height and the other scales proportionally. Example: 3840

Example input: `{"input_height":1080,"input_width":1920}`

### `topazlabs_cancel_image_job`

Cancel Image Job · Destructive

Cancel a pending Topaz Labs image processing job.
Returns an empty response on success.
Use this to avoid spending credits on a job started by mistake. A completed job, or one that can no longer be canceled, returns a conflict error.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `process_id` (`string`, required): ID (UUID) of the image processing job: the process_id returned when the job was submitted to the Topaz Image API, or listed by topazlabs_list_image_jobs. Example: d7b3b3b3-7b3b-4b3b-8b3b-3b3b3b3b3b3b

Example input: `{"process_id":"<process_id>"}`

### `topazlabs_cancel_video_request`

Cancel Video Request · Destructive

Cancel a Topaz Labs video request.
Returns a message about the refund, or an empty response if the request was already canceled.
Use this to stop a job. Before processing starts all reserved credits are refunded; during processing the refund is partial, based on progress. Use topazlabs_estimate_video_cancellation first to see the exact credits. Completed or failed requests cannot be canceled.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `request_id` (`string`, required): ID (UUID) of the video request to cancel, returned as requestId by topazlabs_create_video_request or topazlabs_create_express_video_request, or listed by topazlabs_list_video_requests. Example: 0193b36c-b37f-7997-ab75-c85f61b451e8

Example input: `{"request_id":"<request_id>"}`

### `topazlabs_delete_video_files`

Delete Video Files · Destructive

Permanently delete the source and enhanced video files of a Topaz Labs video request from Topaz storage.
Returns an empty response on success.
Use this to remove files before the automatic 7-day deletion. Download the enhanced video first; the download link stops working afterwards.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `request_id` (`string`, required): ID (UUID) of the video request whose files to delete, returned as requestId by topazlabs_create_video_request or topazlabs_create_express_video_request, or listed by topazlabs_list_video_requests. Example: 0193b36c-b37f-7997-ab75-c85f61b451e8

Example input: `{"request_id":"<request_id>"}`

## Related

Other Media connectors ([all 41](/agentkit/connectors/?category=media)):

- [Reddit](/agentkit/connectors/reddit/): Scalekit connector, OAuth, 105 tools
- [Diarize](/agentkit/connectors/diarize/): Scalekit connector, Access token, 3 tools
- [YouTube](/agentkit/connectors/youtube/): Scalekit connector, OAuth, 45 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
