---
title: "List automation workflows"
method: GET
path: "/v1/workflows"
tags: ["Workflows"]
---

# List automation workflows

`GET /v1/workflows`

## Request

- Base URL: `https://api.getfinero.com/functions/v1/api`
- URL: `https://api.getfinero.com/functions/v1/api/v1/workflows`
- Auth: HTTP bearer

Every workflow Finero has, what each one does, what causes it to run, and which are switched on for this workspace — plus what every execution reason code means. For payment-link emails it also reports whether new links send immediately or before their link-owned due date, including the tenant-local send time. Read this to understand how the automations relate to each other: creating a payment link is what sends the customer the payment email, so the same email goes out whether the link was created by the automation, by hand in Finero, or through this API. The set is closed and small, so this operation is not paginated.

Available to **admin and readonly** API keys (no side effects).

## Response `200`

Success

- object
  - `workflows` object[], required: Every workflow Finero has, with this workspace's switches merged in.
    - `workflow_type` 'payment_link_automation' | 'payment_arrangement' | 'email_notification' | 'internal_notification', required: Stable identifier.
    - `name` string, required: Display name in Finero.
    - `audience` 'customer' | 'internal' | 'none', required: Who this workflow contacts directly. `none` means it contacts nobody — its effects reach people only through the workflows it fires.
    - `enabled` boolean, required: Whether the workflow is on for this workspace.
    - `configured` boolean, required: Whether anyone has ever set this workflow up. False with `enabled` false means never set up, which is a different answer from deliberately switched off.
    - `does` string, required: What the workflow does.
    - `never_does` string[], required: Limits worth stating, because they are what people assume wrongly.
    - `triggers` object[], required: Its triggers, and whether each is on here.
      - `key` string, nullable, required: The switch an administrator toggles, or null when the workflow has no per-trigger switch and its own on/off is the switch.
      - `title` string, required: How the switch reads in Finero.
      - `enabled` boolean, required: Whether this trigger is on for this workspace.
      - `fired_by` string[], required: What causes this trigger to fire — including things a person does, not only automated ones.
      - `effect` string, required: What actually happens when it fires.
      - `delivery_timing` object, nullable, required: Configured timing for this trigger, or null when the trigger has no timing control.
        - `mode` 'immediate' | 'before_due_date', required: When a new payment-link email is planned.
        - `days_before` integer, nullable, required: Calendar days before the link-owned payment due date, or null.
        - `local_time` string, nullable, required: Tenant-local 24-hour HH:mm send time, or null for immediate delivery. Defaults to 09:00 when older settings omit it.
        - `timezone_source` 'tenant', nullable, required: The timezone is inherited from the tenant; clients never supply it.
        - `past_due_behavior` 'send_immediately', required: What happens when the calculated instant has already passed.
    - `causes` object[], required: Workflows this one fires. This is the relationship between automations: creating a payment link is what sends the customer the email.
      - `workflow_type` 'payment_link_automation' | 'payment_arrangement' | 'email_notification' | 'internal_notification', required: The workflow this one fires.
      - `trigger` string, required: Which of its triggers.
      - `when` string, required: Under what conditions, and why.
    - `operator_controls` string[], required: What a workspace administrator decides.
    - `automatic` string[], required: What Finero does on its own, without being asked.
    - `timing` string, required: When it runs, and how late a missed one can be.
    - `history` string, required: Where the record of what it did lives, and whether this API exposes it. Read this before concluding from an empty execution list that nothing happened.
    - `updated_at` string, date-time, nullable, required: When the configuration was last changed (ISO 8601 UTC).
  - `block_reasons` object[], required: Every code an installment's `block_reasons` can carry, and what each means. A DIFFERENT vocabulary from `reason_codes` below: these say why one installment cannot be collected, those say why an automation run did not do something.
    - `code` string, required: The value that appears in an installment's `block_reasons`.
    - `label` string, required: How it reads on screen in Finero.
    - `meaning` string, required: What it means, and the next move.
  - `reason_codes` object[], required: Every reason code an execution can carry, and what each means. Flat, because a code is not owned by one workflow.
    - `code` string, required: The value that appears as an execution's `reason_code`.
    - `meaning` string, required: What it means, in plain words.
    - `fault` 'none' | 'configuration' | 'data' | 'provider' | 'finero', required: Where the problem is: `configuration` a Finero setting, `data` the ERP data, `provider` the payment or email provider, `finero` a Finero fault, `none` not a fault at all.
    - `resolution` string, required: What to do about it, and by whom.

## Other responses

- `400`: `validation_failed` — The request failed schema validation. See error.details for field messages.
- `401`: `invalid_credentials` — The credential is malformed or does not match an active key. The response never reveals whether a key identifier exists. `missing_credentials` — No Authorization: Bearer header was sent. `revoked_credentials` — The presented key was revoked. Create a new key in Settings → API.
- `403`: `feature_unavailable` — The tenant's tier does not currently include API access. Feature rollout flags cannot grant this entitlement. `permission_denied` — The key's permission does not allow this operation (readonly keys cannot call admin-only operations).
- `404`: `not_found` — No such resource in YOUR tenant. Ids belonging to another tenant are indistinguishable from missing ones.
- `429`: `rate_limit_exceeded` — Too many requests. Honor the Retry-After header (seconds) before retrying — waiting that long is enough. The RateLimit-* fields on every response say how much headroom is left before this happens; pace against them instead of retrying into a refusal.
- `500`: `internal_error` — Unexpected server error. Safe to retry with the same Idempotency-Key.

---

[API](https://skmtc.dev/getfinero/apis/finero-public-api.md) · [All operations](https://skmtc.dev/getfinero/apis/finero-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getfinero/apis/finero-public-api/revisions/3d456e222775?raw)
