Skip to main content
A list is a grid of people: rows are prospects, columns are facts about them. Every Leads endpoint either puts rows in, defines what to find out about them, or reads them back.

Getting rows in

Pick whichever matches where your people come from.
You describe who you want in a sentence. Origami creates the list, picks columns from your description, sources matching people, and researches them.
Returns a Job. When it succeeds, result carries the new list_id, a search_id, and the row_ids it added. This is the path the quickstart walks through.There is no filter DSL — the brief is the query. Be specific about title, company size, geography, and industry, and mention anything you want as a column (“and whether they use HubSpot”).

Asking for more of the same

A list keeps the search behind it, including how much of the matching pool is left. To go deeper, continue the search instead of writing the brief again:
Same criteria, same list, same columns, no repeats. Check GET /leads/searches/{search_id} first if you want to know how deep the pool goes — remaining_count and has_more tell you before you spend anything.
Start at count: 10, look at the rows, adjust the brief, then ask for hundreds. A search you refine early is much cheaper than one you re-run.

fast vs accurate

quality decides how hard Origami works to verify each lead. On an accurate run the Job reports credits.settled: false until the final number is known. Reconcile billing after it flips to true.

Columns do the research

Columns are the questions you’re asking about every row. Three kinds: Copying is how you standardize. Build the research columns you like on one list, then copy them onto every new one:
If the column you copy depends on other columns, bring those too — otherwise you get 409 MISSING_DEPENDENCY_COLUMNS. Score columns carry a relevance_weight from very_low to required. Set it with PATCH …/columns/{column_id}; required makes a failing row score zero.

Filling cells in

Enrichment always returns a Job.
Restrict it to certain rows with row_ids, or pass reenrich: true to redo cells that already have values. Need something that isn’t a column yet? Describe it and let Origami add the column and fill it in one call:

Reading rows back

Reads are free — they don’t spend credits. The filters that matter: Rows that are deduplicated, excluded, or disapproved stay in the list but are hidden from normal reads — that’s why a total in the app can be larger than what you page through. For the funnel behind those numbers — how many were sourced, how many survived qualification, what it cost — use GET /leads/lists/{list_id}/stats.

Keeping people out

Exclusion lists are checked when leads are sourced and again when people are enrolled in a campaign. Add your customers, your competitors, and anyone who opted out:
They live under Account because they’re organization-wide — see account setup. For a one-off “not these people again,” pass exclude_list_ids on the search instead.

What’s next

Run a campaign

Turn the list into outreach.

The Job object

What to do while sourcing and enrichment run.