Skip to content

External APIs & Services — Index ​

Status: Reference

Status: Active

This index lists every third-party service TwoMore integrates with. Each entry links to a dedicated guide covering credentials, quotas, cost, error handling, and hex-arch wiring.


Services ​

ServiceRoleStatusGuide
SupabaseBackend (DB, Auth, Storage, Realtime)Activeapi-supabase.md
Authentication (Kakao, Google, Apple)OAuth via Supabase AuthActiveauthentication.md
Naver Local Search (API Hub)Venue identity — discovery + private-court ingestActiveapi-naver-search.md
Kakao LocalVenue identity + phone (ingest corroboration)Activeuses KAKAO_REST_API_KEY · dapi.kakao.com/v2/local
Naver MapsDeep links to map appActiveapi-naver-maps.md
Expo Push NotificationsMember/event alertsActiveapi-expo-notifications.md
SentryCrash reporting + sourcemap symbolicationActivecredentials.md

Environment variables ​

All credentials live in .env.local (gitignored). Never commit this file. Copy .env.example to .env.local and fill in values from each service's console.

For the complete variable reference — including EAS visibility levels, build-time vs runtime distinction, and rotation procedures — see credentials.md.


Adding a new external service ​

  1. Port → src/ports/services/{name}.service.port.ts — TypeScript interface only, zero framework imports
  2. Adapter → packages/app/src/adapters/{vendor}/{name}.{vendor}.ts — reads credentials from process.env
  3. Registry → add to Registry interface + wire in registry.ts
  4. Env vars → add to .env.local.example and document in the service's guide
  5. Docs → create docs/guides/api-{name}.md and add a row to this index
  6. Tests → use inline jest.fn() / port-shaped stubs in the test file; never recreate a mock adapter directory (test data is seeded in Supabase via supabase/seed.sql)

Cross-cutting rules ​

Failing gracefully ​

All external calls must return safe defaults on error — never throw to the UI layer.

typescript
try {
  return await externalService.call();
} catch (err) {
  console.error('[ServiceName] failed:', err);
  return []; // or null / empty object
}

Rate limit defence ​

LayerMechanism
UI inputs400ms debounce before triggering calls
AdapterReturn [] on 429/503, never re-throw
TanStack QuerystaleTime prevents redundant background refetches
Mock modeZero real API calls during development

Korean error messages ​

Never surface raw API error strings. All user-visible errors go through src/config/i18n/ko.ts.

Markdown remains the source of truth. Run yarn docs:check before handoff.