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

Errors

Error model

Service outages and gateway errors normalise into one error model.

A failed call comes back in the same JSON body no matter where it failed. A cancellation that Catch Table refuses and a rate limit raised by the gateway share one structure, so you write error handling once and reuse it across every service in the catalog.

The envelope

The body of every non-2xx response looks like this. provider and retryable are optional; the other three fields are always present.

The error envelope
{
  "error": {
    "code": "provider_unavailable",
    "message": "Catch Table did not answer within the gateway deadline.",
    "request_id": "req_01J8QGX2M4",
    "provider": "catch-table",
    "retryable": true
  }
}
  • code: a stable identifier your code can branch on. One of the eight values in the table below.
  • message: a human readable explanation. Never parse it.
  • request_id: the identifier of this request. Quote it when contacting support.
  • provider: present only when the error originates from the underlying service.
  • retryable: true when retrying the same request with backoff can succeed.

Status to code mapping

The HTTP status puts an error into a broad class; code names the exact case. The mapping is fixed.

HTTPcodeMeaningRetry
400invalid_requestThe request failed schema validation.No
401unauthorizedThe managed key is missing or invalid.No
403scope_deniedThe key's scopes do not allow this service or API.No
404not_foundThe resource in the path does not exist.No
409conflictThe request conflicts with the current state of the resource, for example a slot that has been taken.No
422provider_rejectedThe service's own policy refused the request.No
429rate_limitedThe request went over the rate limit. A Retry-After header accompanies it.Yes
502provider_unavailableThe underlying service did not answer.Yes
The code list is stable. New codes are announced in the first, and they always arrive under an existing status.

Service errors and gateway errors

The provider field tells you where the error came from. When it is present, the request made it through the gateway and was refused or failed on the service side. Errors that end at the gateway, such as 401, 403 and 429, carry no provider field. Conversely, 422 provider_rejected and 502 provider_unavailable always originate at the service, so the field is always set on them.

The distinction decides your response. Gateway errors are fixed by fixing the request itself: the key, the scope, the schema. Service errors reflect state on the service's side, such as a cancellation policy, slot inventory or availability, so changing the request often changes nothing.

request_id and support

Every error carries a request_id. Gateway logs and the service call trail are joined on this one identifier, so quoting it in a support request lets APIFuse trace the failure without a reproduction. Log code together with request_id for any error you did not expect.

Reproducing a 422

Calling on a reservation whose venue cancellation window has closed returns a 422. If you do not have a sandbox key yet, the walks through issuing one.

Cancelling past the cancellation window
curl -X DELETE "https://api.frism.dev/v1/catch-table/reservations/rsv_01J8QDGT2K" \
  -H "Authorization: Bearer frism_test_k3xample"
422 provider_rejected
{
  "error": {
    "code": "provider_rejected",
    "message": "The venue's cancellation window has closed.",
    "request_id": "req_01J8QH54N8",
    "provider": "catch-table",
    "retryable": false
  }
}

Branch on code, never on message

Always branch on code. The message exists to be shown to a human or written to a log, and its wording can change without notice. Avoid branching on the status alone as well: the status only names the class, and a more specific code can be added under the same status later.

Branching on code
const response = await fetch(
  "https://api.frism.dev/v1/catch-table/reservations/rsv_01J8QDGT2K",
  {
    method: "DELETE",
    headers: { Authorization: "Bearer frism_test_k3xample" },
  },
);

if (!response.ok) {
  const { error } = (await response.json()) as {
    error: {
      code: string;
      message: string;
      request_id: string;
      provider?: string;
      retryable?: boolean;
    };
  };

  switch (error.code) {
    case "provider_rejected":
      // Policy refusal: tell the user instead of retrying.
      break;
    case "rate_limited":
    case "provider_unavailable":
      // Retry with backoff.
      break;
    default:
      // Log unexpected codes together with the request_id.
      console.error(error.code, error.request_id);
  }
}

Which errors are worth retrying, and how to back off, is covered in the . The full error responses for each API live in that service's API reference, for example .

changelog
Cancel reservation
quickstart
retries guide
Catch Table