---
title: "Execute Dry Run"
method: POST
path: "/billing/developer/runs/{billing_run_id}/execute"
tags: ["Billing", "billing"]
---

# Execute Dry Run

`POST /billing/developer/runs/{billing_run_id}/execute`

## Request

- Base URL: `https://api.openintake.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.openintake.ai/billing/developer/runs/{billing_run_id}/execute`
- Auth: none declared

Execute a dry run for real — converts the run in-place.

Deletes old dry-run items, flips is_dry_run to False, resets counters,
and re-dispatches the Celery task. The same run ID is reused so the
UI updates in-place without clutter.

Developer only.

## Path parameters

- `billing_run_id` string, uuid, required

## Response `200`

Successful Response

- BillingRunResponse
  - `billing_run_id` string, uuid, required
  - `status` string, required
  - `is_dry_run` boolean, required
  - `initiated_by` string, uuid, nullable
  - `total_customers` integer, required
  - `total_items` integer, required
  - `successful_items` integer, required
  - `failed_items` integer, required
  - `skipped_items` integer, required
  - `total_amount_cents` integer, required
  - `total_amount_display` string, required
  - `error_message` string, nullable
  - `celery_task_id` string, nullable
  - `started_at` string, date-time, nullable
  - `completed_at` string, date-time, nullable
  - `created_at` string, date-time, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/openintake/apis/openintake-api.md) - [All operations](https://skmtc.dev/openintake/apis/openintake-api/llms.txt) - [OpenAPI document](https://skmtc.dev/openintake/apis/openintake-api/revisions/de90a8dcbc07?raw)
