{
  "schemaVersion": "1.0",
  "item": {
    "slug": "endpoints",
    "name": "Endpoints",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/adamkristopher/endpoints",
    "canonicalUrl": "https://clawhub.ai/adamkristopher/endpoints",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/endpoints",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=endpoints",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/api-reference.md",
      "scripts/package-lock.json",
      "scripts/package.json",
      "scripts/src/index.ts",
      "scripts/tsconfig.json"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/endpoints"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/endpoints",
    "agentPageUrl": "https://openagent3.xyz/skills/endpoints/agent",
    "manifestUrl": "https://openagent3.xyz/skills/endpoints/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/endpoints/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Setup",
        "body": "Install dependencies:\n\ncd scripts && npm install\n\nConfigure credentials by creating a .env file in the project root:\n\nENDPOINTS_API_URL=https://endpoints.work\nENDPOINTS_API_KEY=ep_your_api_key_here\n\nPrerequisites: An Endpoints account with an API key. Generate your API key from the API Keys page."
      },
      {
        "title": "Quick Start",
        "body": "User saysFunction to call\"List my endpoints\"listEndpoints()\"Show endpoint details for /job-tracker/january\"getEndpoint('/job-tracker/january')\"Scan this document\"scanFile('/path/to/file.pdf', 'job tracker')\"Scan this text\"scanText('Meeting notes...', 'meeting tracker')\"Create an endpoint for receipts\"createEndpoint('/receipts/2026')\"Delete the old endpoint\"deleteEndpoint('/category/slug')\"Remove that item\"deleteItem('abc12345')\"Get the file URL\"getFileUrl('userid/path/file.pdf')\"Check my usage\"getStats()\n\nExecute functions by importing from scripts/src/index.ts:\n\nimport { listEndpoints, scanText, getStats } from './scripts/src/index.js';\n\nconst categories = await listEndpoints();\nconst result = await scanText('Meeting with John about Q1 goals', 'meeting tracker');\nconst stats = await getStats();\n\nOr run directly with tsx:\n\nnpx tsx scripts/src/index.ts"
      },
      {
        "title": "Workflow Pattern",
        "body": "Every analysis follows three phases:"
      },
      {
        "title": "1. Analyze",
        "body": "Run API functions. Each call hits the Endpoints API and returns structured data."
      },
      {
        "title": "2. Auto-Save",
        "body": "All results automatically save as JSON files to results/{category}/. File naming patterns:\n\nNamed results: {sanitized_name}.json\nAuto-generated: YYYYMMDD_HHMMSS__{operation}.json"
      },
      {
        "title": "3. Summarize",
        "body": "After analysis, read the saved JSON files and create a markdown summary in results/summaries/ with data tables, insights, and extracted entities."
      },
      {
        "title": "High-Level Functions",
        "body": "FunctionPurposeWhat it returnslistEndpoints()Get all endpoints by categoryTree structure with categories and endpointsgetEndpoint(path)Get endpoint detailsFull metadata (old + new items)scanText(text, prompt)Scan text with AIExtracted entities and endpoint pathscanFile(filePath, prompt)Scan file with AIExtracted entities and endpoint pathgetStats()Get usage statisticsParses used, limits, storage"
      },
      {
        "title": "Individual API Functions",
        "body": "For granular control, import specific functions. See references/api-reference.md for the complete list with parameters, types, and examples."
      },
      {
        "title": "Endpoint Functions",
        "body": "FunctionPurposelistEndpoints()List all endpoints organized by categorygetEndpoint(path)Get full endpoint details with metadatacreateEndpoint(path)Create a new empty endpointdeleteEndpoint(path)Delete endpoint and all associated files"
      },
      {
        "title": "Scanning Functions",
        "body": "FunctionPurposescanText(text, prompt)Scan text content with AI extractionscanFile(filePath, prompt)Scan file (PDF, images, docs) with AI"
      },
      {
        "title": "Item Functions",
        "body": "FunctionPurposedeleteItem(itemId)Delete a single item by its 8-char ID"
      },
      {
        "title": "File Functions",
        "body": "FunctionPurposegetFileUrl(key)Get presigned S3 URL for a file"
      },
      {
        "title": "Billing Functions",
        "body": "FunctionPurposegetStats()Get usage stats (parses, storage, tier)"
      },
      {
        "title": "Living JSON Pattern",
        "body": "Endpoints use the Living JSON pattern for document history:\n\n{\n  endpoint: { path, category, slug },\n  metadata: {\n    oldMetadata: { ... },  // Historical items\n    newMetadata: { ... }   // Recent items\n  }\n}"
      },
      {
        "title": "Metadata Item",
        "body": "Each item has:\n\n8-character ID - Unique identifier (e.g., abc12345)\nsummary - AI-generated description\nentities - Extracted entities (people, companies, dates)\nfilePath - S3 URL if file was uploaded\nfileType - MIME type\noriginalText - Source text"
      },
      {
        "title": "Error Handling",
        "body": "StatusMeaning401Invalid or missing API key404Endpoint or item not found409Endpoint already exists429Usage limit exceeded"
      },
      {
        "title": "List and Inspect",
        "body": "// Get all endpoints\nconst { categories } = await listEndpoints();\nconsole.log(`Found ${categories.length} categories`);\n\n// Inspect specific endpoint\nconst details = await getEndpoint('/job-tracker/january');\nconsole.log(`Total items: ${details.totalItems}`);"
      },
      {
        "title": "Scan Documents",
        "body": "// Scan text content\nconst result = await scanText(\n  'Email from John Smith at Acme Corp about the Q1 contract renewal',\n  'business contacts'\n);\nconsole.log(`Created endpoint: ${result.endpoint.path}`);\n\n// Scan a PDF file\nconst fileResult = await scanFile('./invoice.pdf', 'invoice tracker');\nconsole.log(`Extracted ${fileResult.entriesAdded} items`);"
      },
      {
        "title": "Check Usage",
        "body": "const stats = await getStats();\nconsole.log(`Parses: ${stats.parsesUsed}/${stats.parsesLimit}`);\nconsole.log(`Storage: ${stats.storageUsed} bytes`);"
      }
    ],
    "body": "Endpoints API Toolkit\nSetup\n\nInstall dependencies:\n\ncd scripts && npm install\n\n\nConfigure credentials by creating a .env file in the project root:\n\nENDPOINTS_API_URL=https://endpoints.work\nENDPOINTS_API_KEY=ep_your_api_key_here\n\n\nPrerequisites: An Endpoints account with an API key. Generate your API key from the API Keys page.\n\nQuick Start\nUser says\tFunction to call\n\"List my endpoints\"\tlistEndpoints()\n\"Show endpoint details for /job-tracker/january\"\tgetEndpoint('/job-tracker/january')\n\"Scan this document\"\tscanFile('/path/to/file.pdf', 'job tracker')\n\"Scan this text\"\tscanText('Meeting notes...', 'meeting tracker')\n\"Create an endpoint for receipts\"\tcreateEndpoint('/receipts/2026')\n\"Delete the old endpoint\"\tdeleteEndpoint('/category/slug')\n\"Remove that item\"\tdeleteItem('abc12345')\n\"Get the file URL\"\tgetFileUrl('userid/path/file.pdf')\n\"Check my usage\"\tgetStats()\n\nExecute functions by importing from scripts/src/index.ts:\n\nimport { listEndpoints, scanText, getStats } from './scripts/src/index.js';\n\nconst categories = await listEndpoints();\nconst result = await scanText('Meeting with John about Q1 goals', 'meeting tracker');\nconst stats = await getStats();\n\n\nOr run directly with tsx:\n\nnpx tsx scripts/src/index.ts\n\nWorkflow Pattern\n\nEvery analysis follows three phases:\n\n1. Analyze\n\nRun API functions. Each call hits the Endpoints API and returns structured data.\n\n2. Auto-Save\n\nAll results automatically save as JSON files to results/{category}/. File naming patterns:\n\nNamed results: {sanitized_name}.json\nAuto-generated: YYYYMMDD_HHMMSS__{operation}.json\n3. Summarize\n\nAfter analysis, read the saved JSON files and create a markdown summary in results/summaries/ with data tables, insights, and extracted entities.\n\nHigh-Level Functions\nFunction\tPurpose\tWhat it returns\nlistEndpoints()\tGet all endpoints by category\tTree structure with categories and endpoints\ngetEndpoint(path)\tGet endpoint details\tFull metadata (old + new items)\nscanText(text, prompt)\tScan text with AI\tExtracted entities and endpoint path\nscanFile(filePath, prompt)\tScan file with AI\tExtracted entities and endpoint path\ngetStats()\tGet usage statistics\tParses used, limits, storage\nIndividual API Functions\n\nFor granular control, import specific functions. See references/api-reference.md for the complete list with parameters, types, and examples.\n\nEndpoint Functions\nFunction\tPurpose\nlistEndpoints()\tList all endpoints organized by category\ngetEndpoint(path)\tGet full endpoint details with metadata\ncreateEndpoint(path)\tCreate a new empty endpoint\ndeleteEndpoint(path)\tDelete endpoint and all associated files\nScanning Functions\nFunction\tPurpose\nscanText(text, prompt)\tScan text content with AI extraction\nscanFile(filePath, prompt)\tScan file (PDF, images, docs) with AI\nItem Functions\nFunction\tPurpose\ndeleteItem(itemId)\tDelete a single item by its 8-char ID\nFile Functions\nFunction\tPurpose\ngetFileUrl(key)\tGet presigned S3 URL for a file\nBilling Functions\nFunction\tPurpose\ngetStats()\tGet usage stats (parses, storage, tier)\nData Structures\nLiving JSON Pattern\n\nEndpoints use the Living JSON pattern for document history:\n\n{\n  endpoint: { path, category, slug },\n  metadata: {\n    oldMetadata: { ... },  // Historical items\n    newMetadata: { ... }   // Recent items\n  }\n}\n\nMetadata Item\n\nEach item has:\n\n8-character ID - Unique identifier (e.g., abc12345)\nsummary - AI-generated description\nentities - Extracted entities (people, companies, dates)\nfilePath - S3 URL if file was uploaded\nfileType - MIME type\noriginalText - Source text\nError Handling\nStatus\tMeaning\n401\tInvalid or missing API key\n404\tEndpoint or item not found\n409\tEndpoint already exists\n429\tUsage limit exceeded\nExamples\nList and Inspect\n// Get all endpoints\nconst { categories } = await listEndpoints();\nconsole.log(`Found ${categories.length} categories`);\n\n// Inspect specific endpoint\nconst details = await getEndpoint('/job-tracker/january');\nconsole.log(`Total items: ${details.totalItems}`);\n\nScan Documents\n// Scan text content\nconst result = await scanText(\n  'Email from John Smith at Acme Corp about the Q1 contract renewal',\n  'business contacts'\n);\nconsole.log(`Created endpoint: ${result.endpoint.path}`);\n\n// Scan a PDF file\nconst fileResult = await scanFile('./invoice.pdf', 'invoice tracker');\nconsole.log(`Extracted ${fileResult.entriesAdded} items`);\n\nCheck Usage\nconst stats = await getStats();\nconsole.log(`Parses: ${stats.parsesUsed}/${stats.parsesLimit}`);\nconsole.log(`Storage: ${stats.storageUsed} bytes`);"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/adamkristopher/endpoints",
    "publisherUrl": "https://clawhub.ai/adamkristopher/endpoints",
    "owner": "adamkristopher",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/endpoints",
    "downloadUrl": "https://openagent3.xyz/downloads/endpoints",
    "agentUrl": "https://openagent3.xyz/skills/endpoints/agent",
    "manifestUrl": "https://openagent3.xyz/skills/endpoints/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/endpoints/agent.md"
  }
}