Guide

유지보수 가이드 + API 문서

리셀솔루션은 주문관리, 주문수집, 송장수집, 상품소싱, 가격/핫딜 추적을 한 화면과 한 API 계약 안에서 운영할 수 있게 만든 운영 도구입니다. 유지보수의 핵심은 화면, 확장프로그램, API, 도메인 로직, 저장소가 어떤 순서로 연결되는지 빠르게 파악하고, 응답 본문만 보고도 정상/오류 여부를 분리하는 것입니다.

접근 안내 가이드 페이지는 브라우저에서 바로 열 수 있습니다.
참고 JSON 인벤토리 원본 API는 인증이 필요합니다.

프로그램 목적

리셀솔루션은 주문관리, 주문수집, 송장수집, 상품소싱, 가격/핫딜 추적을 한 화면과 한 API 계약 안에서 운영할 수 있게 만든 운영 도구입니다. 유지보수의 핵심은 화면, 확장프로그램, API, 도메인 로직, 저장소가 어떤 순서로 연결되는지 빠르게 파악하고, 응답 본문만 보고도 정상/오류 여부를 분리하는 것입니다.

유지보수에서 가장 중요한 구분은 아래 3가지입니다.
1. UI / 확장 문제: 클릭, 렌더, 자동입력, 배지, 팝업 상태 불일치
2. 앱 API 문제: JSON 응답은 오지만 값 구조/권한/검증/업무 로직이 어긋난 경우
3. 인프라 문제: Cloudflare 502/503, HTML 에러 페이지, 재기동 중 연결 실패

기능별 목적

주문관리
주문 시트 편집, 등록상품 매칭, 마진 계산, 블랙리스트 확인, 플레이오토/엑셀 연동의 중심 화면입니다.
/api/orders/rows /api/orders/unordered /api/notifications
주문수집
마켓 API 계정으로 국내외 주문을 수집하고 상태/메모/정산 정보를 갱신합니다.
/api/collection/list /api/collection/collect-sync /api/collection/inquiries
주문 자동입력 / 확장
브라우저 확장이 주문자 정보, 송장정보, 셀렉터 워크플로우를 읽고 쓰는 자동화 경로입니다.
/api/invoices/unentered /api/selector-workflows/user /api/extension/version
상품소싱
리서치 가격표, 가격 이력, 마진계산기를 사용자별 워크스페이스로 저장하고 비교합니다.
/api/sourcing/workspace /api/registered-products /api/prices/*
운영 / 관리자
팀, 구독, 알림, 블랙리스트, 가이드, 사용자 관리 등 운영 상태를 관리합니다.
/api/team/* /api/subscribe/status /api/notifications /api/blacklist

Commercial Maintenance Checklist

Every solution and every feature change must satisfy these guide/API documentation requirements before code changes are treated as complete.

guide-first
Main page
  • program purpose
  • maintenance/code modification rules
  • workflow tree
  • folder/file tree
  • feature tree
  • 4-layer architecture
  • change history
Feature page
  • feature purpose
  • user-facing surface
  • frontend/backend/service/DB/extension layers
  • CSS/layout/buttons/modals involved
  • API endpoints used
  • normal 200 business body
  • 200 but abnormal examples
  • stable error codes
  • tests and verification command
API endpoint
  • method and path
  • auth requirement
  • request fields if applicable
  • normal root type
  • required business fields
  • semantic success rule
  • abnormal 200 rule
  • error.code list
  • whether response alone can identify the cause
API endpoint contract rules
  • HTTP 200 is only transport success. The body must contain the documented business fields to be normal.
  • A 200 response containing only detail/message/error without business fields is abnormal unless that exact shape is documented.
  • Every app error must include error.code, error.status, and error.type so the operator can classify the cause from the response.
  • HTML/Cloudflare/Nginx response is infra/proxy failure, not an application API response.
  • Guide API test buttons must validate required fields, not just HTTP status.

Feature Contract Matrix

Use this table before editing a feature. It links purpose, layers, buttons/layout, normal 200 bodies, abnormal 200 cases, and verification.

Feature Purpose Layers Buttons / layout Normal 200 Abnormal 200 Tests
Auth / Security Baseline Keep login, token validation, CORS, rate-limit, and invoice validation secure without breaking existing users or extension workflows. base.html/login.html/localStorage token -> auth.py/dependencies.auth -> users table; utils.py -> invoice_validator.py -> order_rows JSONB login form, Google login redirect, authenticated API calls, guide API test buttons /api/auth/login returns token and user; /api/auth/me returns identity/workspace fields; /api/invoice/validate returns valid/errors scoped to current user. login 200 without token/user, invoice validation checking another user's tracking number, or CORS allowing arbitrary credentialed origins. test_security_remediation_guardrails.py, test_error_handlers.py, test_guide_page_guardrails.py
Order Management Review/import/edit order rows, match registered products, calculate margin, show blacklist signals, export invoices, and feed extension order input. orders.html -> order_rows.py/orders.py -> order row services -> order_rows JSONB + extension/order-injector.js row add/delete, file import, export, release-stop lookup, column settings, spreadsheet table /api/orders/rows returns total, total_unregistered, rows[].id, rows[].row_index, rows[].data. rows missing, data not object, total_unregistered scoped incorrectly, patch says success but reload loses value. test_order_sheet_guardrails.py, test_orders_page_patch_guardrails.py, test_order_queue_guardrails.py
Extension Order Input Show available order-input data on every page when order data exists and run selector workflows without relying on market page recognition for visibility. orders.html queue bridge -> /api/orders/unordered -> order_rows data -> extension/content/order-injector.js RS floating button, order count button, order list panel, selector workflow actions /api/orders/unordered returns an array; non-empty items are sanitized to the order-input contract only: market/id/row_index/ordered_at/recipient_name/recipient_phone/recipient_address_full/delivery_memo/product_name. newly added rows missing, item lacks recipient data, empty array while valid pending rows exist, or invoice/settlement/tracking columns appear in the extension auto-input payload. test_order_queue_guardrails.py and manual extension queue check after adding a row.
Invoice Collection And Entry Collect tracking numbers from buy markets, persist carrier/tracking values, and feed seller-site invoice entry. orders.html -> invoices.py/orders.py -> order_sheet_columns/order_row_records -> extension rs-relay/order-injector invoice collect button, PlayAuto invoice export, extension invoice entry flow /api/invoices/uncollected includes buy_market_code/buy_order_number; /api/invoices/unentered includes sell_order_number/sell_market/tracking_number mapped from 주문송장번호. carrier contains order number, tracking_number contains carrier or the PlayAuto 송장번호 column, saved count reports found count instead of DB saved count. test_order_sheet_guardrails.py, invoice collector guardrails.
Product Sourcing Store per-user research rows, price history, platform prices, and margin calculator rows with automatic research-to-margin synchronization. margin_calculator.html -> sourcing.py -> sourcing_workspaces JSONB research/margin tabs, column settings, add row, clear row, price history modal, graph modal, Excel export /api/sourcing/workspace returns research_rows, research_column_settings, margin_rows, updated_at. updated_at missing, arrays missing, save 200 but price history lost, stale tab overwrites newer data. test_sourcing_page_guardrails.py, test_guide_page_guardrails.py.
Blacklist Reports Let users or the extension submit suspicious buyer/order information and let admins approve or delete pending reports. orders/extension report UI -> blacklist.py/notifications.py -> blacklist/report records report, approve, delete, admin notification bell/list /api/blacklist/report returns ok/id/status=pending; pending list returns only pending reports for admins. report saved but no admin notification/list entry, approved/deleted reports remain pending, non-admin can review. blacklist approval/list tests before commercialization freeze.
Best Products Collect ranking products by market and display usable product cards for sourcing/tracking. best_products.html -> best_products.py -> collectors/image extraction -> best product records market tabs, filters, add tracking /api/best-products returns market/rank/title/price/product_url/thumbnail_url; collect returns saved_count by market. event banner/rocket delivery image stored as product thumbnail, saved_count missing, title/price/url missing. collector fixture tests for Auction and Coupang thumbnails.

Feature Change History

Any change that modifies behavior, API body, storage keys, buttons, layout, or extension event handling must be recorded here or in the matching feature document.

2026-05-21 - Subscription pricing and approval policy
Commercial pricing was fixed before beta-to-paid conversion: STANDARD is active, PRO is disabled until price tracking is released, and paid orders require admin approval before service rights are applied.
4 files
STANDARD regular price is exactly 2x the student price. Student info (format: generation_name) wins over referral code. Referral code applies 10% discount to regular price only when student info is empty. Team-member add-on is 50% of the selected subscription price. Toss success stores paid_pending_approval; only POST /api/subscribe/admin/payments/{payment_id}/approve applies subscription, team seat, or market slot rights.
python -m pytest server/tests/test_subscribe_market_slot_guardrails.py server/tests/test_admin_users_plan_guardrails.py server/tests/test_guide_page_guardrails.py -q
2026-05-21 - Subscription admin grant and paid service periods
Separate admin free-day grants from actual paid subscription periods so operators can see final expiry, free grant expiry, and paid service expiry independently.
6 files
Admin user management uses 구독 만료일 for final expires_at and a separate 무료기간(일) input for admin_grant_days/admin_grant_expires_at. /api/subscribe/status returns expires_at, paid_expires_at, admin_grant_days, and admin_grant_expires_at. Payment history rows include service_start_at/service_expires_at when a paid subscription is confirmed.
python -m pytest server/tests/test_admin_users_plan_guardrails.py server/tests/test_subscribe_market_slot_guardrails.py -q
2026-05-19 - Extension order-input workflow
Prevent repeat of runtime ReferenceError caused by order-input execution referencing address-detail helpers declared only inside the floating-button UI IIFE.
4 files
Order input selector execution always uses admin default workflow from /api/selector-workflows/default. The only per-user order-input setting is the address_detail DB value mode. Address popup click fields must use extension relay click because native el.click() can return success without opening market popups. Dynamic pageMatch paths such as /order/purchase/{id} and Today House /orders/{id}/checkout must be normalized before save and execution.
node --check extension/content/order-injector.js && python -m pytest server/tests/test_order_injector_shortcuts_guardrails.py server/tests/test_order_injector_click_guardrails.py server/tests/test_order_queue_guardrails.py -q
2026-05-19 - Auth and invoice validation hardening
Commercialization security pass: remove wildcard CORS, standardize 429 rate-limit errors, migrate password hashing to bcrypt while keeping legacy SHA-256 login compatibility, and scope invoice validation to the authenticated user.
7 files
Login still returns token/user on success; repeated failed logins return error.code=RATE_LIMITED with HTTP 429; /api/invoice/validate requires auth and checks duplicates only in the current user's order rows using 주문송장번호 first, then 송장번호2/송장번호 fallback.
python -m pytest server/tests/test_error_handlers.py server/tests/test_security_remediation_guardrails.py server/tests/test_guide_page_guardrails.py server/tests/test_order_sheet_guardrails.py server/tests/test_order_queue_guardrails.py server/tests/test_orders_page_guardrails.py -q
2026-05-18 - Chrome extension RS floating button
Right-click opened the browser default context menu instead of the RS product menu.
3 files
Right-click on the visible RS button opens the RS menu and does not touch order-input queue/API behavior.
node --check extension/content/order-injector.js && python -m pytest server/tests/test_order_injector_shortcuts_guardrails.py server/tests/test_order_queue_guardrails.py -q
2026-05-18 - Extension download/version
Publish the fixed extension package through the dashboard download link.
2 files
GET /api/extension/version returns the current manifest version and a download_url for rs-extension-v{version}.zip.
GET /api/extension/version must include version and download_url.
2026-05-19 - Extension order-input queue
Old local queues could preserve full order row data and let invoice/settlement columns leak into the auto-input payload.
3 files
order-injector normalizeQueueOrder must return only market, id, row_index, ordered_at, recipient_name, recipient_phone, recipient_address_full, delivery_memo, and product_name.
node --check extension/content/order-injector.js and confirm stale queue entries are sanitized before rs_auto_input is saved.

기본 유지보수 룰

모든 수정/기능추가는 이 기준을 기본값으로 적용합니다.

API 계약 JSON
문서 우선 수정 원칙
기능을 수정하거나 추가하기 전 `/guide`, `docs/maintenance-api-guide-standard.md`, 관련 기능 문서를 먼저 확인한다.
변경 이력 기록
기능 목적, 요구사항, API 응답 계약, 오류코드가 바뀌면 변경일과 변경 이유를 문서에 같이 남긴다.
200 OK 의미 검증
HTTP 200만 정상으로 보지 않는다. 응답 본문이 기능별 필수 필드와 업무 의미를 만족해야 정상이다.
안정 오류코드
오류는 사람이 읽는 문구와 별도로 `error.code`로 원인 분류가 가능해야 한다.
레이어 정합성
프론트엔드, API, 서비스 로직, DB, 확장프로그램 중 하나를 바꾸면 연결된 레이어의 입력/출력 계약을 같이 검증한다.
테스트 버튼 기준
API 테스트 버튼은 상태코드와 함께 정상 필드, 저장 결과, 권한 범위, 오류코드를 판정해야 한다.
Guide-first change rule
Before changing code, identify the matching feature guide section, API contract, affected layers, normal 200 body, abnormal 200 cases, and required tests. If any item is missing, update the guide first.
Feature change history rule
Every feature contract change must record date, reason, changed files/layers, API response impact, and verification command. This prevents repeated regressions such as extension FAB right-click vs order input coupling.
Extension order-input scope rule
Helpers used by order-injector runAutoStep/getSelectors must live in top-level content-script scope. Floating-button UI IIFE helpers are UI-only and must not be referenced by order-input execution.
외부 API 기술서에서 참고한 원칙
천조직구_머니업로더_주문수신_API_기술서_v1.0.0.xlsx
API별 고정 `api_code`를 둬서 어떤 업무 요청인지 응답만 보고 추적 가능하게 한다.
정상 업무 응답은 `result_code = 0000`처럼 안정적인 성공 값을 둔다.
실패는 인증, 데이터 오류, API 코드 오류, 시스템 오류처럼 코드만 보고 1차 원인을 분류한다.
요청 필드마다 필수 여부, 타입, 길이, 의미를 표로 분리한다.
샘플 요청/응답을 기능별 문서 안에 함께 둔다.
리셀솔루션 내부 API는 기존 HTTP 상태코드를 유지하되, 앱 오류는 `error.code`와 기능별 정상 필드 판정 규칙을 반드시 문서화한다.

전체 워크플로우

주문 운영
주문수집 -> 주문관리 시트 저장 -> 등록상품 매칭 -> 마진/정산 계산 -> 송장수집 -> 송장 자동입력/내보내기
확장 자동입력
서버 API 큐 조회 -> 크롬 확장 실행 -> 마켓 페이지 입력 -> 결과 브리지 이벤트 -> 주문관리 재조회
상품소싱
리서치 가격 입력 -> 가격이력 저장 -> 최저가/상품명 동기화 -> 마진계산기 계산 -> 엑셀 내보내기
관리자 운영
사용자/팀 권한 설정 -> 구독/마켓 슬롯 확인 -> 블랙리스트 제보 검토 -> 공통 셀렉터/워크플로우 관리

폴더 / 파일 트리

server/app/templates/pages/*.html
화면 레이아웃, 버튼, 모달, 테이블, 브라우저 JS 이벤트를 담당한다.
server/app/routers/*.py
FastAPI 엔드포인트, 인증/권한, 입력 검증, 응답 계약을 담당한다.
server/app/services/*.py
도메인 계산, 외부 API 연동, 시트/주문/소싱 저장 로직을 담당한다.
server/app/models.py
DB 테이블과 JSONB 저장 구조를 정의한다.
extension/content/*.js, extension/popup/*.js
크롬 확장 자동입력, 송장수집, 셀렉터 선택, 버전 알림을 담당한다.
docs/*.md
운영 원칙, API 응답 계약, 기능별 요구사항, 회귀 방지 계획을 저장한다.
server/tests/*.py
응답 계약, 시트 저장 가드레일, 확장 연동 정합성을 고정한다.

기능 트리

주문관리
Frontend: server/app/templates/pages/orders.html
Backend: server/app/routers/order_rows.py, server/app/services/order_sheet.py
DB: order_sheet_cells, order_sheet_rows, order_rows
Buttons: 행 추가, 행 삭제, 파일 가져오기, 내보내기, 출고중지조회, 컬럼
`/api/orders/rows`는 total, total_unregistered, rows[].data를 반환해야 한다.
송장수집/송장입력
Frontend: orders.html, extension/content/*
Backend: server/app/routers/invoices.py, server/app/services/order_sheet_columns.py
DB: order_sheet_cells 숫자 열키 snapshot
Buttons: 송장수집, 플레이오토 송장 양식 내보내기
`/api/invoices/uncollected`와 `/api/invoices/unentered`는 마켓, 주문번호, 택배사, 송장번호 의미가 뒤바뀌면 안 된다.
상품소싱
Frontend: server/app/templates/pages/margin_calculator.html
Backend: server/app/routers/sourcing.py
DB: sourcing_workspaces
Buttons: 리서치/마진계산기 탭, 컬럼설정, 가격이력, 그래프, 엑셀 내보내기
`/api/sourcing/workspace`는 research_rows, margin_rows, research_column_settings, updated_at을 반환해야 한다.
구독/마켓 슬롯
Frontend: settings.html, subscribe.html, extension floating buttons
Backend: server/app/routers/subscribe.py
DB: subscription/market slot settings
Buttons: 사용마켓 저장, 추가 슬롯 구매
`/api/subscribe/status`는 base_limit, purchased_slots, total_limit, admin_bypass와 구독 기간 구분용 expires_at/paid_expires_at/admin_grant_expires_at을 반환해야 한다.
블랙리스트 제보
Frontend: orders.html, extension content report UI, admin notification/list
Backend: server/app/routers/blacklist.py, server/app/routers/notifications.py
DB: blacklist entries/reports
Buttons: 제보, 승인, 삭제
제보는 pending 상태로 관리자 알림과 검토 목록에 보여야 하며, 승인 후에만 차단 판단에 사용한다.

기능별 4레이어 연동 구성

1. UI / 확장
Jinja HTML, 브라우저 JS, 크롬 확장이 사용자 입력과 화면 상태를 담당합니다.
orders.html, margin_calculator.html, extension/content/*, extension/popup/*
2. API 라우터
FastAPI 라우터가 인증, 입력 검증, 응답 계약을 담당합니다.
server/app/routers/*.py, /api/*
3. 도메인 서비스
매칭, 계산, 수집, 워크플로우, 팀/구독 정책 같은 업무 로직을 담당합니다.
server/app/services/*
4. 저장소 / 외부 연동
PostgreSQL(JSONB 포함), 마켓 API, 확장 권한, Cloudflare/Nginx 프록시가 실제 저장과 외부 통신을 담당합니다.
order_rows.data, sourcing_workspaces, market APIs, Cloudflare 502

문서/오류코드 보정 계획

현재 코드에서 목적, 요구사항, 응답결과, 오류코드가 부족한 항목은 이 순서로 보정합니다.

상용화 전 게이트
FIELD_TO_COLUMN_KEY 의미 정합성 검증
server/app/services/order_sheet_columns.py, server/tests/test_order_sheet_guardrails.py
P0
송장수집 API는 200이어도 열키가 틀리면 택배사/송장번호/주문번호 의미가 뒤바뀐다.
ORDER_COLUMNS 인덱스와 FIELD_TO_COLUMN_NAME이 일치하는 invariant 테스트를 추가하고, 프로덕션 변환 경로 기준으로 검증한다.
기능별 200 의미 계약 보강
server/app/services/api_guide.py, docs/API_200_OK_RESPONSE_REPORT.md
P0
현재 자동 인벤토리만으로는 일부 API의 정상 필드와 업무 성공값이 부족하다.
핵심 기능별 required fields, abnormal 200, error codes를 명시적으로 작성한다.
오류코드 미지정 라우터 전수 보정
server/app/routers/*.py, server/app/errors.py
P1
일부 HTTPException은 detail 문구만 있어 응답값만 보고 원인 분류가 어렵다.
사용자 입력, 권한, 외부 API, 데이터 없음, 충돌, 내부 오류별 stable error.code를 적용한다.
API 테스트 버튼 판정기
server/app/templates/pages/guide.html, server/app/routers/guide_api.py
P1
운영자가 테스트 버튼 결과만 보고 정상/오류를 판단하려면 상태코드 외 본문 의미 검증이 필요하다.
읽기 전용/안전 API부터 테스트 버튼을 붙이고, 기능별 semantic validator 결과를 표시한다.
기능별 상세 문서 확장
docs/features/*.md 또는 guide 확장 섹션
P2
현재 목적/레이어/API는 요약 수준이고, CSS/레이아웃/버튼/DB 필드까지는 부족하다.
주문관리, 송장수집, 상품소싱, 구독, 블랙리스트, 베스트상품 순서로 문서를 분리한다.

베타 테스트용 기능 단위 E2E 체크리스트

상용화 전 실제 운영자가 따라야 하는 API/화면 점검 순서입니다. 각 단계는 200 응답만 보는 것이 아니라 200 안의 필드까지 확인해야 합니다.

HTML/Cloudflare 응답이면 앱 로직이 아니라 인프라 문제입니다.
200이어도 핵심 필드가 빠지면 계약 위반으로 봅니다.
인증 / 기본 접속
/login, /guide, /api/auth/me, /api/health
2 steps
로그인 후 보호 페이지 접근, 가이드 접근, 헬스체크가 정상 동작하는지 확인합니다.
1. 로그인 요청 후 토큰 발급 확인
/api/auth/login /api/auth/me
정상 기준
200 object, token/user 존재, /api/auth/me 200 object
오류 해석
401/403이면 토큰 문제, 422면 입력 형식 오류, 500이면 서버 내부 오류
2. 앱 헬스체크 확인
/api/health
정상 기준
200 object, {"status":"ok"}
오류 해석
HTML/502면 인프라 오류, JSON이지만 status!=ok면 앱 장애
주문관리 로드 / 저장
/orders, /api/orders/rows
2 steps
주문관리 시트가 로드되고, 셀 편집/패치 저장이 정상 저장되는지 확인합니다.
1. 주문 목록과 미등록 수 집계 확인
/api/orders/rows
정상 기준
200 object, {"total":N,"total_unregistered":N,"rows":[...]}
오류 해석
rows가 배열이 아니면 계약 위반, total만 있고 rows가 없으면 화면 렌더 실패 가능
2. 한 셀 수정 후 PATCH 저장 확인
/api/orders/rows/{row_id}/patch
정상 기준
200 object, {"ok":true,...} 또는 저장 후 재조회 값 반영
오류 해석
400은 허용되지 않은 컬럼/입력, 409는 충돌, 500은 서버 로직 오류
주문자 자동입력 / 송장 자동입력
확장 + /api/orders/unordered + /api/invoices/unentered
2 steps
확장이 주문자/송장 큐를 읽고 화면에 반영하는지 확인합니다.
1. 주문자 큐 조회
/api/orders/unordered
정상 기준
[{"ordered_at":"...","market":"...","recipient_name":"..."}]
오류 해석
빈 배열은 실제 0건 또는 필터 불일치 가능, market/recipient_name 누락은 계약 위반
2. 송장 미입력 큐 조회
/api/invoices/unentered
정상 기준
[{"sell_order_number":"...","sell_market":"...","tracking_number":"..."}]
오류 해석
sell_order_number/sell_market 누락은 확장 자동입력 즉시 실패 원인
상품소싱 저장 / 충돌
/sourcing, /api/sourcing/workspace
2 steps
상품소싱 자동저장과 다중 탭 충돌 감지가 정상인지 확인합니다.
1. 워크스페이스 로드
/api/sourcing/workspace
정상 기준
200 object, research_rows/research_column_settings/margin_rows/updated_at 존재
오류 해석
updated_at 누락은 충돌 방지 불가, rows 구조 불일치는 UI 렌더 실패
2. 다른 탭에서 먼저 저장한 뒤 기존 탭 저장
/api/sourcing/workspace
정상 기준
409 conflict + 구조화된 JSON error
오류 해석
200으로 덮어쓰면 충돌 방지 실패, HTML 오류면 인프라 오류
구독 / 사용마켓 / 확장 버전
/subscribe, 확장 팝업, /api/subscribe/status, /api/extension/version
2 steps
사용마켓 한도와 확장 업데이트 경고가 같은 기준으로 동작하는지 확인합니다.
1. 사용마켓 한도 응답 확인
/api/subscribe/status
정상 기준
200 object, market_slots.base_limit/purchased_slots/total_limit/admin_bypass 및 expires_at/paid_expires_at/admin_grant_expires_at 존재
오류 해석
필드 누락 시 팝업/확장/팀원 한도 표시 불일치 가능
2. 확장 최신 버전 비교
/api/extension/version
정상 기준
200 object, version/download_url 존재
오류 해석
버전 정보 누락 시 팝업/배지/RS 버튼 UP 경고가 동작 불가

API 응답 계약 규칙

응답 본문만 보고도 앱 오류인지, 인프라 오류인지, 정상 200 계약 불일치인지 구분하는 기준입니다.

JSON 인벤토리 보기
정상 200 응답
  • 200이어도 최상위 타입(object/array/file)과 문서가 다르면 계약 위반 가능성이 큽니다.
  • 200인데 detail/error만 있고 도메인 필드가 없으면 정상 응답이 아니라 잘못된 계약입니다.
  • 파일 API는 JSON이 아니라 다운로드 스트림이어야 정상입니다.
앱이 직접 반환한 API 오류
{
  "detail": "human readable message",
  "error": {
    "code": "STABLE_ERROR_CODE",
    "message": "human readable message",
    "status": 400,
    "type": "app_error"
  },
  "errors": [
    {
      "loc": [
        "body",
        "field"
      ],
      "msg": "...",
      "type": "..."
    }
  ],
  "message": "same as detail",
  "ok": false
}
  • status가 200이 아니고 Content-Type이 application/json이면 앱이 직접 반환한 API 오류입니다.
  • error.code, error.status, error.type만으로 1차 분류가 가능해야 합니다.
  • detail/message는 화면에 바로 보여줄 운영자 문구입니다.
  • errors 배열이 있으면 validation/field 오류입니다.
인프라 / 프록시 오류
HTML 또는 Cloudflare/Nginx 에러 페이지
  • 응답이 HTML이고 <!DOCTYPE html>, cloudflare, bad gateway 문구가 있으면 인프라/프록시 오류입니다.
  • 이 경우 FastAPI 라우터까지 도달하지 못한 것이므로 app-level error.code를 기대하면 안 됩니다.
공통 오류 코드
AUTH_REQUIRED
Authorization 헤더 또는 로그인 토큰이 없습니다.
AUTH_INVALID
토큰이 만료되었거나 검증에 실패했습니다.
FORBIDDEN
로그인은 되었지만 해당 기능을 사용할 권한이 없습니다.
INVALID_INPUT
요청 형식은 맞지만 비즈니스 입력값이 유효하지 않습니다.
INVALID_DATE_FIELD
허용되지 않은 날짜 필터 필드입니다.
INVALID_PATCH_COLUMNS
PATCH 요청에 수정할 수 없는 컬럼이 포함되었습니다.
VALIDATION_ERROR
필수값 누락 또는 타입 검증 실패입니다.
NOT_FOUND
요청한 리소스를 찾을 수 없습니다.
CONFLICT
동시 수정 또는 중복 상태 충돌입니다.
UPSTREAM_ERROR
외부 API 또는 upstream 호출 실패입니다.
INTERNAL_ERROR
앱 내부 예외입니다.
SERVICE_UNAVAILABLE
서버 재기동 또는 일시 장애입니다.
RATE_LIMITED
Too many repeated requests, currently used for repeated failed login attempts. Retry after the rate-limit window.
응답만으로 원인 판별 가능한가?
yes
응답 본문만으로 정상/오류 원인을 비교적 명확하게 판별 가능
partial
1차 판별은 가능하지만, 필터/도메인 상태까지는 추가 문맥이 필요
no
응답만으로는 의미 판단이 어려워 서버 로그/화면 상태를 같이 봐야 함

읽기 전용 API 테스트

상태코드가 아니라 응답 본문의 필수값까지 검사합니다. 저장/삭제 API는 여기서 실행하지 않습니다.

API 전수 인벤토리

현재 서버에 등록된 모든 /api/* 라우트를 실시간 기준으로 정리한 목록입니다.

정상 200 형식, 오류 코드, 진단 가능 수준까지 같이 표시합니다.
CS 2 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
POST
/api/cs/chat 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/cs/feedback 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
가격 5 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
POST
/api/prices/collect Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/prices/{product_id}/compare Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/prices/{product_id}/history Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/prices/{product_id}/lowest Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/prices/{product_id}/stats Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
가격 알림 4 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/alerts Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/alerts Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/alerts/{alert_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/alerts/{alert_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
가이드 1 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/guide/inventory Bearer 필요
200 / object
application/json
{"contract_version":"...","endpoint_count":N,"groups":[...]}
현재 서버에 등록된 API 계약 인벤토리 원본입니다.
contract_version, endpoint_count, groups가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
groups 배열 누락, endpoint_count가 수치가 아님
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
관리자 3 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/admin/users Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
DELETE
/api/admin/users/{user_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PATCH
/api/admin/users/{user_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
구독 / 결제 8 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/subscribe/admin/market-slot-settings Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/subscribe/admin/market-slot-settings Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/subscribe/admin/payments/pending Bearer 필요
200 / array
application/json
[{"id":1,"user_id":1,"email":"...","plan_name":"STANDARD 1개월 - 수강생할인","amount":98000,"period_months":1,"discount_type":"student","student_info":"1기_홍길동","referral_code":null,"paid_at":"..."}]
관리자 전용 결제 승인 대기열입니다. 항목이 있으면 결제는 완료됐지만 권한은 아직 적용되지 않은 상태입니다. 빈 배열은 승인 대기 없음입니다.
배열 응답이면 정상입니다. 각 항목은 paid_pending_approval 상태의 결제이며 amount, plan_name, paid_at, discount_type을 포함해야 합니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
배열이 아니거나 승인 대기 항목에 id/plan_name/amount/paid_at이 없음
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/subscribe/admin/payments/{payment_id}/approve Bearer 필요
200 / object
application/json
{"ok":true,"id":1,"status":"paid","approved_at":"..."}
관리자 전용 결제 승인 실행 결과입니다. status가 paid가 되는 순간 구독, 팀원 추가, 마켓 추가 권한이 적용됩니다.
ok=true이고 status=paid이며 approved_at이 있으면 정상입니다. 이 응답 이후에만 실제 구독/추가옵션 권한이 적용됩니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INVALID_INPUT INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이지만 ok가 true가 아니거나 status가 paid가 아니거나 approved_at이 없음
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/subscribe/create-order Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/subscribe/status Bearer 필요
200 / object
application/json
{"active":true,"plan":"PRO","expires_at":"...","paid_expires_at":"...","admin_grant_expires_at":"...","market_slots":{"base_limit":6,"purchased_slots":0,"total_limit":6,"admin_bypass":false},...}
사용마켓 한도, 팀 공유 상태, 추가 슬롯 상태, 최종 구독 만료일, 결제분 만료일, 관리자 무료 제공 만료일을 확인하는 기준 응답입니다.
market_slots.base_limit/purchased_slots/total_limit/admin_bypass와 expires_at/paid_expires_at/admin_grant_expires_at 키가 모두 있으면 정상입니다.
AUTH_REQUIRED INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
market_slots 하위 필드 누락, paid_expires_at/admin_grant_expires_at 키 누락, 무료 제공 기간과 결제분 기간이 같은 값으로만 뭉쳐 반환됨
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/subscribe/toss/fail 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/subscribe/toss/success 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
등록상품 7 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/registered-products Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/registered-products Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/registered-products/bulk Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/registered-products/categories 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/registered-products/suggest Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
DELETE
/api/registered-products/{product_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/registered-products/{product_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
디버그 1 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
POST
/api/debug/parsing-fail 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
리포트 2 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/reports/monthly Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/reports/weekly Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
마켓 계정 4 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/market-accounts Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/market-accounts Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/market-accounts/{account_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/market-accounts/{account_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
마켓 목록 1 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/markets 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
모니터링 7 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
POST
/api/monitoring/collection-log Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/monitoring/collection-logs Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/monitoring/errors Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/monitoring/heartbeat 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/monitoring/heartbeat 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/monitoring/market-status Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/monitoring/success-rate Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
베스트상품 3 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/best-products 공개
200 / array
application/json
[{"market":"auction","rank":1,"title":"...","price":12345,"product_url":"...","thumbnail_url":"..."}]
베스트상품 화면 카드의 원본입니다. 제목, 가격, 마켓, 링크, 가능하면 실제 상품 썸네일이 있어야 합니다.
각 상품에 market/rank/title/price/product_url이 있고 썸네일이 placeholder로 오염되지 않으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
이벤트/배송 배너 이미지가 상품 썸네일로 저장되거나 title/price/market 누락
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/best-products/collect 공개
200 / object
application/json
{"ok":true,"saved_count":N,"markets":[...]}
수집 시도 수가 아니라 DB에 실제 저장된 상품 수를 보고해야 합니다.
실제 DB 저장 건수인 saved_count가 명확하면 정상입니다.
INVALID_INPUT UPSTREAM_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
crawler found count만 있고 실제 saved_count가 없거나 0인데 성공처럼 표시
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/best-products/trends 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
블랙리스트 7 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/blacklist Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/blacklist Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/blacklist/pending Bearer 필요
200 / array
application/json
[{"id":...,"status":"pending","reporter":...,"source":...}]
관리자가 승인/삭제할 블랙리스트 제보 목록입니다. 승인된 항목이 섞이면 안 됩니다.
pending 제보만 배열로 반환하고 승인/삭제된 항목이 없으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
승인/삭제 항목이 pending 목록에 섞이거나 reporter/source가 없음
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/blacklist/report Bearer 필요
200 / object
application/json
{"ok":true,"id":...,"status":"pending"}
크롬확장/화면에서 들어온 제보가 관리자 검토 대기 상태로 저장된 결과입니다.
ok/id/status가 있고 status가 pending이면 정상입니다.
AUTH_REQUIRED VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200인데 pending 저장 id가 없거나 관리자 알림/목록에 연결되지 않음
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/blacklist/{id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PATCH
/api/blacklist/{id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/blacklist/{id}/approve Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
상품 8 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/products Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/products Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/products/{product_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/products/{product_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/products/{product_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/products/{product_id}/markets Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/products/{product_id}/markets/{market_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/products/{product_id}/status Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
상품소싱 2 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/sourcing/workspace Bearer 필요
200 / object
application/json
{"research_rows":[...],"research_column_settings":[...],"margin_rows":[...],"updated_at":"..."}
상품소싱 사용자 워크스페이스 전체 원본입니다. updated_at은 충돌 방지 기준입니다.
research_rows, margin_rows, updated_at가 동시에 있으면 정상입니다.
AUTH_REQUIRED VALIDATION_ERROR CONFLICT INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
updated_at 누락, research_rows/margin_rows가 배열이 아님
부분 가능
updated_at, research_rows 구조는 확인 가능하지만 다중 탭 충돌의 사용자 의도까지는 응답만으로 알 수 없습니다.
PUT
/api/sourcing/workspace Bearer 필요
200 / object
application/json
{"research_rows":[...],"research_column_settings":[...],"margin_rows":[...],"updated_at":"..."}
상품소싱 사용자 워크스페이스 전체 원본입니다. updated_at은 충돌 방지 기준입니다.
research_rows, margin_rows, updated_at가 동시에 있으면 정상입니다.
AUTH_REQUIRED VALIDATION_ERROR CONFLICT INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
updated_at 누락, research_rows/margin_rows가 배열이 아님
부분 가능
updated_at, research_rows 구조는 확인 가능하지만 다중 탭 충돌의 사용자 의도까지는 응답만으로 알 수 없습니다.
셀렉터 13 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/selectors 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/selectors/admin/promote-to-defaults Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/selectors/admin/workflow-default Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/selectors/backups Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/selectors/backups/{backup_id}/restore Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/selectors/defaults 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/selectors/effective Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/selectors/overrides Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/selectors/overrides Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/selectors/overrides/scope Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/selectors/workflow-default 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/selectors/workflow-defaults 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/selectors/{market_code} 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
셀렉터 워크플로우 4 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
PUT
/api/selector-workflows/admin/default Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/selector-workflows/default 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/selector-workflows/user Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/selector-workflows/user Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
송장 5 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
POST
/api/invoices/collect Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/invoices/uncollected Bearer 필요
200 / array
application/json
[{"id":...,"buy_market_code":"...","buy_order_number":"...","carrier":null,"tracking_number":null}]
송장수집 대상 큐입니다. 결제플랫폼과 주문번호는 마켓 조회에 쓰이고 택배사/송장번호는 아직 비어 있어야 합니다.
배열 각 항목에 buy_market_code, buy_order_number가 있고 수집 전 택배사/주문송장번호 의미가 보존되면 정상입니다.
AUTH_REQUIRED INVALID_INPUT INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
buy_market_code/buy_order_number 누락, 택배사와 송장번호 값 의미 뒤바뀜, 이미 수집된 행 포함
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/invoices/unentered Bearer 필요
200 / array
application/json
[{"id":...,"sell_order_number":"...","sell_market":"...","tracking_number":"..."}]
판매처 송장 자동입력용 큐입니다. sell_order_number/sell_market가 빠지면 즉시 버그입니다.
배열 각 항목에 sell_order_number, sell_market, tracking_number이 있고 tracking_number가 주문송장번호에서 온 값이면 정상입니다.
AUTH_REQUIRED INVALID_INPUT INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
sell_order_number 또는 sell_market 누락
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/invoices/{invoice_id}/entered Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/invoices/{invoice_id}/tracking Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
송장 검증 1 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
POST
/api/invoice/validate Bearer 필요
200 / object
application/json
{"valid":true,"errors":[],"carrier_name":"...","clean_number":"..."}
Authenticated invoice-number validation result. Duplicate checks are scoped to the current user and use 주문송장번호 first, then 송장번호2/송장번호 as legacy/PlayAuto fallbacks.
Authenticated response must include valid, errors, carrier_name, and clean_number; duplicate checking is limited to the current user's 주문송장번호/송장번호2/송장번호 values.
AUTH_REQUIRED VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
Unauthenticated access succeeds, duplicate check sees another user's row, or response omits valid/errors/clean_number.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
수익분석 4 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/analytics/by-market Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/analytics/by-product Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/analytics/revenue Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/analytics/summary Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
수집 API 계정 6 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/collection-api-accounts Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/collection-api-accounts Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/collection-api-accounts/{account_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/collection-api-accounts/{account_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection-api-accounts/{account_id}/credentials Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection-api-accounts/{account_id}/test Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
알림 5 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/notifications Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/notifications Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/notifications/read-all Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/notifications/unread-count Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/notifications/{notification_id}/read Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
유틸리티 1 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/util/og-image 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
이미지 1 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/images/proxy 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
인증 / 사용자 8 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/auth/google/callback 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/auth/google/login 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/auth/license/verify 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/auth/login 공개
200 / object
application/json
{"token":"...","user":{...}}
Normal login returns token and user together. Legacy SHA-256 password hashes are rehashed to bcrypt after successful login.
token and user must both exist. Repeated failed attempts may return RATE_LIMITED/429; successful legacy SHA-256 login must still work and migrate to bcrypt.
INVALID_INPUT AUTH_INVALID RATE_LIMITED VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200 without token/user, AUTH_INVALID for a correct legacy password, RATE_LIMITED missing error.code, or rate limit counting successful logins.
가능
token/user 유무만으로 성공 여부를 즉시 판별할 수 있습니다.
GET
/api/auth/me Bearer 필요
200 / object
application/json
{"id":1,"email":"...","workspace_owner_id":1,...}
로그인 세션과 워크스페이스 정보가 유효한 상태입니다.
id/email/role/workspace_role가 있어야 정상입니다.
AUTH_REQUIRED AUTH_INVALID INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200인데 id/email이 없거나 401/403
가능
401이면 토큰 문제, 200 object면 세션 유효로 바로 해석 가능합니다.
PUT
/api/auth/nickname Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/auth/order-phone Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/auth/signup 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
주문 24 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/orders Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/orders Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/orders/dashboard Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/orders/pending Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
DELETE
/api/orders/rows Bearer 필요
200 / object
application/json
{"total":N,"total_unregistered":N,"rows":[{"id":...,"row_index":...,"data":{...}}]}
주문관리 시트 원본입니다. rows[].data 구조가 비정상이면 화면 전체가 깨집니다.
rows가 배열이고 rows[].data가 객체여야 정상입니다.
AUTH_REQUIRED VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
rows가 없음, rows가 배열이 아님, row.data가 객체가 아님
부분 가능
rows 구조는 확인 가능하지만 특정 행 계산 오류 원인까지는 응답만으로 완전히 판별되지 않습니다.
GET
/api/orders/rows Bearer 필요
200 / object
application/json
{"total":N,"total_unregistered":N,"rows":[{"id":...,"row_index":...,"data":{...}}]}
주문관리 시트 원본입니다. rows[].data 구조가 비정상이면 화면 전체가 깨집니다.
rows가 배열이고 rows[].data가 객체여야 정상입니다.
AUTH_REQUIRED VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
rows가 없음, rows가 배열이 아님, row.data가 객체가 아님
부분 가능
rows 구조는 확인 가능하지만 특정 행 계산 오류 원인까지는 응답만으로 완전히 판별되지 않습니다.
POST
/api/orders/rows Bearer 필요
200 / object
application/json
{"total":N,"total_unregistered":N,"rows":[{"id":...,"row_index":...,"data":{...}}]}
주문관리 시트 원본입니다. rows[].data 구조가 비정상이면 화면 전체가 깨집니다.
rows가 배열이고 rows[].data가 객체여야 정상입니다.
AUTH_REQUIRED VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
rows가 없음, rows가 배열이 아님, row.data가 객체가 아님
부분 가능
rows 구조는 확인 가능하지만 특정 행 계산 오류 원인까지는 응답만으로 완전히 판별되지 않습니다.
POST
/api/orders/rows/batch Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED VALIDATION_ERROR CONFLICT INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/orders/rows/batch-import Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/orders/rows/columns 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/orders/rows/export-playauto.xlsx Bearer 필요
200 / file
binary download
binary file stream
Content-Type이 파일이고 다운로드가 시작되면 정상입니다. JSON/HTML이면 오류입니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
가능
파일 스트림인지 여부만으로 정상/오류를 비교적 쉽게 판별할 수 있습니다.
GET
/api/orders/rows/export.xlsx Bearer 필요
200 / file
binary download
binary file stream
Content-Type이 파일이고 다운로드가 시작되면 정상입니다. JSON/HTML이면 오류입니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
가능
파일 스트림인지 여부만으로 정상/오류를 비교적 쉽게 판별할 수 있습니다.
POST
/api/orders/rows/export.xlsx Bearer 필요
200 / file
binary download
binary file stream
Content-Type이 파일이고 다운로드가 시작되면 정상입니다. JSON/HTML이면 오류입니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
가능
파일 스트림인지 여부만으로 정상/오류를 비교적 쉽게 판별할 수 있습니다.
POST
/api/orders/rows/sync-coupang-release-stop Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/orders/rows/{row_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PATCH
/api/orders/rows/{row_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/orders/rows/{row_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/orders/unordered Bearer 필요
200 / array
application/json
[{"ordered_at":"...","market":"...","recipient_name":"..."}]
확장 주문자 자동입력용 큐입니다. 빈 배열은 미처리 주문 없음 또는 필터 불일치입니다.
배열 각 항목에 ordered_at, market, recipient_name이 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
배열 item에 market/recipient_name 누락
부분 가능
빈 배열만으로는 진짜 미처리 주문 없음인지, 필터/권한 문제인지 구분이 안 됩니다.
POST
/api/orders/upload Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/orders/{order_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PATCH
/api/orders/{order_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/orders/{order_id}/complete Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/orders/{order_id}/retry Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/orders/{order_id}/status Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
주문수집 30 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
POST
/api/collection/cancel Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/collection/carriers Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/collection/collect-sync Bearer 필요
200 / object
application/json
{"ok":true,"saved_count":N,"updated_count":N,"warnings":[...]}
마켓 주문수집 결과입니다. 화면 집계는 발견 건수가 아니라 저장/갱신 건수를 기준으로 해야 합니다.
저장/갱신 건수와 warnings가 분리되어 있으면 정상입니다.
AUTH_REQUIRED VALIDATION_ERROR UPSTREAM_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200인데 DB 저장 건수가 없고 발견 건수만 반환
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/collection/collect/stores Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/collection/columns/orders-all Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/collection/columns/orders-all Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/confirm Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/delete Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/exchange-approve Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/collection/export/excel Bearer 필요
200 / file
binary download
binary file stream
Content-Type이 파일이고 다운로드가 시작되면 정상입니다. JSON/HTML이면 오류입니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
가능
파일 스트림인지 여부만으로 정상/오류를 비교적 쉽게 판별할 수 있습니다.
GET
/api/collection/inquiries Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/collection/inquiries/collect Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/inquiries/{inquiry_id}/answer Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/list Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/return-approve Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/collection/sales/by-market Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/collection/sales/by-product Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/collection/sales/revenue Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/collection/sales/summary Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/collection/seller-cancel Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/ship Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/collection/stats Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/collection/sync-status Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/update-buy-info Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/update-margin Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/update-memo Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/collection/update-pipeline Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/collection/{order_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/collection/{order_id}/field Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/collection/{order_id}/status Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
주소 1 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
POST
/api/address/parse 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
9 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
POST
/api/team/invites Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/team/invites/accept Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/team/invites/token/{invite_token} 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/team/invites/{invite_id}/revoke Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/team/members Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/team/members/{member_user_id}/permissions Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/team/members/{member_user_id}/remove Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/team/status Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/team/users/search Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
필드 매핑 4 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/field-mappings 공개
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/field-mappings Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/field-mappings/{mapping_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/field-mappings/{mapping_id} 공개
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
핫딜 6 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/hotdeals Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/hotdeals/collect Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
GET
/api/hotdeals/favorites Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
GET
/api/hotdeals/search Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
DELETE
/api/hotdeals/{hotdeal_id}/favorite Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/hotdeals/{hotdeal_id}/favorite Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
핫딜 소스 5 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/hotdeal-sources Bearer 필요
200 / array
application/json
[{...}]
최상위가 배열이면 정상입니다. 단, 빈 배열의 의미는 엔드포인트마다 다를 수 있습니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
배열 길이와 아이템 구조는 볼 수 있지만, 빈 배열의 원인까지는 응답만으로 완전히 알 수 없습니다.
POST
/api/hotdeal-sources Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
DELETE
/api/hotdeal-sources/{source_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
PUT
/api/hotdeal-sources/{source_id} Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
POST
/api/hotdeal-sources/{source_id}/scraped Bearer 필요
200 / object
application/json
{"...":"..."}
최상위가 객체이고 detail/error만 단독으로 오지 않으면 정상으로 봅니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED FORBIDDEN VALIDATION_ERROR INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.
헬스체크 1 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/health 공개
200 / object
application/json
{"status":"ok"}
DB 연결까지 포함해 앱이 정상 응답 중인 상태입니다.
`{"status":"ok"}`만 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
HTML/502, JSON이지만 status가 ok가 아님
가능
`{"status":"ok"}` 이외 응답이면 바로 장애로 볼 수 있습니다.
확장프로그램 2 endpoints
Method Path Auth 정상 루트 타입 정상 200 형식 정상 판정 오류 코드 깨졌다고 보는 기준 응답만으로 진단
GET
/api/extension/download 공개
200 / file
binary download
binary file stream
Content-Type이 파일이고 다운로드가 시작되면 정상입니다. JSON/HTML이면 오류입니다.
문서에 정의된 최상위 타입과 핵심 필드가 있으면 정상입니다.
AUTH_REQUIRED NOT_FOUND INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
200이어도 핵심 필드가 없거나 HTML/infra 응답이면 비정상입니다.
가능
파일 스트림이 아니고 JSON/HTML이 오면 즉시 오류로 판단할 수 있습니다.
GET
/api/extension/version 공개
200 / object
application/json
{"version":"0.1.61","download_url":"/api/extension/download",...}
확장 버전 비교, 팝업 배너, RS 버튼 UP 표식의 기준 응답입니다.
version과 download_url이 있으면 정상입니다.
INTERNAL_ERROR
{"ok":false,"detail":"...","message":"...","error":{"code":"STABLE_ERROR_CODE","status":4xx/5xx,"type":"app_error"}}
version/download_url 누락 또는 HTML 응답
부분 가능
핵심 필드 유무로 1차 판별은 가능하지만, 업무 규칙까지는 응답만으로 완전히 알기 어렵습니다.