Pantry deserves its fans. It's a free JSON storage service with a lovely mental model: you get a PantryID, and you can stash up to 100 "baskets" (JSON objects, up to 1.44 MB each) behind a clean REST-ish API โ POST to save, GET to read, PUT to merge, DELETE to remove. No signup form, no SDK, encrypted at rest. For "my hobby script needs to remember one config object", it's genuinely great, and unlike half the services in this category, it's alive and working.
But most projects that start with "I'll just stash my JSON in a basket" are actually storing a list of things โ todos, scores, entries, submissions. That's where the basket model runs out, and the walls are all documented in Pantry's own FAQ:
GET the entire basket, merge locally, and POST the entire blob back. Two writers doing this at once silently clobber each other (last upload wins).HTTP 429 with retry-after: 4.One smaller nit for your error handling: a missing pantry or basket answers HTTP 400 with an error string, not a 404.
Here's how to do the same job on Mockbird with records instead of blobs โ appends are atomic, queries are built in, setup is one scriptable curl, and nothing expires.
# 1. create a project (anonymous โ no login, no CAPTCHA, works from CI)
curl -X POST https://mockbird.mockbird.workers.dev/api/projects \
-H 'content-type: application/json' -d '{"name":"my pantry"}'
# โ {"id":"abc123","adminKey":"KEY", ...} โ save both (re-readable via the dashboard if you sign up)
# 2. create an empty collection ("basket", but plural-friendly)
curl -X POST https://mockbird.mockbird.workers.dev/api/projects/abc123/resources \
-H 'X-Admin-Key: KEY' -H 'content-type: application/json' \
-d '{"name":"todos","fields":[{"name":"title","type":"sentence"}],"seed":0}'
Now the part Pantry can't do โ append one item without touching the rest:
curl -X POST https://mockbird.mockbird.workers.dev/m/abc123/todos \
-H 'content-type: application/json' \
-d '{"title":"water the plants","tags":["home"],"meta":{"urgent":true},"done":false}'
# โ stored verbatim (nested objects/arrays included), gets an auto id
# atomic append: no download-merge-reupload, no lost-update race
curl 'https://mockbird.mockbird.workers.dev/m/abc123/todos?done=false&sortBy=id&order=desc&limit=10'
curl -X PATCH https://mockbird.mockbird.workers.dev/m/abc123/todos/1 \
-H 'content-type: application/json' -d '{"done":true}' # merge ONE record, like Pantry's PUT but scoped
curl -X DELETE https://mockbird.mockbird.workers.dev/m/abc123/todos/1
Reads and writes are open by default and CORS is on, so browser fetch() works โ and there's no 2-requests-per-second ceiling to debounce around (the cap is 10,000 requests per project per day, burst-friendly).
| In Pantry | On Mockbird |
|---|---|
| Get a PantryID (website + CAPTCHA, shown once) | POST /api/projects โ one curl, scriptable, key in the response |
GET /apiv1/pantry/<id> (details + basket list) | GET /m/<project> โ live index of collections, counts & exports |
POST โฆ/basket/<name> (create/replace the whole blob) | POST /m/<p>/<collection> appends a record; PUT โฆ/<id> replaces one |
GET โฆ/basket/<name> (the whole blob, always) | GET /m/<p>/<collection> with ?done=false, _gte/_lte/_ne/_like, sortBy, page/limit, q= search |
PUT โฆ/basket/<name> (merge into the blob) | PATCH /m/<p>/<collection>/<id> โ merge one record |
DELETE โฆ/basket/<name> | delete one record, or the whole collection |
| 2 calls per second | 10,000 requests/project/day, no per-second throttle |
| Inactive baskets deleted after 30 days | no inactivity expiry |
Missing basket โ HTTP 400 | proper 404s |
Just want a config blob at a fixed URL? That's Pantry's sweet spot, and it maps to a custom route: GET /config returning exactly the JSON you set, sharable read-only like Pantry's public basket links โ while the management API (with your admin key) stays the only way to change it.
A way out. GET /m/<project>/db.json exports everything in json-server format (npx json-server db.json serves it locally, forever). Plus OpenAPI, Postman and TypeScript/Zod exports, GraphQL over the same data, snapshots (save/restore the whole dataset โ deliberate, not a 30-day timer), a request inspector, and protected mode if the data shouldn't be world-readable. If the collection is for a prototype, "seed":25 fills it with realistic fake data instead of starting empty.
The shared demo project is live right now:
curl 'https://mockbird.mockbird.workers.dev/m/demo/products?limit=2&sortBy=price&order=desc'
curl -X POST https://mockbird.mockbird.workers.dev/m/demo/products \
-H 'content-type: application/json' -d '{"name":"Test product","price":9.99}'
# โ it persists โ GET it back by the id you received
| Pantry | Mockbird | |
|---|---|---|
| Status | alive and working | live, free while in beta |
| Setup | website + CAPTCHA (no provisioning API) | one curl, scriptable |
| Data model | up to 100 baskets, each one JSON blob | collections of records (20 per project, 1,000 records each) |
| Max payload | 1.44 MB per basket โ bigger blobs than us | 64 KB per management write, 512 KB imports |
| Append an item | download blob โ merge โ reupload (races) | atomic POST |
| Query/filter/sort/paginate | โ | full toolkit + q= search + GraphQL |
| Rate limit | 2 calls/sec (429 observed on a 3-request burst) | 10,000/project/day, burst-friendly โ though 2/s paced all day exceeds 10k, so steady high-volume traffic favors Pantry |
| Retention | inactive baskets deleted after 30 days | no expiry |
| Encryption at rest | AES-256, advertised explicitly | platform-standard storage; no equivalent claim โ don't put secrets in either |
| Export | โ | db.json, OpenAPI, Postman, TS/Zod |
Where Pantry honestly wins: bigger single payloads (1.44 MB vs our 64 KB writes), an explicit encryption-at-rest story, a friendly web dashboard for editing baskets by hand, and โ if you pace requests under 2/s all day โ a higher theoretical daily volume than our 10k cap. If your data really is one occasionally-touched blob and you'll touch it at least monthly, Pantry remains a fine choice.
This page is written by the Mockbird maker โ bias disclosed. Pantry facts verified September 14, 2026, from Pantry's own site and FAQ (100 baskets per pantry, 1.44 MB per basket, "API requests are limited to 2 calls per second", "inactive baskets will be removed after 30 days", AES-256 encryption, public read-only basket links) and by live requests: a 3-request burst answered HTTP 429 with retry-after: 4; unknown pantry/basket ids answered HTTP 400 with a JSON error; the pantry-creation page loads Google reCAPTCHA and no provisioning API is documented. Every Mockbird command on this page was run against production before publishing. Anonymous projects have a per-IP daily creation cap; sign up (free) to keep projects permanently.
Full API reference in the docs. More guides in this category: jsonbin.io alternative ยท npoint.io alternative ยท jsonbox alternative (dead) ยท host a JSON file as an API ยท CSV โ REST API. Create your API โ