---
title: "Retrieve the automation catalog"
method: GET
path: "/companies/{company}/automations/catalog"
tags: ["Automations"]
---

# Retrieve the automation catalog

`GET /companies/{company}/automations/catalog`

## Request

- Base URL: `https://api.factuarea.com/v1`
- URL: `https://api.factuarea.com/v1/companies/{company}/automations/catalog`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Return what you need to build a valid automation rule: visible triggers, condition operators and combinators, and actions with their parameter JSON schema.
- Visibility follows the company’s plan and modules; labels follow `Accept-Language` (default Spanish).
- Trigger fields are served per trigger by `GET /v1/companies/{company}/automations/catalog/triggers/{trigger}/fields`.

## Path parameters

- `company` string, uuid, required

## Headers

- `Factuarea-Version` string, date

## Response `200`

- object
  - `data` AutomationCatalog, required: Everything you need to build a valid automation rule without guessing: the triggers your company can listen to, the operators and combinators its conditions accept, and the actions it can run with their parameter schemas. Deterministic: two consecutive calls with no configuration change return exactly the same body, so it is safe to cache and diff. It deliberately does NOT include the evaluable fields of every trigger (that would be hundreds of kilobytes) — ask `GET /v1/companies/{company}/automations/catalog/triggers/{trigger}/fields` for the one you picked.
    - `object` 'automation_catalog', required: Always `automation_catalog`.
    - `triggers` object[], required: Events your company can subscribe an automation to, already filtered by the modules your plan includes: a trigger governed by a module you have not contracted is not offered at all. Returned in catalogue order.
      - `key` string, required: Name of the event, in `resource.action` form. This is the value you send as `trigger_type` when creating a rule.
      - `label` string, required: Human-readable name of the trigger, already translated to the language negotiated for the request via `Accept-Language`.
      - `category` string, required: Prefix of the event name (the part before the first dot). It is part of the name itself, so it is not translated — use it to group triggers in a picker.
      - `module` string, nullable, required: Key of the module that governs the visibility of this trigger, or `null` when the trigger is transversal. Informational: a trigger you cannot use never reaches this list.
    - `operators` object[], required: The closed set of comparison operators a condition can use, with the field types each one applies to.
      - `key` 'eq' | 'neq' | 'in' | 'not_in' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'is_null', required: Raw value of the operator, as sent inside a condition tree.
      - `label` string, required: Human-readable name of the operator, already translated.
      - `applies_to` string[], required: Field types this operator accepts. It is the same operator-by-type matrix the write validation applies, so an operator you pick from here for a matching field type will never be rejected with a 422.
      - `value_shape` 'scalar' | 'list' | 'none', required: Shape the comparison value must have: `scalar` for a single value, `list` for a non-empty array of values (`in`, `not_in`), `none` for an operator that takes no value at all (`is_null`).
    - `combinators` object[], required: The closed set of logical combinators a condition tree can nest.
      - `key` 'and' | 'or', required: Raw value of the combinator, as sent inside a condition tree.
      - `label` string, required: Human-readable name of the combinator, already translated.
    - `actions` object[], required: Actions an automation can run, derived from the adapters actually WIRED in this deployment — never from the declared type catalogue. A type without a registered adapter is not announced, because picking it would produce a rule whose step is skipped at run time.
      - `key` 'notify_in_app' | 'notify_channel' | 'emit_webhook' | 'create_calendar_event' | 'send_document_email' | 'send_payment_reminder' | 'change_status' | 'tag_entity' | 'create_task' | 'change_task_status' | 'assign_task' | 'add_task_comment', required: Raw value of the action type, as sent in the `actions` of a rule.
      - `label` string, required: Human-readable name of the action, already translated.
      - `parameters` object[], required: Parameter schema declared by the adapter, in the order it declared it. Serialised deterministically: the same configuration always yields the same array.
        - `name` string, required: Key of the parameter inside the `parameters` object of the action.
        - `type` string, required: Type token of the parameter.
        - `required` boolean, required: Whether the action refuses to be created without this parameter.
        - `allowed_values` string[], required: Closed set of accepted values, or an empty array when the parameter is free-form.
        - `label` string, required: Human-readable name of the parameter, already translated.
        - `description` string, required: What the parameter is for, already translated.
      - `supports_portfolio_scope` boolean, required: Whether this action can be used in a rule whose `scope` is `cartera`. Actions that notify you —or that touch no record at all— can; actions whose subject would be a record of another tax ID cannot, because a portfolio rule never operates on behalf of another tax ID. Creating a portfolio rule with an action marked `false` is rejected with `automation_portfolio_scope_forbids_action`.
      - `module` string, nullable, required: Key of the module that governs this action, or `null` when the action is transversal. Informational: an action of a module you have not contracted never reaches this list.
    - `scopes` object[], required: The scopes a rule can be created with, and whether THIS company can use each one. A scope your company cannot use is returned marked as unavailable with its reason instead of being omitted, so you can tell "not contracted" from "does not exist".
      - `key` 'empresa' | 'cartera', required: Raw value of the scope, as sent in the `scope` of a rule.
      - `label` string, required: Human-readable name of the scope, already translated to the language negotiated for the request.
      - `available` boolean, required: Whether the company behind the credential can create rules with this scope. `empresa` is always available; `cartera` requires the titular company of an account with the gestoría module.
      - `unavailable_reason` 'module_not_granted' | 'company_is_managed_child' | 'null', nullable, required: Why the scope is not available, or `null` when it is. `module_not_granted` means the company does not have the gestoría module (upgrading the plan grants it); `company_is_managed_child` means the company is not the titular company of its account: the portfolio belongs to the account and its titular represents it, so no plan unlocks it for an additional tax ID.

## Other responses

- `400`: `parameter_unknown` with `subcode` `retired_active_profile_header`: the retired `X-Active-Profile` header was sent; the company goes in the path. `parameter_invalid_format` on `Factuarea-Version`: the header is not a `YYYY-MM-DD` date. `unsupported_api_version`: the `Factuarea-Version` date is not a supported version.
- `401`: Missing or invalid API key.
- `403`: The request is authenticated but not allowed: the API key lacks the required scope (`insufficient_scope`), the plan does not include the public API or this feature (`addon_not_active`, `feature_not_available_in_plan`), or the module is not available with a test key (`module_not_available_in_sandbox`). `company_inactive`: the company in the path is deactivated; reactivate it to operate.
- `404`: The requested resource does not exist or belongs to another company. `profile_not_found`: the company in the path does not exist, is not in the API key scope or belongs to the other environment (live or test).
- `429`: Rate limit exceeded. Retry after the duration in `Retry-After`.
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/factuarea/apis/factuarea-public-api.md) · [All operations](https://skmtc.dev/factuarea/apis/factuarea-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/factuarea/apis/factuarea-public-api/revisions/718e77934422?raw)
