Enrich

create enrichment

Changed on

Create an enrichment without running it: the task prompt the row agent reads for every row, the output columns it fills, and optionally input_columns (the headers rows must carry; empty = any), a budget in credits per row (default 1.5 per output column; it then moves by 1.5 as columns are added or removed until budget_locked is true), and the tools (only_tools replaces the default set, additional_tools adds to it; names from GET /tools). Each output entry is a column name or { "name", "prompt"?, "output_schema"?, "tool"? }; output_schema is a JSON Schema for the cell value (see help → output_schema); without one, the column is typed from the prompts as the one value it is about (email, URL, date, year, count, money, percentage, phone, address, a person's or company's name, ...; only prose stays free text); tool pins a tool to the column — "tool": "linkedin_person_profile", the ColumnToolPin: the agent makes one call of it per row, with arguments it works out from the row and its research, and the call's result is the cell. Output names may not repeat an input column.

From a prompt alone. Leave output out and the recipe is written from the prompt: one output column per fact it asks to find about each row, each with its own prompt and type, plus the name and input_columns when you give none ("Research each company: its CEO, employee count, latest funding round date and amount, and whether it is hiring" → CEO, Employee count, Latest funding round date, Latest funding round amount, Hiring, typed). The response shows what was written; adjust it with PATCH /enrichments/{id}. A prompt that names no facts to find is refused (422): add output.

The enrichment comes with the dataset it fills: an empty dataset bound to it, named after it, whose input columns are input_columns (one Input column when you give none; the first build names it, or rename it with PATCH /datasets/{id}). It is on the Datasets page of the app at once. The response is the enrichment plus dataset_id (its id) and app_url (the dataset in the app).

Then add rows to the dataset — POST /datasets/{id}/rows, rows/import for a CSV, or rows/build to generate them — and fill it with POST /enrich (dataset_id): the rows and cells are kept and the dataset shows them. Or run the enrichment once on rows you send inline (enrichment_id + input), nothing kept. Editing the enrichment through its dataset (the app's Column tab, PATCH /datasets/{id}) rebinds the dataset to a private copy; PATCH /enrichments/{id} edits this enrichment itself.

{ "dataset_id": "ds_..." } alone answers the dataset's own enrichment as { id, name, app_url, dataset_id } (nothing is created; 422 while the dataset has no output columns — PATCH /datasets/{id} adds them).

post/enrichments

Request

Request body

dataset_idstring

Alone: a dataset's id (ds_...); answers its own enrichment. Not with the fields below.

namestring

Recipe: display name

promptstring

Recipe: the task prompt the row agent reads for every row. Required without dataset_id.

input_columnsstring[]

Recipe: the headers rows must carry, the dataset's input columns. Omit for any (one Input column), or, without output, for the ones the prompt implies.

budgetnumber

Recipe: credits the row agent may spend per row. Default 1.5 per output column.

budget_lockedboolean

Recipe: true keeps the budget as set when output columns are later added or removed; false lets it move by 1.5 per column.

only_toolsstring[]

Recipe: exactly these tools (GET /tools). Replaces the default set.

additional_toolsstring[]

Recipe: the default tools plus these (GET /tools; some need enabling on the account or a linked key).

Example request

{
  "output": [
    {
      "tool": "linkedin_person_profile"
    }
  ]
}

Response

Save a recipe — the saved enrichment plus dataset_id and app_url, the dataset it fills. With dataset_id alone — the dataset's own enrichment as { id, name, app_url, dataset_id }

OR

Example response

{
  "id": "enr_018f5b60-1234-7abc-89ab-0123456789ab",
  "name": "Company basics",
  "prompt": "Research each company from its name and website.",
  "input_columns": [
    "Company",
    "Website"
  ],
  "output": [
    {
      "name": "CEO"
    },
    {
      "name": "Employee count",
      "prompt": "Current headcount as an integer",
      "output_schema": {
        "type": "integer",
        "minimum": 0
      }
    },
    {
      "name": "Homepage text",
      "prompt": "The company's homepage, from the Website column",
      "tool": "scrape"
    }
  ],
  "tools": [
    "web_search",
    "scrape",
    "pdf",
    "http_request",
    "code"
  ],
  "budget_credits_per_row": 4.5,
  "budget_locked": false,
  "version": 1,
  "created_at": "2026-10-01T12:00:00Z",
  "updated_at": "2026-10-01T12:00:00Z"
}

Changes

    • warning

      removed the optional property ///// from the response with the status

    • warning

      removed the optional property / from the response with the status

    • info

      added the optional property /////// to the response with the status

    • info

      added the optional property /////// to the response with the status

    • info

      added the optional property /////// to the response with the status

    • info

      added the optional property /////// to the response with the status

    • info

      added the optional property /////// to the response with the status

    • info

      added the optional property /////// to the response with the status

    • info

      added the optional property /////// to the response with the status

    • info

      added the optional property /////// to the response with the status