{"slug":"x402-agent-tools-nerolabs-workers-dev-data-join-792608","title":"Joins two lists of JSON rows on one or more key fields, like a VLOOKUP or SQL jo","host":"x402-agent-tools.nerolabs.workers.dev","method":"POST","resource":"https://x402-agent-tools.nerolabs.workers.dev/data/join","category":"other","description":"Joins two lists of JSON rows on one or more key fields, like a VLOOKUP or SQL join: inner, left, right, full or anti. Keys match exactly, or normalized (case, spacing and number-as-text differences ignored). Returns joined rows plus match counts and unmatched rows. Up to 500 rows a side. $0.002 per ","price_listed":0.004,"price_asked":0.004,"state":"answering","state_label":"Answering","checks_7d":1,"answered_7d":1,"latency_ms_median":503,"reported_calls_30d":0,"reported_payers_30d":0,"networks":["eip155:8453"],"badge":"unverified","paid_checks_7d":0,"paid_ok_7d":0,"example_input":{"body":{"joinType":"left","keyMatching":"normalized","leftKeyFields":["domain"],"leftRows":[{"company":"Acme Ltd","domain":"acme.com"},{"company":"Bolt Co","domain":"bolt.io"}],"rightKeyFields":["website"],"rightRows":[{"employees":40,"website":" ACME.com"}]},"bodyType":"json","method":"POST","type":"http"},"output_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"input":{"additionalProperties":false,"properties":{"body":{"additionalProperties":false,"properties":{"includeJoinInfo":{"description":"On by default: every row gets _joinStatus (\"matched\", \"left_only\", \"right_only\") and _matchCount. Set false for rows with only your own fields.","type":"boolean"},"joinType":{"description":"Which rows to keep. left (default): every left row, enriched where a match exists. inner: matched rows only. right: every right row. full: everything from both sides. leftAnti: left rows with no match on the right. rightAnti: right rows with no match on the left. union: stack both lists, no key needed.","enum":["left","inner","right","full","leftAnti","rightAnti","union"],"type":"string"},"keyMatching":{"description":"normalized (default): case-insensitive, trimmed, repeated spaces collapsed, 123 matches \"123\". exact: values must be identical.","enum":["normalized","exact"],"type":"string"},"leftKeyFields":{"description":"The field name(s) on the left rows to match on, for example [\"email\"], or [\"firstName\",\"lastName\"] for a composite key. Required for every joinType except union.","items":{"type":"string"},"type":"array"},"leftRows":{"description":"The LEFT table: the main rows you want to keep or enrich. Each row is a JSON object; keys may differ between rows.","items":{"type":"object"},"type":"array"},"multipleMatches":{"description":"When one key matches several right rows. all (default): one output row per matching pair, like SQL. first: only the first matching right row, like VLOOKUP, so each left row appears once.","enum":["all","first"],"type":"string"},"onFieldConflict":{"description":"When a right field has the same name as a left field. prefixRight (default): keep both, the right one renamed with rightFieldPrefix. keepLeft: ignore the right value. keepRight: overwrite the left value.","enum":["prefixRight","keepLeft","keepRight"],"type":"string"},"rightFieldPrefix":{"description":"Prefix for conflicting right fields when onFieldConflict is prefixRight. Default \"right_\", so price becomes right_price.","type":"string"},"rightFields":{"description":"Only copy these fields from the matching right row, like choosing VLOOKUP return columns. Leave out to copy every right field.","items":{"type":"string"},"type":"array"},"rightKeyFields":{"description":"The matching field name(s) on the right rows, in the same order as leftKeyFields, for example [\"contact_email\"]. Leave out when the right rows use the same names as the left.","items":{"type":"string"},"type":"array"},"rightRows":{"description":"The RIGHT table: the lookup rows to pull matching fields from. Each row is a JSON object.","items":{"type":"object"},"type":"array"}},"required":["leftRows","rightRows"],"type":"object"},"bodyType":{"enum":["json","form-data","text"],"type":"string"},"method":{"enum":["POST"],"type":"string"},"type":{"const":"http","type":"string"}},"required":["type","method","bodyType","body"],"type":"object"},"output":{"properties":{"example":{"type":"object"},"type":{"type":"string"}},"required":["type"],"type":"object"}},"required":["input"],"type":"object"},"history":[{"day":"2026-10-21","reachable":true,"status":402,"valid_402":true,"asked_usdc":0.004,"price_match":true,"latency_ms":503,"error":null}],"description_full":"Joins two lists of JSON rows on one or more key fields, like a VLOOKUP or SQL join: inner, left, right, full or anti. Keys match exactly, or normalized (case, spacing and number-as-text differences ignored). Returns joined rows plus match counts and unmatched rows. Up to 500 rows a side. $0.002 per left row sent (right rows free), $0.002 minimum. Same engine as nerolabs/dataset-join-merge.","last_updated":"2026-10-21T14:15:17.103Z","schemes":["exact"]}