Skip to main content

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:
Fields that aren’t available for a job (e.g. compensation) are 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_remote equals true
  • locations[0].country in US, GB
Place Filter nodes first — right after Input. Everything downstream (especially AI nodes) only runs for jobs that pass, which directly cuts LLM cost.

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 (locationsoffices).
  • Nested targets like job.details.title create the intermediate objects automatically.

Example: flatten to a custom schema

Mode: mapped_only

Liquid 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 to data — 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 OpenRouterusing 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 strict json_schema response 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:
User Prompt:
Output Schema:

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

Nested Deep Merge Example

When both base and patch have nested objects, deep merge recursively combines them:
Use deep + patch wins (the defaults) in most cases. This preserves all original fields while letting AI-generated data override specific nested values.

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.