# List cron jobs

`GET https://api.instacloud.com/projects/{projectId}/cron-jobs`

**Token scope:** `account` · `org` · `project` — read-only tokens allowed.

List the project’s cron jobs, optionally for one branch.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `branch` | query | `string` | no | branch name; omitted lists every branch |
| `projectId` | path | `string` | yes |  |

## Response 200

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `jobs` | `object[]` | yes |  |
| `jobs.id` | `string` | yes |  |
| `jobs.project_id` | `string` | yes |  |
| `jobs.branch_id` | `string` | yes |  |
| `jobs.branch` | `string` | yes | branch name, joined for readability — the id is the identity |
| `jobs.name` | `string` | yes |  |
| `jobs.expression` | `string` | yes |  |
| `jobs.timezone` | `string` | yes | UTC in v1, so preview and the materializer can never disagree |
| `jobs.enabled` | `boolean` | yes |  |
| `jobs.revision` | `integer` | yes | the If-Match guard for PATCH |
| `jobs.next_run_at` | `string \| null` | yes |  |
| `jobs.target` | `object` | yes | Where the job sends its request. An internal target names the SERVICE, never a URL: the worker resolves the live route at send time, so a redeploy or a region move cannot leave a job firing at a dead host. |
| `jobs.request` | `object` | yes | The non-secret description of the job’s request. |
| `jobs.request.method` | `"GET" \| "POST"` | yes |  |
| `jobs.request.headerNames` | `string[]` | yes | names only, literal and secret-backed alike — never values |
| `jobs.request.secretRefs` | `object` | yes | header name → secret NAME for the secret-backed headers. Names are not credentials, so they are returned: an edit can re-send these as they are, where a literal header’s value must be supplied again. |
| `jobs.request_timeout_ms` | `integer` | yes |  |
| `jobs.retry_policy` | `object` | yes |  |
| `jobs.retry_policy.platformMaxRetries` | `integer` | no | retries for failures where nothing was sent (wake/transport). Default 2. |
| `jobs.retry_policy.applicationMaxRetries` | `integer` | no | retries for a non-2xx answer. Default 0 — a broken endpoint should not be hammered. |
| `jobs.retry_policy.retryableStatuses` | `integer[]` | no | e.g. [429, 503]; empty means none |
| `jobs.retry_policy.maxRunAgeMs` | `integer` | no | give up on the run once it is this old, whatever the retry budget says |
| `jobs.created_at` | `string` | yes |  |
| `jobs.updated_at` | `string` | yes |  |

## Response 404

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | `string` | yes |  |
