Filter, trim and reshape a request,
without writing code.
A pipeline is a short list of steps: drop a request unless it matches, remove or add fields, rebuild the body from a template, set headers. Build one in the console or over the API, test it, keep its versions, run it through the API, or refer to it by id from the product that sends.
Build it, test it, then run it wherever it is needed.
A pipeline is a JSON document, checked whole when it is saved. No step runs code of yours, so none can loop, wait or call out.
Build a pipeline
Add steps in the console’s form, paste them as JSON, or start from a template: Slack, Discord and Teams messages, Keep only these fields, Drop personal data. A document that could never run is refused when it is saved, with its step, its path and the reason.
Test it
Run what is in the editor on a request you paste, and see the body and headers it would send, the step that dropped it, or why it failed. A test saves nothing and counts nothing.
Keep its versions
Saving new content adds a version, and a version never changes. The same content again adds none, and restoring an old version is saving its content again.
Run it
Call the API with a request and read what the pipeline did, or refer to the pipeline by id from Webhooks, which runs it in its own process before each delivery.
Transforms sends nothing itself and keeps nothing of what it runs on. It is not a relay: Webhooks delivers events and Request Bins forwards requests, and Transforms runs the pipeline and answers what it did.
Six steps, run in the order you write them.
They cover the jobs most transformations exist for. A pipeline has no loops, no clock and no network, so the same pipeline on the same request always does the same thing.
Filter
Keep a request only if it matches, or drop it if it does. Test fields, nested objects and arrays, with operators such as $gte, $in and $contains, and combine them with $and, $or and $not.
Remove fields
Take fields out of the body by path. * matches one level and ** any depth, so **.email removes every email field, wherever it is.
Set fields
Add or overwrite fields with values from a small template language: {{ data.id }} inserts a value as text, and {"$ref": "data.amount"} inserts it with its type.
Reshape the body
Replace the body with one you write, with filters such as money(), date(), truncate() and join(). It is how a template makes a Slack, Discord or Teams message.
Headers
Set, remove and rename headers, with templated values. A credential doesn’t go here, where a read of the pipeline would show it: that is the next step.
Credential
Say that a bearer token, basic auth or an API key goes on the request, and name the slot it comes from. Credential steps run last, so no other step can read one.
Templates
Slack, Discord and Teams messages that the event’s text can’t format or end early, Keep only these fields, and Drop personal data. Saving one makes a copy that is your own.
Fixed caps
20 steps, a 256 KiB body and 100,000 values read or copied in a run, on every plan. Past a cap a run fails with a clear reason. It never hangs.
Send it a request. Read what the pipeline did.
This pipeline keeps paid invoices of $1,000 or more, removes the customer’s email and any phone number, and adds two fields and a header. The run answers with the result, and keeps none of it.
The pipeline
{
"version": 1,
"steps": [
{ "filter": { "type": "invoice.paid", "data": { "amount": { "$gte": 100000 } } } },
{ "drop": ["data.customer.email", "**.phone"] },
{ "set": {
"event_type": "{{ type }}",
"amount_display": "{{ data.amount | money(data.currency) }}"
} },
{ "headers": { "set": { "X-Event-Type": "{{ type }}" } } }
]
}The run
# Run the saved pipeline on one request
curl -X POST "https://transforms.nimbusnexus.net/v1/pipelines/$PIPELINE_ID/run" \
-H "Authorization: Bearer $TRANSFORMS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"body":{"type":"invoice.paid","data":{"id":"in_42","amount":150000,"currency":"usd","customer":{"name":"Ana Silva","email":"[email protected]","phone":"+1 202 555 0142"}}}}'The answer
{
"status": "ok",
"version": 3,
"body": {
"type": "invoice.paid",
"data": {
"id": "in_42",
"amount": 150000,
"currency": "usd",
"customer": { "name": "Ana Silva" }
},
"event_type": "invoice.paid",
"amount_display": "1,500.00 USD"
},
"body_changed": true,
"headers": { "X-Event-Type": "invoice.paid" },
"query": {},
"step": null,
"note": null,
"reason": null,
"error": null,
"duration_ms": 0.4
}Transforms holds no credentials. The product that sends does.
A pipeline can say that a credential goes on a request, and a read of the pipeline shows no value, because it has none. To send one, run the pipeline by reference from the product that sends.
A slot, not a value
A credential step says what kind of credential goes where, and names a slot. The document holds that name and nothing else, so reading a pipeline back never shows a credential.
Filled where it is sent
A product that runs the pipeline by reference maps the slot to a secret in its own store, under its own key, and sends it to its own URLs. Outside that product the slot means nothing.
Shown masked here
Test and the run API show what the step would add, as Authorization: Bearer ••••. Neither can send a credential, because Transforms has none to send.
Where it runs shows first
A read of a pipeline lists the products that run it by reference and the version each runs. A new version with a credential step, or deleting the pipeline, has to name each of them first.
The jobs it is for, none of which needs a script.
A partner’s API wants a bearer token or an API key. A credential step says so, and the product that sends fills it from its own secrets.
A CRM wants three fields, named its way. A reshape step builds exactly that body from the event, keeping each value’s type.
A subscription matches on the event’s type. A filter reads the payload too, so “paid invoices of $1,000 or more” is one step.
Each template is a reshape step and a header. It works on any event, and nothing in the event can format the message, mention anyone or end a code block early.
Remove personal data before an analytics vendor sees it, at any depth, and add the event type to a header while you are there.
Refer to the pipeline by id from Webhooks. Endpoints run its current version in Webhooks’ own process, and each new version reaches them without a change to any endpoint.
Pipelines on every plan, Free included.
Every plan has all six steps, the templates, Test, the run API and running by reference. A paid plan holds more pipelines and credential slots, keeps more versions and runs more a minute.
Free
Enough to build, test and run your first pipelines.
$0
- 5 pipelines
- 5 credential slots
- 10 versions kept per pipeline
- 60 runs a minute
Starter
For a product that runs pipelines in production.
$9/ month
$86.40 / year — save 20%
- 25 pipelines
- 25 credential slots
- 25 versions kept per pipeline
- 600 runs a minute
Pro
More pipelines, more versions, room for a whole team.
$29/ month
$278.40 / year — save 20%
- 100 pipelines
- 100 credential slots
- 50 versions kept per pipeline
- 3,000 runs a minute
Custom
Volume commitments, bespoke limits, and terms to match.
Contract priced
- 1,000 pipelines
- 1,000 credential slots
- 100 versions kept per pipeline
- 12,000 runs a minute
- Requires a team account
Runs are counted, not billed, and the console and GET /v1/usage show the month’s. A run past the plan’s rate answers 429 with how long to wait, and Test shares that rate. A run at a product that refers to the pipeline counts in that product’s usage. A version a product pins is kept beyond the plan’s number, and so are the five older versions a product was seen running most recently in the last 30 days.
- All six steps
- Slack, Discord and Teams templates
- Keep only these fields, Drop personal data
- Test before you save
- Versions that never change
- The run API
- Running by reference from Webhooks
- Isolated per workspace
Before you build your first pipeline.
Related
Where to go next
Build a pipeline, and see what it does to a request.
Free includes 5 pipelines and 60 runs a minute, with every step and every template. Try one in the playground first, with no account.