---
title: "Trigger an immediate on-demand delivery for one schedule."
method: POST
path: "/v1/dashboards/{id}/export-schedules/{sid}/run"
tags: ["exports"]
---

# Trigger an immediate on-demand delivery for one schedule.

`POST /v1/dashboards/{id}/export-schedules/{sid}/run`

## Request

- Base URL: `http://localhost:8080`
- URL: `http://localhost:8080/v1/dashboards/{id}/export-schedules/{sid}/run`
- Auth: one of:
  - API key in cookie `dvt_session`
  - HTTP bearer

Delivers this ONE schedule immediately, bypassing `next_run`, without affecting any
other schedule or org (DVT-811). The regular cron occurrence fires independently —
`next_run_at` is NOT advanced. All fire-time guardrails (re-auth, active-only
recipients, per-run dedup) apply via the standard runner pipeline.

Requires `dashboard:write` (owner or org-admin).

## Response `200`

On-demand run triggered and driven to completion (or in-flight).

- ExportRunNowEnvelope
  - `data` ExportRunNow, required
    - `runId` string, uuid, required
    - `status` 'done' | 'skipped' | 'failed' | 'in_progress', required: Outcome of the on-demand run. `in_progress` means the render is still in flight and a later cron tick will complete delivery.
  - `meta` Meta, required: Response metadata.
    - `requestId` string, required: Correlates with the X-Request-Id header.
    - `total` integer: Item count, present on collection responses.
    - `nextCursor` string, nullable: Opaque keyset-pagination cursor, present on paginated responses (e.g. GET /v1/dashboards) when more rows exist beyond this page. Pass it back as the `cursor` query param to fetch the next page; absent or null on the last page.
    - `roleResolveDegraded` boolean: Snowflake mode only (DVT-2260), on GET /v1/dashboards: present and true when the caller's live Snowflake role resolution failed or was unavailable — role-shared dashboards may be missing from this page. Omitted (not merely false) whenever resolution succeeded or the role-share arm does not apply (off snowflake mode, an org admin/owner, or off the ingress listener).

## Other responses

- `400`: Malformed request.
- `401`: Missing, invalid, or expired session.
- `403`: The caller's role does not permit this action.
- `404`: Resource does not exist.
- `409`: The request conflicts with the current state of the resource.
- `503`: The service or a required dependency is temporarily unavailable.

---

[API](https://skmtc.dev/dvt/apis/dvt-rest-api.md) · [All operations](https://skmtc.dev/dvt/apis/dvt-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dvt/apis/dvt-rest-api/revisions/00016f504165?raw)
