lists scope. Smart columns bill per row, so read Bounding the spend before running one over a large list.
Two engines
The engine decides how the answer is found, and how much it costs.standard
Answers each row with a fast research agent that searches the web, reads pages and looks up LinkedIn profiles. Fast and cheap.
deep_research
Researches each row against live sources before answering. Slower, costs more, and can be restricted to chosen providers.
Create one
POST /business/lists/{listId}/smart-columns needs a name, a prompt and a runOn. It answers 202 — the column exists immediately, the answers arrive over the following minutes.
jobId. It is how you follow the run.
Writing a prompt that answers well
The prompt is free text, and the shape of the answer follows the shape of the question. Ask for what you want back:- Say what a good answer looks like. “Answer yes or no and name the role” produces a column you can filter on. “Tell me about their hiring” produces a paragraph.
- Name the subject. The row is a contact or a company; say which one you mean.
- Keep it to one question. Two questions in one prompt gives you two half-answers in one cell.
- Plan for filtering. Row filters match text anywhere in a cell and ignore case. If you will filter on the answer, ask for exactly one word, such as yes or no, so a “no” answer can never contain “yes”. The qualify leads workflow shows the pattern end to end.
Choosing what it runs on
runOn decides the initial scope, and it is the main lever on cost:
Start with
first_100, read the answers and fix the prompt. Then re-run with new_only to answer the rest of the list without paying for the sample rows twice.
Add filters, in the same row filter language as GET /business/lists/{listId}/rows, to cover only matching rows. A filter that matches nothing is refused with 422 NO_ROWS_TO_RESEARCH before anything is charged.
Follow the run
GET /business/lists/{listId}/smart-columns/{jobId}/status reports progress and, importantly, what has been spent so far.
failedRows counts them. The run still finishes, as partially_completed, and those cells stay empty. Poll until status is completed, partially_completed, failed or cancelled; a run is cancelled when a newer run or a prompt edit replaces it.
Read the answers
The values land on the list rows themselves.GET /business/lists/{listId}/rows returns them alongside every other column, so filtering, sorting and exporting all work on smart column output.
For any smart column you can also ask how an individual answer was reached:
Change the question
PATCH /business/lists/{listId}/smart-columns/{columnId} updates the name, prompt or provider restriction. The engine is fixed when the column is created, so sending engine is a 422.
Re-run it
POST /business/lists/{listId}/smart-columns/{columnId}/rerun fills answers in again. mode decides which rows:
mode defaults to all, the more expensive choice. Either mode cancels a run that is still in progress. The balance must cover every row the run will answer before it starts, and each row is then charged as it is answered. GET /business/lists/{listId}/smart-columns/{columnId} shows creditsPerRow, so you can price a run before you start it.
Bounding the spend
Smart columns bill per row answered: 20 credits a row withstandard and 100 with deep_research. Rows that fail are free. Three habits keep it predictable:
1
Prototype on first_100
Read the answers before spending on the whole list.
2
Top up with new_only
After an import, re-run only the new rows instead of the whole column.
3
Watch creditsUsed on the job
The status endpoint reports spend while the run is still going, so a runaway prompt is visible before it finishes.
GET /business/credits shows the balance the run draws from. See Credits.