> ## Documentation Index
> Fetch the complete documentation index at: https://help.the-meridian.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Scheduler

The scheduler runs your app's cron work: Meridian calls a path in your app on a schedule you set, so a background job is an ordinary HTTP handler rather than a separate worker you have to host.

Scheduler is a paid runtime add-on. Enable it from **Hosting → Scheduler**; the price for your app is shown on the button.

## Adding a job

A job is a **name**, a **path** in your app, a **schedule**, and a **timezone**. The screen shows the exact URL it will call (your environment's base URL plus the path) before you save. Schedules come as presets (every 10 minutes, hourly, daily) or a custom cron expression.

Each job can be **paused** and resumed without deleting it, and the list shows when it last ran and how that run ended.

## How your handler is called

Meridian sends a `POST` to the job's path. Two things prove the request came from Meridian:

* An **OIDC token** issued for your environment's invoker service account, audienced to your app's base URL. This is the primary proof of origin, and it is what Cloud Run checks.
* An **`X-Meridian-Cron-Secret` header**, whose value matches the `CRON_SECRET` environment variable injected into your app. Compare the two in your handler if you want a check inside your own code.

`CRON_SECRET` is stored in [Secret Manager](/secrets) and injected at deploy time. You never set it yourself, and its value is never shown back to you.

Write the handler to be idempotent. A schedule can fire while a previous run is still going, and a retried delivery is a normal thing to receive.

## Job limits

The number of scheduler jobs is a plan limit, counted per app and raised by the scheduler pack. When you are at the limit, adding a job is refused with the limit and your current usage. Delete a job or add capacity from [Billing](/billing).

<Note>
  Scheduler can only be enabled once your production environment exists, and jobs call the environment's own URL, so a job added before your first successful [deployment](/deployment) will call an app that isn't serving yet.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.