{"uid":"cap_RVHZc6pav0JLxBK4L-z4V","slug":"relaystation-table-join-8793f2a5","name":"RelayStation Table Join","description":"$0.0002/MB. Join two tables by key — inner, left, right, or outer. 1¢ x402 min; remainder auto-credits — relaystation.ai/penny","url":"https://api.relaystation.ai/v1/data/join","method":"POST","headers":{},"bodySchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["input"],"properties":{"input":{"type":"object","required":["type","method","bodyType","body"],"properties":{"body":{"type":"object","properties":{"on":{"type":"array","items":{"type":"object","required":["left","right"],"properties":{"left":{"type":"string"},"right":{"type":"string"}}},"minItems":1},"to":{"enum":["csv","tsv","json","ndjson"],"type":"string","description":"A tabular file format: csv, tsv, json (array of objects), or ndjson."},"how":{"enum":["inner","left","right","outer"],"type":"string"},"from":{"enum":["csv","tsv","json","ndjson"],"type":"string","description":"A tabular file format: csv, tsv, json (array of objects), or ndjson."},"left":{"type":"object","description":"cputools input-source: { inline: <base64 ≤ 4 MiB> } or { inputKey: <scratch key from /v1/cputools/upload-url, ≤ 50 MB> }."},"right":{"type":"object","description":"cputools input-source: { inline: <base64 ≤ 4 MiB> } or { inputKey: <scratch key from /v1/cputools/upload-url, ≤ 50 MB> }."}}},"type":{"type":"string","const":"http"},"method":{"enum":["POST","PUT","PATCH"],"type":"string"},"bodyType":{"enum":["json","form-data","text"],"type":"string"}},"additionalProperties":false},"output":{"type":"object","required":["type"],"properties":{"type":{"type":"string"},"example":{"type":"object"}}}}},"responseSchema":null,"example":null,"exampleRequest":null,"tags":["x402"],"displayCostAmount":"0.01","displayCostAsset":"USDC","priceDynamic":false,"priceHint":null,"priceStatus":"priced","priceSource":"registry","requiresHandshake":false,"reviewCount":0,"rating":{"score":"0.00","successRate":"0.00","reviews":0,"stars":null,"state":"unrated"},"availabilityStatus":"unknown","priceObserved":null,"sessionDeposit":null,"pricing":{"kind":"static","summary":"$0.01/call","primary":{"kind":"static","protocol":"x402","network":"base","amountUsd":"0.01","per":"call","confidence":"exact"},"accepted":[{"kind":"static","protocol":"x402","network":"base","amountUsd":"0.01","per":"call","confidence":"exact"}]},"paymentMethods":[{"uid":"pm_Ul4Y1EDDiAHAbhXafPj5i","protocol":"x402","methodType":"crypto","chain":"base","mode":"charge","costAmount":"0.01","costPer":"request","priority":0,"asset":null,"unit":"request","depositMicros":null,"planRef":null}],"brandName":null,"brandSlug":null,"brandBaseUrl":null,"brandDocsUrl":null,"whatItDoes":"Joins two in-memory tables by key using inner, left, right, or outer join semantics, priced per MB of input data","exampleAgentPrompt":"Do a left join on these two tables using 'user_id' as the key — I want all rows from the left table and any matching rows from the right.","exampleUseCases":[{"title":"Enrich orders with customer info","prompt":"I have a list of orders and a list of customers — can you do an inner join on 'customer_id' so each order row includes the customer's name and email?"},{"title":"Merge product catalog with inventory","prompt":"Join my product catalog table with my inventory table on 'product_id' using a left join so I keep all products even if there's no inventory record."},{"title":"Correlate logs with user profiles","prompt":"I have two datasets: one is raw event logs with a 'uid' field, the other is user profiles also keyed by 'uid'. Do a full outer join on 'uid' so I can see which events have no matching profile and vice versa."}],"resultDescription":"Returns the joined table as a collection of merged rows, containing columns from both input tables combined according to the specified join type (inner/left/right/outer) on the given key. Rows with no match are included or excluded depending on join type.","failureModes":["mismatched or missing join key field returns an error or empty result","malformed input data (non-tabular, unparseable format) causes a 400-level error","extremely large payloads may exceed per-call MB limits or increase cost","unsupported join type string returns a validation error","one or both tables empty returns an empty or single-sided result"],"whenToPreferThis":"Choose this endpoint when you need to combine two structured datasets by a common key in a single API call without spinning up a database or writing SQL. Ideal for lightweight ETL pipelines, data enrichment, and ad-hoc record merging where the data fits in a single HTTP request and you want predictable per-MB pricing.","instructions":null,"reviewSummary":null,"reviewSummaryHighlights":null,"reviewSummaryConcerns":null,"reviewSummaryGeneratedAt":null,"activationCount":0,"lastUsedAt":null,"lastSuccessfullyRanAt":null,"lastHealthCheckAt":"2026-09-14T06:53:04.845Z","isFirstParty":false}