# list_site_crons

Source: https://modulify.ai/docs/api/scheduled-jobs/list-site-crons

Lists the scheduled jobs configured on a site, with their schedules, their state and how their last scheduled run went.

- Title: List scheduled jobs
- Scope: `config:read`
- Access: Read only
- Endpoint: `POST /v1/list_site_crons`

These are the site's own scheduled jobs, the ones configured in the editor, not anything internal to Modulify. Each comes with its schedule, whether it is enabled, when it last ran on its schedule and how that went, when it runs next, how many times in a row it has failed, and the reason it was switched off automatically, such as reaching 20 failures in a row. A run started by hand does not move those last-run fields.

A site holds at most 10 jobs, so one call always returns all of them. Request headers on each step come back masked, because a header value can itself be a credential. A [deploy hook](https://modulify.ai/docs/automations/deploy-hooks) token inside a URL comes back as `mdh_<redacted>`, because that URL can publish the site, and reading it needs `get_deploy_hook_url`. See [Scheduled jobs](https://modulify.ai/docs/automations/scheduled-jobs).

## Request

Call it with a `POST` to `https://api.modulify.ai/v1/list_site_crons`, sending the inputs below as a JSON object. The token needs the `config:read` scope.

It only reads and changes nothing, so retrying it is safe.

```bash
curl -X POST https://api.modulify.ai/v1/list_site_crons \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"projectId":"PROJECT_ID"}'
```

Over MCP, the same method is the [list_site_crons tool](https://modulify.ai/docs/mcp/scheduled-jobs/list-site-crons).

## Inputs

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string | Yes | The site id. |

## Response

Every call answers with the [JSON envelope](https://modulify.ai/docs/api/requests-and-responses#the-response) of `success`, `message`, `data`, `code` and `version`. `data` holds the result described above, and on a method that returns a total, `count` carries it. The [response headers](https://modulify.ai/docs/api/requests-and-responses#headers-on-every-method-call) carry the call's `X-Request-Id` and what is left of your per-minute budget in `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`. [Errors](https://modulify.ai/docs/api/errors) explains every status code a call can answer with.