---
title: "Internal Cron Job Hourly"
method: POST
path: "/internal/cron_job_hourly"
---

# Internal Cron Job Hourly

`POST /internal/cron_job_hourly`

## Request

- Base URL: `https://api.tellers.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.tellers.ai/internal/cron_job_hourly`
- Auth: none declared

Internal-only: the single entry point for hourly scheduled work.

Called every hour by the ``cron-job-hourly`` CronJob (see the api-chart
templates). Runs, in order:

1. The assistant asset upload sweep — dispatch what the client never handed
   over, then reclaim what stopped making progress (``dispatch_assistant_asset_uploads``).
2. Expired multipart upload cleanup, refunding the reserved credits
   (``cleanup_expired_multipart_uploads``).
3. Stale storage-usage recomputation (``refresh_storage_usage``), so the
   gigabytes reported to a user catch up with what the workers wrote.

Dispatch runs before cleanup so a finished upload is claimed for processing
rather than reclaimed. Each step already swallows per-row errors; a step
that raises outright fails the CronJob and stops the ones after it.

Expose this router only via an internal ingress/LB (VPC-only).

## Response `200`

Successful Response

- HourlyCronResponse
  - `assistant_assets_dispatched` integer, required
  - `assistant_assets_cleaned` integer, required
  - `multipart_uploads_cleaned` integer, required
  - `storage_usage_refreshed` integer, required

---

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