GiftRegistry API
One registry API, every site

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 }.

MethodPathPurpose
POST/api/v1/registriesCreate 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}/itemsAdd 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}/claimsReserve/buy quantity (409 when none left)
GET/api/v1/registries/{id}/items/{itemId}/claimsList an item's claims
DELETE/api/v1/registries/{id}/items/{itemId}/claims/{claimId}Release a claim