Skip to content
NimbusNexus
Transforms · Declarative request pipelines

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.

How it works

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

What a pipeline can do

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.

In one request

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
}
Credentials

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.

What people use it for

The jobs it is for, none of which needs a script.

CREDENTIALS
Add what a destination asks for

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.

{"auth": {"type": "bearer", "secret": "sec_…"}}
RESHAPING
Send the shape an API expects

A CRM wants three fields, named its way. A reshape step builds exactly that body from the event, keeping each value’s type.

{"map": {"invoice_id": "{{ data.id }}", "total": {"$ref": "data.amount"}}}
FILTERS
Drop what nobody needs

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.

{"filter": {"data": {"amount": {"$gte": 100000}}}}
CHAT
Post to Slack, Discord or Teams

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.

Slack message · Discord message · Microsoft Teams card
PERSONAL DATA
Trim a request before it leaves

Remove personal data before an analytics vendor sees it, at any depth, and add the event type to a header while you are there.

{"drop": ["data.customer.email", "**.phone"]}
ONE DEFINITION
Keep one pipeline, not one per endpoint

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.

pipe_8e27d40b · version 3 · destinations: webhookd
Plans

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
Get started

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
Choose Starter

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
Choose Pro

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
Talk to us

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.

On every plan, Free included
  • 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
Questions

Before you build your first pipeline.

No. It runs the pipeline and answers what it did. To have the result sent, call the API and send it yourself, or refer to the pipeline by id from Webhooks, which runs it before each delivery. Transforms isn’t a relay, and it has no URL to send to.
Get started

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.