---
title: "List enrichment actions"
method: GET
path: "/table-enrichments/actions/"
tags: ["table-enrichments"]
---

# List enrichment actions

`GET /table-enrichments/actions/`

## Request

- Base URL: `https://api.getoneprofile.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getoneprofile.ai/table-enrichments/actions/`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

The server-owned catalog of enrichment actions the picker renders. Sorted by category then display name; development-only actions are absent in production.

## Response `200`

Successful Response

- EnrichmentActionCatalogResponseSchema: The enrichment actions available in this environment, in display order.
  - `actions` EnrichmentActionSchema[], required
    - `category` 'ai' | 'web' | 'workspace' | 'enrichment' | 'development', required: The section an enrichment action sits under in the picker. Ordered as the picker shows them. ``DEVELOPMENT`` exists so the dev-only test actions render under their own clearly-labelled heading and can never be mistaken for a product feature.
    - `column_name` string, nullable: The noun a new column made from this action takes as its header. Separate from `display_name`, which sells the action in the picker and reads as a job ('Find a person's LinkedIn profile'), while a header names what the cells hold ('LinkedIn profile'). Null means the action never needed the distinction: a single-output action IS its output, so the frontend takes that output's name.
    - `credentials` 'platform' | 'customer', required: Whose account an enrichment action's calls are billed to. Lives here because it crosses the package boundary: the API layer renders it on every action, and `api` may read a domain's types but never its internals.
    - `credits_per_row` number, nullable: The action's own per-successful-row price in decimal credits, when it prices per action rather than per model: the price itself, or, when usual_credits_per_row is set, the most one row can cost. Surfaces as the cost label on catalog rows and in the editor; null means the price derives from the selected model.
    - `degraded` boolean: True when a waterfall currently has ZERO live suppliers: every rung's vendor is unprovisioned, out of quota, or holding a dead key. The picker greys the row with a reason so nobody buys into a tool that cannot answer any row right now. Always false for non-waterfall actions.
    - `description` string, required: One line: what the action does.
    - `display_name` string, required
    - `family` 'email' | 'phone' | 'company' | 'person' | 'social' | 'marketing': The OUTCOME shelf one data enrichment sits on inside the Enrichment tab. A second axis under :class:`EnrichmentActionCategory`, not a replacement for it: the category answers "what kind of bargain is this" (a vendor waterfall, a prompt, a free function) and picks the TAB; the family answers "what do I get out of it" and picks the SHELF within that tab. It exists because the catalog is authored by INPUT (five ways to enrich a person differing only in the key you hand them, three ways to enrich a company, two ways to find a LinkedIn URL) while people browse it by OUTCOME. A flat list of sixteen makes the reader derive the grouping themselves from sixteen verb phrases, every time they open the tab. Ordered as the shelves render. Authored per waterfall in ``enrichment_catalog.yaml`` beside ``icon`` and ``tagline``, so a new waterfall declares its shelf in the same edit that creates it rather than landing in whichever bucket a frontend map happens to guess.
    - `icon` string, required: An icon token the frontend maps to an asset.
    - `input_contract` string, required: The settings kind this action accepts: what an action_settings payload must declare to configure it. Also how the editor knows the shape of the configuration: 'enrichment' binds every declared input to a column, 'column' binds exactly one and has no prompt at all, and everything else is prompt-driven.
    - `inputs` EnrichmentCanonicalFieldSchema[]: The facts this action needs supplied, each bound to a column. Empty for the prompt-driven actions. Several sources are checked behind one data enrichment and they need different facts, so binding a subset is normal there: it narrows which can run, it does not break the column. A 'column'-contract action declares exactly one, and it is the whole configuration.
      - `always_present` boolean: Outputs only: whether a successful row always carries this fact. False marks a fact that can come back empty even when the enrichment worked, so the editor can say so while the column is being set up rather than leaving it to be discovered.
      - `auto_promote` boolean: Outputs only: whether the fan-out gives this fact a column of its own. False keeps it payload-only (stored with the answer and promotable by hand) for provenance-grade facts that would otherwise widen every table they land on.
      - `choices` string[], nullable: Select outputs only: the fixed vocabulary the answer comes from, so a column created from this fact is born with its options set.
      - `creates_column` boolean: Outputs only: whether setting this action up actually adds a column for this fact. Derived: it is auto_promote AND a type the fan-out can expand (a list or nested object has no single cell shape and stays in the payload). Sent already resolved so the column editor's outputs preview can promise exactly the columns that will appear, rather than restating two rules and drifting.
      - `description` string, required
      - `display_name` string, required
      - `field_type` 'text' | 'paragraph' | 'url' | 'email' | 'image_url' | 'person' | 'select' | 'number' | 'decimal' | 'currency' | 'checkbox' | 'date' | 'multi_select' | 'list' | 'object', required: The type a user picks for a table column. Ordered as the picker shows them, which is also the order the groups below run in: text-ish, then numeric, then choice, then structured.
      - `name` string, required: The key a column's bindings and output fields use.
      - `required` boolean: Inputs only: whether the enrichment cannot run without it. False where several facts can each drive it.
    - `key` string, required: The registry key stored on enrichment column definitions.
    - `keywords` string[]: Extra words the Tools search finds this action by, beyond its name and description: how a person describes the job ('follow up', 'pain point'). Authored per built-in agent in the catalog file; empty for everything else.
    - `offers_second_check` boolean: Whether a column of this enrichment may turn on a second check (settings.second_check): Verify email sends a catch-all answer on to the next verifier. A column with it on can cost one more check per row, charged only when the second check gives a definite answer.
    - `output_contract` string, required: What the action produces: 'text' (one free-form value), 'structured' (obeys the column's declared output schema) or 'object' (a fixed object whose fields are this action's declared `outputs`, so nothing for a column to declare and no output builder). Consumers branch on THIS, never on the key.
    - `outputs` EnrichmentCanonicalFieldSchema[]: The facts this action can return. A data enrichment's output builder seeds from these; for an 'object'-contract action they ARE the output, fixed, and there is nothing to build.
      - `always_present` boolean: Outputs only: whether a successful row always carries this fact. False marks a fact that can come back empty even when the enrichment worked, so the editor can say so while the column is being set up rather than leaving it to be discovered.
      - `auto_promote` boolean: Outputs only: whether the fan-out gives this fact a column of its own. False keeps it payload-only (stored with the answer and promotable by hand) for provenance-grade facts that would otherwise widen every table they land on.
      - `choices` string[], nullable: Select outputs only: the fixed vocabulary the answer comes from, so a column created from this fact is born with its options set.
      - `creates_column` boolean: Outputs only: whether setting this action up actually adds a column for this fact. Derived: it is auto_promote AND a type the fan-out can expand (a list or nested object has no single cell shape and stays in the payload). Sent already resolved so the column editor's outputs preview can promise exactly the columns that will appear, rather than restating two rules and drifting.
      - `description` string, required
      - `display_name` string, required
      - `field_type` 'text' | 'paragraph' | 'url' | 'email' | 'image_url' | 'person' | 'select' | 'number' | 'decimal' | 'currency' | 'checkbox' | 'date' | 'multi_select' | 'list' | 'object', required: The type a user picks for a table column. Ordered as the picker shows them, which is also the order the groups below run in: text-ish, then numeric, then choice, then structured.
      - `name` string, required: The key a column's bindings and output fields use.
      - `required` boolean: Inputs only: whether the enrichment cannot run without it. False where several facts can each drive it.
    - `pricing_key` string, nullable, required: The credit price-catalog key this action charges against; null is free.
    - `provider_operation` EnrichmentProviderOperationSchema: The provider-side identity of an integration-backed enrichment action.
      - `inputs` EnrichmentProviderFieldSchema[], required
        - `description` string, required
        - `display_name` string, required
        - `example` union: A sample value shown before anything has run.
          - string
          - integer
          - number
          - boolean
        - `name` string, required: The stable field name used in bindings and payloads.
        - `required` boolean, required: Inputs only: the operation cannot run without this field.
        - `value_kind` string, required: JSON-schema primitive kind ('string', 'integer', 'number', 'boolean', 'array', 'object'). A rendering hint.
      - `integration_type` string, required: The integration slug, also the connect-flow integration type.
      - `operation_key` string, required: The operation's stable key within the SDK.
      - `outputs` EnrichmentProviderFieldSchema[], required
        - `description` string, required
        - `display_name` string, required
        - `example` union: A sample value shown before anything has run.
          - string
          - integer
          - number
          - boolean
        - `name` string, required: The stable field name used in bindings and payloads.
        - `required` boolean, required: Inputs only: the operation cannot run without this field.
        - `value_kind` string, required: JSON-schema primitive kind ('string', 'integer', 'number', 'boolean', 'array', 'object'). A rendering hint.
      - `required_input_combinations` array[]: Alternative input sets that each make the operation runnable: a configuration saves when ANY one set is fully bound. The editor renders this as 'needs A + B, or C'.
        - string[]
    - `refund_rules` EnrichmentRefundRule[]: The action's declared refund promises: 'success_no_data' (an empty-handed success is free), 'success_blocked_data' (compliance-withheld data is free), 'success_preview_run' (previews are charged then refunded). The editor prints these so the promise is visible before running.
    - `settings_fields` EnrichmentActionSettingFieldSchema[]: The action's own configuration, field by field. One generic editor renders these, so an action with settings never waits for a frontend of its own.
      - `default` union
        - string
        - integer
        - number
        - boolean
      - `description` string, required
      - `display_name` string, required
      - `kind` string, required: How to draw the control: 'text', 'textarea', 'number', 'boolean', 'select', 'key_value' (string map) or 'column' (a picker over this table's columns).
      - `name` string, required: The payload key this field writes.
      - `options` string[]: Allowed values for a 'select' field.
      - `required` boolean
      - `secret` boolean: Render masked.
    - `shelf` 'research' | 'write': The Enrichment tab shelf a built-in agent is ALSO listed on. A built-in agent lives on the Agent tab, where it sits beside the agents a customer wrote. The ones that answer an outcome someone shops the Enrichment tab for (research a company, write the email) are listed there too, on a shelf of their own after the data shelves, because that is where people look for them. Authored per agent in ``agents_catalog.yaml`` so the shelf is decided where the agent is defined, the way a waterfall's family is, rather than guessed from a label in the frontend.
    - `tagline` string, required: A few words for the picker's meta line; empty falls back to the category word.
    - `usual_credits_per_row` number, nullable: Set for an enrichment whose sources are priced differently: a row is charged the price of the source that answered it, never more than credits_per_row, and this is what an answered row usually costs, read from the platform's recent rows (Up to credits_per_row, usually about this). Null when the action has one price.

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `422`: Invalid request made to the API.
- `500`: Internal server error.
- `502`: Bad gateway error.
- `503`: Service unavailable.

---

[API](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile.md) · [All operations](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/llms.txt) · [OpenAPI document](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/revisions/4a6bd71e3f02?raw)
