Save JSON.
Get a URL.
One request stores a JSON document. The URL it returns works from anywhere — browser, server or shell. No account, no key, no headers.
$ curl -d '{"hello":"world"}' https://api.jstash.app/v1/bins { "url": "https://j.jstash.app/LmP6w8kC2fY7Qv4rZx1aNg", "edit_token": "js_edit_…", "expires_at": "2026-10-09T10:30:00Z", "keep_it": "Sign in at https://app.jstash.app to make this bin permanent.", … }
const res = await fetch("https://j.jstash.app/LmP6w8kC2fY7Qv4rZx1aNg"); await res.json(); // → {"hello":"world"} exactly what you saved
Paste a document. Break it on purpose, too.
This calls the real API. Leave a trailing comma, send nothing, or keep saving quickly — every error tells you what to change.
// Send the request to see the response.
Bins made here are real public trial bins. They expire in 7 days.
Small surface. Nothing to look up.
One way to sign a request
The edit token and your API key go in the same header. Learn it on your first update and you know how everything works.
Your JSON, untouched
Reads return exactly the document you saved — no envelope, no data key. Send it with any Content-Type; it only has to parse.
Errors that say what to do
Not just 400 Bad Request. Every failure names the problem and the fix, so you keep going without opening the docs.
Trial bins last a week. Claimed bins stay.
When a prototype becomes something you want to keep, sign in and claim it. The URL doesn’t change, so nothing that reads it has to.
-
1
Save without an account
Keep the
edit_tokenfrom the response. It updates or deletes that one bin. -
2
Sign in at app.jstash.app
Create an API key there. It goes in the same
Authorizationheader. -
3
Claim it with the token
curl -X POST https://api.jstash.app/v1/bins/LmP6w8kC2fY7Qv4rZx1aNg/claim \ -H "Authorization: Bearer js_live_…" \ -d '{"edit_token":"js_edit_…"}'
Your first bin is one line away.
curl -d '{"hello":"world"}' https://api.jstash.app/v1/bins