APIFuseAPIFuseDocs

Getting started

  • Overview
  • Quickstart

Authentication

  • Managed keys
  • Scopes

Errors

  • Error model
  • Retries

Webhooks

  • Overview
  • Signatures

API reference

  • Amazon Japan
  • Baemin Provider
  • Buyee
  • CatchTable Restaurant Search and Reservations
  • Charan Commerce
  • Daangn public listings
  • Daiso Product and Store Data
  • Danawa price comparison
  • Demaecan
  • Ekitan
  • Goodchoice Domestic Lodging
  • Google Flights
  • Han River Water Level
  • Hot Pepper Gourmet provider
  • Hyundai Card
  • Jalan
  • Japan National Diet Minutes
  • Japan Disaster Alerts
  • Japan EDINET Filings
  • Japan e-Gov Law
  • Japan e-Stat
  • Japan GSI Geocoding
  • Japan e-Gov Open Data
  • Japan Post ZIP
  • Japan Public Holidays
  • JMA Weather
  • KakaoMap Place Search and Directions
  • Kakao T Taxi Dispatch
  • Korea Address Search
  • AirKorea Real-time Air Pollution
  • Korea Apartment Rent Prices
  • Korea Apartment Sale Prices
  • Korea Bid Notices
  • Korea Building Register
  • Korea Business Verify
  • Korea Camping
  • Korea DART Corporate Finance
  • DART Corporate Info
  • Korea Culture Events
  • Korea Disaster Alert
  • Korea Emergency Hospital
  • Korea ETF
  • Korea EV Charger
  • Korea Fuel Price
  • Korea Holiday
  • Korea Hospital Info
  • Korea Land Price
  • Korea MFDS Drug Safety
  • Korea MFDS Food Safety
  • Korea Household Waste Disposal Guide
  • Korea National Law Search and Lookup
  • Korea NEIS School Meals
  • Carrier List and Delivery Tracking
  • Korea Pharmacy
  • Korea Population
  • Korea Stock Index
  • Korea Stock Price
  • Korea Train Schedule
  • Korea Weather Forecast Data
  • Korea Weather Forecast
  • Korea Welfare Service
  • K-Startup
  • LH Housing Notices
  • Market Kurly product data
  • Mercari
  • Modu Parking
  • Naver Blog Search
  • Naver Flight API
  • Naver Map
  • Naver News Search
  • NOL Stays
  • Ohouse Store and Contents
  • Rakuten Ichiba
  • Rakuten Travel
  • SEC EDGAR Filings
  • Seoul Bike
  • Seoul Live Crowd Density
  • Seoul Subway Arrivals
  • Shinhan Bank
  • Shinhan Card
  • Skiplagged
  • SUUMO
  • Swing Taxi
  • Tabelog
  • TableCheck
  • Weverse Provider
  • Yahoo! Shopping (Japan)
  • Yogiyo
  • ZOZOTOWN

Guides

  • APIFuse Docs
  • Getting started
  • Authentication and Connections
  • Playground
  • OpenAPI and schemas
  • MCP endpoint
  • Developer MCP guide
  • Schema bundles
  • Next.js App Router integration
  • FastAPI integration
  • Error Handling
  • FAQ
  • Resources

Changelog

  • Changelog
APIFuseAPIFuse
DocsServicesPlaygroundStatus
Log inSign up

Getting started

Quickstart

Issue a sandbox key and make your first reservation.

The flow is four steps, all in the Catch Table sandbox: issue a key, search restaurants, read availability and create the reservation. You need nothing beyond a terminal and a runtime with fetch. Every call below is answered from sandbox fixtures, so no request ever reaches a real venue.

Issue a sandbox key

APIFuse issues two kinds of keys. Live keys start with frism_live_ and sandbox keys start with frism_test_. Both are managed keys: APIFuse holds the per service credentials behind them, so you never create a Catch Table account yourself.

  1. Sign in to the APIFuse console and create a project.
  2. Under API keys, create a sandbox key. It starts with frism_test_ and is shown once, so store it in your secret manager.
  3. Leave the scopes at their default. New keys start with full scope; you can narrow them to catch-table:read and catch-table:write later, see scopes.
Sandbox keys never reach a real venue. Every request is answered from fixture data, so you can create and cancel reservations freely.

First call: search restaurants

Start by finding a bookable venue. Search restaurants filters by area, cuisine and party_size, and pages with a cursor.

Search restaurants
curl "https://api.frism.dev/v1/catch-table/restaurants?area=seongsu&cuisine=japanese&party_size=2" \
  -H "Authorization: Bearer frism_test_k3xample"

A trimmed response looks like this. The id of each item is the restaurant identifier the later calls use. Venues with bookable_online set to false only take waitlist entries.

200 response (trimmed)
{
  "items": [
    {
      "id": "res_01J8Q9W3TE",
      "name": "Sushi Aoyagi",
      "area": "seongsu",
      "cuisine": "japanese",
      "price_band": "high",
      "bookable_online": true
    }
  ],
  "next_cursor": "cur_9f2kq"
}

Pass next_cursor back as the cursor parameter to fetch the next page. It is null on the last page.

Read availability and reserve in TypeScript

A reservation takes two calls. returns the open slots for a date and party size, and books one of them. The POST carries an Idempotency-Key header, so after a timeout or a crash you can retry the same creation safely for 24 hours.

Read slots, then reserve
const base = "https://api.frism.dev/v1";
const headers = { Authorization: "Bearer frism_test_k3xample" };

// 1. Read the open slots for the date and party size.
const availabilityRes = await fetch(
  base +
    "/catch-table/restaurants/res_01J8Q9W3TE/availability" +
    "?date=2026-09-02&party_size=2",
  { headers },
);
const availability = await availabilityRes.json();
const slot = availability.slots[0];
// slot: { slot_id: "slt_1900_2", starts_at: "2026-09-02T19:00:00+09:00" }

// 2. Book the slot. The Idempotency-Key makes retrying this POST safe.
const created = await fetch(base + "/catch-table/reservations", {
  method: "POST",
  headers: {
    ...headers,
    "Content-Type": "application/json",
    "Idempotency-Key": "idem_b1f7c2d0",
  },
  body: JSON.stringify({
    restaurant_id: "res_01J8Q9W3TE",
    slot_id: slot.slot_id,
    party_size: 2,
    contact_name: "Han Jiwoo",
    note: "Window seat if possible.",
  }),
});

console.log(created.status); 
console.log( created.json());

On success the gateway answers 201 with the reservation body.

201 response
{
  "id": "rsv_01J8QDGT2K",
  "status": "confirmed",
  "restaurant_id": "res_01J8Q9W3TE",
  "starts_at": "2026-09-02T19:00:00+09:00",
  "party_size": 2
}

The status is confirmed because this venue confirms instantly. Venues that approve manually start at pending, and the moment they confirm, a reservation.confirmed event arrives as a . Prefer that subscription over polling .

If someone takes the slot between the two calls, the gateway answers 409 with code conflict in the standard . Re-read availability and try another slot.

What happened behind the scenes

Your key never touched Catch Table. The gateway resolved the catch-table path segment, checked the key's scopes, performed the booking with the venue credential APIFuse holds, and normalised the answer into the schemas above. Service failures come back the same way: a 502 with provider_unavailable lands in the same envelope with retryable: true, so your client knows a backoff can succeed.

Where to go next

  • Narrow the key with before you think about production.
  • Subscribe to state changes with the and verify every payload with .
  • Design your failure handling around the and the .
  • Browse every API in the , and the other services in the .
// 201
await
Get availability
Create reservation
webhook
Get reservation
error envelope
retry
scopes
webhooks overview
signatures
error model
retry rules
Catch Table reference
service catalog