Concepts
Every pipe adds fields to your input records. Two properties tell you how a pipe behaves before you run it: its type (how many providers it tries) and its field mode (the shape of its config). This page covers both.
Pipe types
Single-provider pipes
A single-provider pipe runs on one third-party service (for example LeadMagic or ZeroBounce) or on pipe0 itself (native pipes).
Waterfall pipes
A waterfall pipe tries providers in order. The first one that returns data wins; the rest are skipped.
Only the provider that returns a result is billed. A no_result costs nothing.
Waterfalls raise coverage at the cost of latency: each provider attempted adds a round-trip.
Choosing waterfall providers
Set config.providers to an array of { "provider": <PROVIDER_NAME> }. Providers run in array order, index 0 first. Remove an entry to skip it, reorder to change priority. Omit config.providers to use the default order.
{
"pipe_id": "person:workemail:waterfall@1",
"config": {
"providers": [
{ "provider": "prospeo" },
{ "provider": "leadmagic" }
]
}
}The default provider order and the credit price per provider are listed on each pipe's page in the pipe catalog.
Field mode
field_mode determines the shape of a pipe's config object.
Field mode: static
The pipe's inputs and outputs are fixed. You can remap inputs and rename outputs, but the schema is known up front.
Example: person:workemail:waterfall@1 reads name + company_domain and writes work_email.
Rename outputs
Set config.output_fields.<FIELD>.alias:
fetch('https://api.pipe0.com/v1/pipes/run', {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
pipes: [
{
pipe_id: 'person:name:split@1',
config: {
output_fields: {
first_name: { alias: 'special_first_name' }
}
}
}
],
input: [{ id: '1', name: 'Jane Doe' }]
})
})Disable outputs
Set config.output_fields.<FIELD>.enabled: false:
fetch('https://api.pipe0.com/v1/pipes/run', {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
pipes: [
{
pipe_id: 'person:name:split@1',
config: {
output_fields: {
first_name: { enabled: false }
}
}
}
],
input: [{ id: '1', name: 'Jane Doe' }]
})
})Field mode: config
You declare inputs and outputs as part of the pipe's config. The pipe doesn't know them ahead of time.
The most common config-mode pattern is a template: a text field where you reference inputs and declare outputs inline. LLM pipes like prompt:run@1 work this way. Templates have their own page.