Skip to content

docs: [transaction] document tx.jup.ag Solana JSON-RPC submission endpoint#934

Open
0xanmol wants to merge 15 commits into
mainfrom
docs/beam-tx-jup-ag-submit
Open

docs: [transaction] document tx.jup.ag Solana JSON-RPC submission endpoint#934
0xanmol wants to merge 15 commits into
mainfrom
docs/beam-tx-jup-ag-submit

Conversation

@0xanmol

@0xanmol 0xanmol commented Jul 9, 2026

Copy link
Copy Markdown
Member

Document transaction landing via tx.jup.ag (Solana JSON-RPC sendTransaction) and move it into its own Transaction Landing section (out of Swap). Seeds DEV-328.

Verified live (real swaps + reject-path probes): sendTransaction lands (real SOL→USDC); tip min 0.001 SOL (-1013); skipPreflight must be true / maxRetries must be 0 (-1015); base64 only (-1016); send-only (no blockhash/simulate); only sendTransaction is external (others -1012).

Open (gates merge):

  • Publishing timing — Kyle wants to advertise now, groovie wants to hold until internal migration.
  • "API key required" is intended, not yet enforced (keyless still lands today).

🤖 Generated with Claude Code

…point

Beam v2 exposes transaction landing as a Solana JSON-RPC sendTransaction
endpoint at tx.jup.ag. Point any Solana client at it with the x-api-key
header instead of POSTing to the REST /tx/v1/submit (kept as legacy).
Verified end-to-end with a live mainnet transaction.
@mintlify

mintlify Bot commented Jul 9, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
Jupiter 🟢 Ready View Preview Jul 9, 2026, 6:30 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

Both verified against tx.jup.ag with live transactions: the @solana/kit
send path lands, and a tip-less transaction returns "Transaction must
include a Jupiter tip instruction".
@0xanmol

0xanmol commented Jul 9, 2026

Copy link
Copy Markdown
Member Author

Verified the primary /build example end-to-end against the live endpoint, not just a memo transaction:

  • Real SOL→USDC swap built with /build (tipAmount), submitted through tx.jup.ag, confirmed on-chain: 2uv3LT…0.3916 USDC received.
  • Both SDK send paths land: @solana/web3.js sendRawTransaction and @solana/kit sendTransaction.
  • Missing tip is rejected with Transaction must include a Jupiter tip instruction (now documented).

The documented flow is validated by real swaps producing token output.

sendAndConfirmTransaction and sendYoloModeTransaction are role-gated to
internal callers (-1012 Access denied with an external key); only
sendTransaction (and sendJitoBundle) are available externally. Drop the
sendAndConfirmTransaction mention from llmsDescription and record the
verified access matrix.
The 20/50/100 dedicated bucket in the api-gateway quota.toml is keyed by
the REST paths /tx/v1/submit and /swap/v2/submit on api.jup.ag. tx.jup.ag
is a separate direct-to-beam load balancer, not fronted by that gateway,
so it does not inherit the bucket. Revert the mistaken tx.jup.ag
relabelling on the rate-limits page and scope the submit.mdx note to the
REST path.
@0xanmol

0xanmol commented Jul 9, 2026

Copy link
Copy Markdown
Member Author

Correction to open question #2 (rate limits), verified in developer-platform:

My earlier "assumed yes, same gateway" was wrong. The 20/50/100 dedicated bucket lives in api-gateway/auth-service/config/quota.toml, keyed by the REST paths /tx/v1/submit and /swap/v2/submit on host api.jup.ag (which the gateway rewrites to tx.juprpc.com/submit). tx.jup.ag is a separate direct-to-beam load balancer and does not appear in that repo, so it is not fronted by this gateway and does not inherit the bucket.

Fixed in the docs: reverted the tx.jup.ag relabel on the rate-limits page, and the submit page now scopes the bucket to the REST path and notes tx.jup.ag routes around the gateway.

Still open (for whoever owns the tx.jup.ag LB / cloud-compute-infrastructure): what are tx.jup.ag's actual rate limits? Docs won't state a number until confirmed.

Per Kyle/groovie in-thread: advertise only sendTransaction (sendJitoBundle
is internal-only, sendAndConfirmTransaction is being deprecated); tx.jup.ag
will require an API key, so drop the keyless advertising and make the
OpenAPI auth required; rate limits are a single anti-abuse limit across all
tiers with the number still TBD, not the tiered REST buckets.
groovie confirmed the beam require_role(Internal) check. My earlier probe's
-32602 on sendJitoBundle was a params-deserialization error before the role
gate, not proof of external access. Only sendTransaction is external.
…yet)

Verified with real funds: a valid signed swap sent with no x-api-key
landed + finalized, same as the keyed send. The API-key requirement Kyle
described is not live yet; docs advertise it as forward guidance.
…sOnly

Verified live against tx.jup.ag: skipPreflight must be true and maxRetries
must be 0 (explicit false / non-zero rejected with -1015), correcting the
earlier "skipPreflight is only a perf rec" framing. Document swqosOnly
(optional SWQoS-only routing for lowest latency) and the external error
codes (-1013/-1014/-1015/-1016) from the beam api-v2 design spec.
Lead with how-to instead of the infra pitch: move "Why it's competitive"
down to "Why it lands fast" after best practices. Consolidate the
sendTransaction param rules (encoding/skipPreflight/maxRetries/swqosOnly)
into a scannable config table under Requirements. Cut redundant prose: the
duplicate API-key clause, the vague scale bullet, and the tipAmount /
simulate / skipPreflight / swqosOnly best-practice bullets now covered
elsewhere.
Per YY's feedback: call out that tx.jup.ag routes straight to Beam while
the legacy api.jup.ag/tx/v1/submit proxies through the API gateway first.
…" section

tx.jup.ag / submit is product-neutral (any signed transaction, not just
swaps), so move it out of Docs > Swap > Router into a dedicated
"Transaction Landing" menu item. Nav-only: URLs unchanged, no redirects.
Seeds DEV-328 (YY's broader transactions & landing section).
Per groovie (beam dev): swqosOnly is not yet implemented. I had documented
it from the design spec plus a live test where swqosOnly:true "landed", but
that test was invalid: JSON-RPC silently ignores unknown config fields, so
an unimplemented param lands exactly like a real one. Remove it from the
config table, OpenAPI, and example. Logged the correction and a follow-up
for real jito-tip / priority-fee guidance.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant