Wish lists people curate.
Gifts nobody buys twice.
A headless gift-registry service powering wedding wish lists, baby registries, and whatever we launch next. Curate products from Amazon and beyond, share them through any of our sites, and let gift-givers claim items with no duplicate presents.
Everything a registry needs, behind one API
The service owns the hard parts — sources, claims, ownership — so each site only builds its own look and feel.
Items from any store
Amazon products are first-class (stored by ASIN), and any other https product page works as a generic link. Paste a URL — the API recognizes where it points and stores the right thing.
Never double-gifted
Gift-givers claim quantities, and every claim runs in a transaction against what's left. Two aunts buying the same crib at the same moment — one succeeds, one is told it's taken.
Lists for every occasion
Wedding, baby, birthday, holiday, housewarming, or anything else. Each registry carries its occasion, status, and item priorities so sites can present it the right way.
Tenant-scoped by design
Every registry belongs to a service and a tenant within it — a wedding slug, a user id. Each consuming site holds its own API key and can only ever see its own registries.
Monetized links, resolved server-side
The API returns each item with its outbound URL already built — Amazon links carry our associate tag automatically. Consumers never assemble store URLs themselves.
A typed client, not just endpoints
Sites integrate with createRegistryClient from @affiliate/registry-shared — typed methods, zod-validated shapes, and clear error codes instead of hand-rolled fetch calls.
How it works
Three calls from your server and a registry is live on your site.
Create a registry
One per tenant and occasion — a couple's wedding wish list, a baby registry for an expecting family.
Curate the items
Add products by pasting a store URL, with quantity, priority, photo, and a note about why it made the list.
Guests claim gifts
Your site shows what's still available; claims are transactional, releasable, and never oversell an item.
Built API-first
Server-side only: your backend calls ours with its service key (Authorization: Bearer service:secret). The typed client ships in @affiliate/registry-shared.
import { createRegistryClient } from "@affiliate/registry-shared";
const registry = createRegistryClient({
baseUrl: "https://registry--americanreviewcenter.us-central1.hosted.app",
apiKey: process.env.REGISTRY_API_KEY!, // "wedding:…" — server-side only
});
const list = await registry.createRegistry({
tenant: "smith-jones",
title: "Our Wedding Wish List",
occasion: "wedding",
});
await registry.addItem(list.id, {
url: "https://www.amazon.com/dp/B0EXAMPLE1", // stored as ASIN
title: "Stand Mixer",
quantity: 1,
priority: "high",
});
// On the guest page:
const { claim, item } = await registry.claimItem(list.id, itemId, {
name: "Aunt Carol",
});API reference
Versioned under /api/v1. Every request is authenticated; responses are { ok: true, data } or { ok: false, error }.
| Method | Path | Purpose |
|---|---|---|
| POST | /api/v1/registries | Create a registry for a tenant |
| GET | /api/v1/registries?tenant=… | List your service's registries |
| GET | /api/v1/registries/{id} | Fetch a registry with its items |
| PATCH | /api/v1/registries/{id} | Update title / description / occasion / status |
| DELETE | /api/v1/registries/{id} | Delete a registry (items + claims included) |
| POST | /api/v1/registries/{id}/items | Add an item (source union or pasted product URL) |
| PATCH | /api/v1/registries/{id}/items/{itemId} | Update an item |
| DELETE | /api/v1/registries/{id}/items/{itemId} | Remove an item |
| POST | /api/v1/registries/{id}/items/{itemId}/claims | Reserve/buy quantity (409 when none left) |
| GET | /api/v1/registries/{id}/items/{itemId}/claims | List an item's claims |
| DELETE | /api/v1/registries/{id}/items/{itemId}/claims/{claimId} | Release a claim |