---
title: "List the caller's Routines"
method: GET
path: "/api/v1/routines"
---

# List the caller's Routines

`GET /api/v1/routines`

## Request

- Base URL: `https://charm.ing`
- URL: `https://charm.ing/api/v1/routines`
- Auth: HTTP bearer

Session-gated. Lists every Routine on an app the caller can edit (holds `app:write` on): their own apps, their teams' apps, and apps shared with them as a collaborator.

## Response `200`

The caller's Routines.

- RoutineListResponse: The caller's Routines, and the Routine ceilings their plan allows.
  - `ok` true, required
  - `routines` Routine[], required
    - `id` string, required: Public id, `routine_<uuid>` form.
    - `app_id` string, uuid, required
    - `op` string, required
    - `interval` 'hourly' | 'daily' | 'weekly', required
    - `enabled` boolean, required
    - `disabled_reason` 'owner' | 'auto' | 'null', nullable, required
    - `next_run_at` string, date-time, nullable, required: `null` while the Routine is disabled — the underlying schedule is preserved and reappears here once re-enabled, with no recomputation.
    - `last_run_at` string, date-time, nullable, required
    - `last_outcome` string, nullable, required
    - `last_error` object, nullable, required
      - `kind` string, required
      - `message` string, required
    - `consecutive_failures` integer, required
  - `limits` object, required: The caller's own Routine ceilings, resolved from their plan. Read these rather than assuming a tier: a client that hardcodes the free numbers disables its create control for a paying owner the server would allow.
    - `routines_per_app` integer, required
    - `routines_per_owner` integer, required

## Other responses

- `401`: Sign-in required.

---

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