โ† All guides

Pantry (getpantry.cloud) alternative โ€” JSON storage you can actually query

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:

  1. A basket is one JSON object โ€” there are no records. To append a single item you must 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).
  2. No queries. No filtering, no sorting, no pagination, no search. Every read downloads the whole basket, even for one item.
  3. 2 API calls per second โ€” Pantry's stated limit, and it's real: in our test, a burst of three quick requests already answered HTTP 429 with retry-after: 4.
  4. Inactive baskets are deleted after 30 days. Pantry calls its storage "perishable" โ€” step away from a side project for a month and its data is gone.
  5. You can't script setup. Creating a pantry happens on the website behind a CAPTCHA โ€” there's no provisioning API โ€” and the PantryID is shown once ("we won't be sharing it with you again"). Nothing to automate in CI, nothing to re-fetch if you lose it.

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.

The 60-second replacement

# 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).

Pantry โ†’ Mockbird translation

In PantryOn 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 second10,000 requests/project/day, no per-second throttle
Inactive baskets deleted after 30 daysno inactivity expiry
Missing basket โ†’ HTTP 400proper 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.

What Pantry doesn't have

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.

Try it with zero setup

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

Honest comparison

PantryMockbird
Statusalive and workinglive, free while in beta
Setupwebsite + CAPTCHA (no provisioning API)one curl, scriptable
Data modelup to 100 baskets, each one JSON blobcollections of records (20 per project, 1,000 records each)
Max payload1.44 MB per basket โ€” bigger blobs than us64 KB per management write, 512 KB imports
Append an itemdownload blob โ†’ merge โ†’ reupload (races)atomic POST
Query/filter/sort/paginateโ€”full toolkit + q= search + GraphQL
Rate limit2 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
Retentioninactive baskets deleted after 30 daysno expiry
Encryption at restAES-256, advertised explicitlyplatform-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 โ†’

โšก Skip the terminal: this link creates a live, seeded e-commerce backend in the dashboard โ€” real URL, data browser already open, no signup. Or import your own db.json, CSV, OpenAPI spec, Postman collection, or HAR and host your exact data.