Input Node
The entry point for data. Receives the job document from the Outbound Feed sync engine. Every pipeline starts with exactly one Input node — it has no configuration.The job document
Every job enters the pipeline as a snake_case JSON document. The editor’s sample job button loads a real job from your feed in exactly this shape:null or absent — design your nodes to tolerate sparse documents.
Filter
Decides whether a job continues through the pipeline. A non-matching job is dropped: it’s skipped for this sync and counted as filtered in the push log — this is not an error. Matching jobs pass through unchanged.Configuration
Field paths
Conditions reference fields with dot paths, including array indexes:title, company.name, locations[0].country, compensation.min.
Operators
Example: remote jobs in the US or UK
- Mode: include, Logic: all
is_remoteequalstruelocations[0].countryinUS, GB
Field Mapper
Renames and restructures fields with simple source → target path mappings — the no-code alternative to a Liquid template for schema mapping.Configuration
Behavior
- A mapping whose source path doesn’t resolve is skipped silently — sparse documents are normal, not errors.
- Values are copied as-is: objects and arrays can be mapped whole (
locations→offices). - Nested targets like
job.details.titlecreate the intermediate objects automatically.
Example: flatten to a custom schema
Mode: mapped_onlyLiquid Template
Reshape and remap JSON using Liquid template syntax for cases the Field Mapper can’t express — conditionals, loops, string formatting. The node renders its template against the parent node’s output. The template should produce valid JSON; plain-text output is automatically wrapped as{ "result": "<text>" }.
Available Variables
The input document is bound todata — access any field of the job document with dot notation: data.title, data.company.name, data.locations[0].city.
Available Filters
All standard Liquid filters are supported:upcase, downcase, date, strip_html, truncatewords, split, join, replace, and the rest of the standard set.
Example: Remap Fields
Example: Conditional Fields
AI (OpenRouter)
Use LLM intelligence to extract, classify, enrich, or rewrite job data. The AI node sends data to any model available on OpenRouter — using your own OpenRouter API key, configured in Settings.Configuration
The
{{input}} placeholder in the user prompt is replaced with the full
JSON output of the parent node. If the placeholder is missing, the input is
appended to the end of the prompt automatically.Runtime behavior
- Structured output: with an
output_schema, the request uses OpenRouter’s strictjson_schemaresponse format; without one, JSON mode is requested. If the model still returns plain text, it’s wrapped as{ "result": "<text>" }. - Timeout & retries: 60-second timeout per attempt; transient failures (timeouts, network errors, 5xx, rate limits) are retried twice with backoff. Not configurable.
- Key problems fail fast: an invalid key or exhausted credits (401/402/403) fails the entire sync immediately with an actionable message — it would otherwise fail identically on every job.
Example: Extract Seniority Signals
System Prompt:JSON Merge
Combine two JSON inputs into a single unified object. The JSON Merge node has two input handles:base (original data) and patch (new data, typically AI output). This is essential for preserving original job data while adding AI-generated fields.
Configuration
Arrays are always replaced whole, never merged element-wise.
Deep Merge Example
- Base (original data)
- Patch (AI output)
- Result (deep, patch wins)
Nested Deep Merge Example
When both base and patch have nested objects, deep merge recursively combines them:- Base
- Patch
- Result (deep, patch wins)
Output Node
The exit point for processed data. The final JSON from this node is what gets written to your destination. Every pipeline ends with exactly one Output node — it has no configuration.The output must be a JSON object (documents, not arrays or scalars), and
its identity in the destination is always the original Jobo job id —
regardless of what your pipeline renamed. That’s what makes updates and
expiry deletions work no matter the output shape.

