{"ok":true,"data":{"developerApiCatalog":{"knife":{"total":84,"current":83,"remaining":1},"generatedAt":"2026-07-08T11:23:01.139Z","release":"343717c","status":"developer-catalog-watch","score":100,"actor":null,"publicSafe":true,"summary":{"headline":"Developer API catalog is developer-catalog-watch at 100% with 5 API product(s), 4 example(s), 4 sandbox scenario(s), 7 error(s), and 5 smoke script(s).","apiBaseUrl":"https://api.reits.tech","publicBaseUrl":"https://order.reits.tech","apiProductCount":5,"exampleCount":4,"sandboxScenarioCount":4,"errorCount":7,"smokeScriptCount":5,"activeProjectCount":1,"activePriceCount":3,"apiGatewayStatus":"api-gateway-watch","customOrderWriteStatus":"custom-order-write-ready","ownerEndpoint":"/api/ops/developer-api-catalog","publicEndpoint":"/api/developer/catalog","sandboxEndpoint":"/api/developer/sandbox/custom-order"},"readiness":{"done":10,"total":10,"percent":100,"blockers":[]},"watchSignals":["gateway-watch"],"apiProducts":[{"id":"public-discovery","label":"Public discovery","access":"public","routes":["GET /api/health","GET /api/sdk/config","GET /api/official/entry","GET /api/launch/manifest"],"docs":"适合官网、IM、小程序、BBS 和 REITs 产品先发现入口，不需要写权限。"},{"id":"developer-sandbox","label":"Developer sandbox","access":"public-no-mutation","routes":["GET /api/developer/catalog","POST /api/developer/sandbox/custom-order"],"docs":"用于校验 custom_order payload、分类、幂等键和金额/时长预览；不会创建订单或占用日历。"},{"id":"custom-orders","label":"Custom orders","access":"idempotent-write","routes":["GET /api/orders/schema","GET /api/custom-orders","POST /api/custom-orders"],"docs":"正式写入路径，必须带 Idempotency-Key；当前仍是 custom_order/customCategory，不处理支付和交易。"},{"id":"im-core-bridge","label":"IM Core bridge","access":"idempotent-write","routes":["GET /api/integrations/im-core/order","POST /api/integrations/im-core/order"],"docs":"去中心化 IM 小程序复用同一 custom_order 合约，后续可接 OpenSDK login。"},{"id":"owner-ops","label":"Owner operations","access":"owner-admin","routes":["GET /api/ops/api-gateway-readiness","GET /api/ops/developer-api-catalog","GET /api/ops/custom-order-write-model"],"docs":"运营、QA 和架构师看路由、示例、错误码、smoke 和上线交接，不开放客户数据。"}],"docPages":[{"id":"overview","label":"Overview","route":"/api/developer/catalog","audience":"all developers"},{"id":"schema","label":"Custom order schema","route":"/api/orders/schema","audience":"partner developers"},{"id":"sandbox","label":"Sandbox custom order","route":"/api/developer/sandbox/custom-order","audience":"frontend/backend QA"},{"id":"idempotency","label":"Idempotency and retries","route":"/api/custom-orders","audience":"backend integrators"},{"id":"im-core","label":"IM Core bridge","route":"/api/integrations/im-core/order","audience":"IM mini app"}],"codeExamples":[{"id":"fetch-catalog","label":"Fetch API catalog","language":"curl","command":"curl -fsS https://api.reits.tech/api/developer/catalog"},{"id":"sandbox-custom-order","label":"Sandbox custom order","language":"curl","command":"curl -fsS -X POST https://api.reits.tech/api/developer/sandbox/custom-order \\\n  -H 'Content-Type: application/json' \\\n  -H 'Idempotency-Key: demo-matrix-public-appointment-001' \\\n  -d '{\"projectSlug\":\"matrix-public-appointment\",\"customCategory\":\"appointment\",\"itemIds\":[\"price_product_demo\"],\"date\":\"2026-07-20\",\"startTime\":\"10:00\",\"nickname\":\"Sandbox User\"}'"},{"id":"live-custom-order","label":"Live custom order write","language":"curl","command":"curl -fsS -X POST https://api.reits.tech/api/custom-orders \\\n  -H 'Content-Type: application/json' \\\n  -H 'Idempotency-Key: live-matrix-public-appointment-001' \\\n  -d '{\"projectSlug\":\"matrix-public-appointment\",\"itemIds\":[\"price_product_demo\"],\"date\":\"2026-07-20\",\"startTime\":\"10:00\",\"nickname\":\"Customer\",\"phone\":\"+10000000000\"}'","caution":"正式写入会进入会员审核队列；先跑 sandbox。"},{"id":"node-fetch-sdk","label":"Node fetch sandbox","language":"javascript","command":"await fetch('https://api.reits.tech/api/developer/sandbox/custom-order', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json', 'Idempotency-Key': 'node-demo-001' },\n  body: JSON.stringify({ projectSlug: 'matrix-public-appointment', customCategory: 'quote_request', itemIds: ['price_product_demo'] })\n});"}],"errorMap":[{"code":"missing_idempotency_key","status":400,"action":"Generate a stable operation id and retry with Idempotency-Key."},{"code":"idempotency_conflict","status":409,"action":"Do not retry with the same key; fetch the original order or create a new key for a new intent."},{"code":"missing_intake_field","status":400,"action":"Fetch /api/projects or tenant page data and submit required intakeAnswers by field id."},{"code":"invalid_price_selection","status":400,"action":"Refresh project price items and submit active itemIds."},{"code":"outside_working_day","status":409,"action":"Use /api/projects/:projectId/availability before submitting."},{"code":"developer_sandbox_not_available","status":404,"action":"确认项目或公开价目是否存在；沙盒不会创建新项目。"},{"code":"developer_sandbox_invalid","status":400,"action":"修正 JSON、customCategory、itemIds 或 Idempotency-Key 后重试。"}],"sandboxScenarios":[{"id":"happy-path","label":"Valid custom order","request":"带 projectSlug、itemIds、date/startTime、Idempotency-Key","expected":"200 simulatedCustomOrder / writeMode=sandbox-no-mutation"},{"id":"category-alias","label":"Category alias","request":"customCategory=quote/vote/internal/commercial","expected":"规范化成 quote_request/voting/internal_request/commercial_candidate"},{"id":"missing-idempotency","label":"Missing idempotency","request":"不带 Idempotency-Key","expected":"400 missing_idempotency_key，与正式写入一致"},{"id":"unknown-project","label":"Unknown project","request":"传不存在 projectSlug","expected":"404 developer_sandbox_not_available，不写入任何状态"}],"smokeScripts":[{"id":"health","command":"curl -fsS https://api.reits.tech/api/health","purpose":"确认 release、knife、API base。"},{"id":"catalog","command":"curl -fsS https://api.reits.tech/api/developer/catalog","purpose":"确认公开目录、API 产品、示例和沙盒文案。"},{"id":"sandbox","command":"curl -fsS -X POST https://api.reits.tech/api/developer/sandbox/custom-order \\\n  -H 'Content-Type: application/json' \\\n  -H 'Idempotency-Key: demo-matrix-public-appointment-001' \\\n  -d '{\"projectSlug\":\"matrix-public-appointment\",\"customCategory\":\"appointment\",\"itemIds\":[\"price_product_demo\"],\"date\":\"2026-07-20\",\"startTime\":\"10:00\",\"nickname\":\"Sandbox User\"}'","purpose":"确认沙盒可以模拟 custom_order。"},{"id":"manifest","command":"curl -fsS https://api.reits.tech/api/launch/manifest","purpose":"确认 manifest 发现第 78 刀。"},{"id":"im-core-coexist","command":"curl -fsS https://api.reits.tech/healthz","purpose":"确认 IM Core 共存路由没被 /api 接管打断。"}],"portalCopy":{"title":"Matrix Order Developer Portal","subtitle":"把公共预约、自定义订单、IM 小程序和 OpenSDK 接入变成可复制的 API 产品。","primaryCta":"先跑 Sandbox，再接 Custom Orders","trustCopy":"目录和沙盒不暴露客户 PII、密钥、preview code、webhook payload 或支付凭证。"},"idempotency":{"header":"Idempotency-Key","requiredFor":["/api/custom-orders","/api/integrations/im-core/order","/api/developer/sandbox/custom-order"],"sameKeySamePayload":"returns the original booking/customOrder response with idempotency.replayed=true","sameKeyDifferentPayload":"returns 409 idempotency_conflict"},"linkedSurfaces":{"developerApiCatalog":"/api/developer/catalog","developerSandboxCustomOrder":"/api/developer/sandbox/custom-order","developerApiCatalogOps":"/api/ops/developer-api-catalog","apiGatewayReadiness":"/api/ops/api-gateway-readiness","orderSchema":"/api/orders/schema","customOrders":"/api/custom-orders","imCoreOrderBridge":"/api/integrations/im-core/order","sdkConfig":"/api/sdk/config","launchManifest":"/api/launch/manifest"},"designPatterns":[{"id":"aws-dev-portal","label":"AWS API Gateway developer portals","adaptation":"Catalog routes, examples, and API key guidance before widening usage."},{"id":"apigee-products","label":"Google Apigee API products","adaptation":"Group discovery, sandbox, writes, bridge, and ops into productized access lanes."},{"id":"azure-apim-portal","label":"Azure API Management developer portal","adaptation":"Expose docs, try-it style validation, subscriptions/access language, and branded portal copy."},{"id":"stripe-sandbox-dx","label":"Stripe sandbox/developer resources","adaptation":"Separate sandbox/live mode, copyable examples, idempotency, and clear error handling."}],"guardrails":["Developer API catalog is public-safe and never exposes customer PII, private hashes, auth tokens, SDK shared secrets, preview codes, webhook payloads, provider credentials, or deploy credentials.","Sandbox custom order validates and simulates only; it never creates bookings, blocks calendar slots, queues notifications, writes global orders, mutates IM/OpenSDK state, bills, trades, or changes deployment state.","Live write examples are labeled separately and remain custom_order/customCategory until finance-approved commerce modules exist.","Owner/admin route adds operational context, but the public catalog remains enough for third-party developers to start safely."],"references":["AWS API Gateway developer portal patterns: API discovery, SDK/docs, key management, and operational ownership.","Google Apigee API products and developer portals: productized API bundles, app keys, analytics, and developer engagement.","Azure API Management developer portal: generated/customizable API docs where consumers discover, request access, and try APIs.","Stripe developer resources and sandboxes: isolated testing, separate live/sandbox keys, idempotency, and copyable examples."]}}}