> ## Documentation Index
> Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Http api

# HTTP API

आधार URL: `https://clawhub.ai` (डिफ़ॉल्ट)।

सभी v1 पथ `/api/v1/...` के अंतर्गत हैं।
संगतता के लिए पुराने `/api/...` और `/api/cli/...` उपलब्ध हैं (`DEPRECATIONS.md` देखें)।
OpenAPI: `/api/v1/openapi.json`।

## सार्वजनिक कैटलॉग का पुनः उपयोग

तृतीय-पक्ष निर्देशिकाएँ ClawHub Skills को सूचीबद्ध करने या खोजने के लिए सार्वजनिक रीड एंडपॉइंट का उपयोग कर सकती हैं। कृपया परिणामों को कैश करें, `429`/`Retry-After` का पालन करें, उपयोगकर्ताओं को प्रामाणिक ClawHub सूची (`https://clawhub.ai/<owner>/skills/<slug>`) पर वापस भेजने वाला लिंक दें, और ऐसा संकेत देने से बचें कि ClawHub तृतीय-पक्ष साइट का समर्थन करता है। सार्वजनिक API सतह के बाहर छिपी, निजी या मॉडरेशन द्वारा अवरुद्ध सामग्री को मिरर करने का प्रयास न करें।

वेब स्लग शॉर्टकट सभी रजिस्ट्री फ़ैमिली में रिज़ॉल्व होते हैं, लेकिन API क्लाइंट को रूट
प्राथमिकता का पुनर्निर्माण करने के बजाय रीड एंडपॉइंट द्वारा लौटाए गए प्रामाणिक URL का
उपयोग करना चाहिए।

## दर सीमाएँ

प्रवर्तन मॉडल:

* अनाम अनुरोध: प्रति IP लागू।

* प्रमाणित अनुरोध (मान्य Bearer टोकन): प्रति उपयोगकर्ता बकेट लागू।

* यदि टोकन अनुपस्थित/अमान्य है, तो व्यवहार IP प्रवर्तन पर वापस चला जाता है।

* जब सर्वर को कारण ज्ञात हो, तो प्रमाणित राइट एंडपॉइंट को केवल `Unauthorized` नहीं लौटाना चाहिए।
  अनुपस्थित टोकन, अमान्य/निरस्त टोकन और हटाए गए/प्रतिबंधित/अक्षम खातों में से
  प्रत्येक के लिए कार्रवाई योग्य टेक्स्ट मिलना चाहिए, ताकि CLI क्लाइंट उपयोगकर्ताओं को बता
  सकें कि उन्हें किस कारण से रोका गया।

* रीड: प्रति IP 3000/मिनट, प्रति कुंजी 12000/मिनट

* राइट: प्रति IP 300/मिनट, प्रति कुंजी 3000/मिनट

* डाउनलोड: प्रति IP 1200/मिनट, प्रति कुंजी 6000/मिनट (डाउनलोड एंडपॉइंट)

हेडर:

* पुरानी संगतता: `X-RateLimit-Limit`, `X-RateLimit-Reset`
* मानकीकृत: `RateLimit-Limit`, `RateLimit-Reset`
* `429` पर: `X-RateLimit-Remaining: 0` और `RateLimit-Remaining: 0`
* `429` पर: `Retry-After`

हेडर के अर्थ:

* `X-RateLimit-Reset`: निरपेक्ष Unix युग सेकंड
* `RateLimit-Reset`: रीसेट होने तक सेकंड (विलंब)
* `X-RateLimit-Remaining` / `RateLimit-Remaining`: उपलब्ध होने पर शेष सटीक बजट।
  शार्ड किए गए सफल अनुरोध अनुमानित वैश्विक मान लौटाने के बजाय इस हेडर को छोड़ देते हैं।
* `Retry-After`: `429` पर पुनः प्रयास से पहले प्रतीक्षा के सेकंड (विलंब)

`429` प्रतिक्रिया का उदाहरण:

```http theme={"theme":{"light":"min-light","dark":"min-dark"}}
HTTP/2 429
content-type: text/plain; charset=utf-8
x-ratelimit-limit: 20
x-ratelimit-remaining: 0
x-ratelimit-reset: 1771404540
ratelimit-limit: 20
ratelimit-remaining: 0
ratelimit-reset: 34
retry-after: 34

दर सीमा पार हो गई
```

क्लाइंट मार्गदर्शन:

* यदि `Retry-After` मौजूद है, तो पुनः प्रयास से पहले उतने सेकंड प्रतीक्षा करें।
* समन्वित पुनः प्रयासों से बचने के लिए जिटरयुक्त बैकऑफ़ का उपयोग करें।
* यदि `Retry-After` अनुपस्थित है, तो `RateLimit-Reset` पर वापस जाएँ (या `X-RateLimit-Reset` से गणना करें)।

IP स्रोत:

* विश्वसनीय क्लाइंट IP हेडर, जिनमें `cf-connecting-ip` भी शामिल है, का उपयोग केवल तब किया जाता है
  जब परिनियोजन विश्वसनीय फ़ॉरवर्डेड हेडर को स्पष्ट रूप से सक्षम करता है।
* ClawHub एज पर क्लाइंट IP की पहचान करने के लिए विश्वसनीय फ़ॉरवर्डिंग हेडर का उपयोग करता है।
* यदि कोई विश्वसनीय क्लाइंट IP उपलब्ध नहीं है, तो अनाम अनुरोध केवल
  दर-सीमा प्रकार के दायरे वाले फ़ॉलबैक बकेट का उपयोग करते हैं। इन फ़ॉलबैक बकेट में
  कॉलर द्वारा दिए गए पथ, स्लग, पैकेज नाम, संस्करण, क्वेरी स्ट्रिंग या अन्य
  आर्टिफ़ैक्ट पैरामीटर शामिल नहीं होते।

## त्रुटि प्रतिक्रियाएँ

सार्वजनिक v1 त्रुटि प्रतिक्रियाएँ `content-type: text/plain; charset=utf-8` के साथ सादा टेक्स्ट होती हैं।
इसमें सत्यापन विफलताएँ (`400`), अनुपस्थित सार्वजनिक संसाधन (`404`), प्रमाणीकरण और
अनुमति विफलताएँ (`401`/`403`), दर सीमाएँ (`429`) और अवरुद्ध डाउनलोड शामिल हैं। क्लाइंट को
प्रतिक्रिया बॉडी को मानव-पठनीय स्ट्रिंग के रूप में पढ़ना चाहिए। संगतता के लिए अज्ञात क्वेरी पैरामीटर
अनदेखे किए जाते हैं, लेकिन अमान्य मान वाले पहचाने गए क्वेरी पैरामीटर
`400` लौटाते हैं।

## सार्वजनिक एंडपॉइंट (प्रमाणीकरण आवश्यक नहीं)

### `GET /api/v1/search`

क्वेरी पैरामीटर:

* `q` (आवश्यक): क्वेरी स्ट्रिंग
* `limit` (वैकल्पिक): पूर्णांक
* `highlightedOnly` (वैकल्पिक): हाइलाइट की गई Skills तक सीमित करने के लिए `true`
* `nonSuspiciousOnly` (वैकल्पिक): संदिग्ध (`flagged.suspicious`) Skills को छिपाने के लिए `true`
* `nonSuspicious` (वैकल्पिक): `nonSuspiciousOnly` का पुराना उपनाम

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "results": [
    {
      "score": 0.123,
      "slug": "gifgrep",
      "displayName": "GifGrep",
      "summary": "…",
      "version": "1.2.3",
      "updatedAt": 1730000000000,
      "ownerHandle": "openclaw",
      "owner": {
        "handle": "openclaw",
        "displayName": "OpenClaw",
        "image": "https://example.com/avatar.png"
      }
    }
  ]
}
```

टिप्पणियाँ:

* परिणाम प्रासंगिकता क्रम में लौटाए जाते हैं (एम्बेडिंग समानता + सटीक स्लग/नाम टोकन बूस्ट + एक छोटी लोकप्रियता पूर्व-प्राथमिकता)।
* प्रासंगिकता लोकप्रियता से अधिक प्रभावशाली होती है। सटीक स्लग या प्रदर्शन-नाम टोकन मिलान, कहीं अधिक सहभागिता वाले ढीले मिलान से ऊपर आ सकता है।
* ASCII टेक्स्ट को शब्द और विराम-चिह्न सीमाओं पर टोकनाइज़ किया जाता है। उदाहरण के लिए, `personal-map` में एक स्वतंत्र `map` टोकन होता है, जबकि `amap-jsapi-skill` में `amap`, `jsapi` और `skill` होते हैं; इसलिए `map` खोजने पर `personal-map` को `amap-jsapi-skill` की तुलना में अधिक मजबूत शब्दगत मिलान मिलता है।
* लोकप्रियता को लॉग-स्केल किया जाता है और उसकी अधिकतम सीमा तय होती है। अधिक सहभागिता वाली Skills भी तब नीचे रैंक कर सकती हैं जब क्वेरी टेक्स्ट का मिलान कमजोर हो।
* कॉलर फ़िल्टर और वर्तमान मॉडरेशन स्थिति के आधार पर संदिग्ध या छिपी हुई मॉडरेशन स्थिति किसी Skill को सार्वजनिक खोज से हटा सकती है।

प्रकाशक दृश्यता मार्गदर्शन:

* जिन शब्दों को उपयोगकर्ता वास्तव में खोजेंगे, उन्हें प्रदर्शन नाम, सारांश और टैग में रखें। स्वतंत्र स्लग टोकन का उपयोग केवल तभी करें जब वह एक स्थिर पहचान भी हो जिसे आप बनाए रखना चाहते हैं।
* केवल एक क्वेरी को लक्षित करने के लिए स्लग का नाम न बदलें, जब तक कि नया स्लग दीर्घकाल में बेहतर प्रामाणिक नाम न हो। पुराने स्लग रीडायरेक्ट उपनाम बन जाते हैं, लेकिन प्रामाणिक URL, प्रदर्शित स्लग और भावी खोज डाइजेस्ट नए स्लग का उपयोग करते हैं।
* नाम बदलने वाले उपनाम पुराने URL और रजिस्ट्री के माध्यम से रिज़ॉल्व होने वाले इंस्टॉल के लिए रिज़ॉल्यूशन बनाए रखते हैं, लेकिन नाम परिवर्तन के इंडेक्स होने के बाद खोज रैंकिंग प्रामाणिक Skill मेटाडेटा पर आधारित होती है। मौजूदा आँकड़े Skill के साथ बने रहते हैं।
* यदि कोई Skill अप्रत्याशित रूप से दिखाई नहीं दे रही है, तो रैंकिंग-संबंधी मेटाडेटा बदलने से पहले लॉग इन रहते हुए `clawhub inspect @owner/slug` से मॉडरेशन स्थिति जाँचें।

### `GET /api/v1/skills`

क्वेरी पैरामीटर:

* `limit` (वैकल्पिक): पूर्णांक (1–200)
* `cursor` (वैकल्पिक): किसी भी गैर-`trending` सॉर्ट के लिए पेजिनेशन कर्सर
* `sort` (वैकल्पिक): `updated` (डिफ़ॉल्ट), `recommended` (उपनाम: `default`), `createdAt` (उपनाम: `newest`), `downloads`, `stars` (उपनाम: `rating`), पुराने इंस्टॉल उपनाम `installsCurrent`/`installs`/`installsAllTime`, `downloads`, `trending` पर मैप होते हैं
* `nonSuspiciousOnly` (वैकल्पिक): संदिग्ध (`flagged.suspicious`) Skills को छिपाने के लिए `true`
* `nonSuspicious` (वैकल्पिक): `nonSuspiciousOnly` का पुराना उपनाम

अमान्य `sort` मान `400` लौटाते हैं।

टिप्पणियाँ:

* `recommended` सहभागिता और नवीनता संकेतों का उपयोग करता है।
* `trending` पिछले 7 दिनों के इंस्टॉल के अनुसार रैंक करता है (टेलीमेट्री-आधारित)।
* `createdAt` नई Skill क्रॉल के लिए स्थिर है; मौजूदा Skills को पुनः प्रकाशित करने पर `updated` बदलता है।
* जब `nonSuspiciousOnly=true` हो, तो कर्सर-आधारित सॉर्ट किसी पृष्ठ पर `limit` से कम आइटम लौटा सकते हैं, क्योंकि पृष्ठ प्राप्त होने के बाद संदिग्ध Skills को फ़िल्टर किया जाता है।
* उपलब्ध होने पर पेजिनेशन जारी रखने के लिए `nextCursor` का उपयोग करें। केवल छोटा पृष्ठ मिलने का अर्थ यह नहीं है कि परिणाम समाप्त हो गए हैं।

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "items": [
    {
      "slug": "gifgrep",
      "displayName": "GifGrep",
      "summary": "…",
      "topics": ["Productivity"],
      "tags": { "latest": "1.2.3" },
      "stats": {},
      "createdAt": 0,
      "updatedAt": 0,
      "latestVersion": { "version": "1.2.3", "createdAt": 0, "changelog": "…" },
      "metadata": { "os": ["macos"], "systems": ["aarch64-darwin"] }
    }
  ],
  "nextCursor": null
}
```

### `GET /api/v1/skills/{slug}`

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "skill": {
    "slug": "gifgrep",
    "displayName": "GifGrep",
    "summary": "…",
    "topics": ["Productivity"],
    "tags": { "latest": "1.2.3" },
    "stats": {},
    "createdAt": 0,
    "updatedAt": 0
  },
  "latestVersion": { "version": "1.2.3", "createdAt": 0, "changelog": "…" },
  "metadata": { "os": ["macos"], "systems": ["aarch64-darwin"] },
  "owner": { "handle": "steipete", "displayName": "Peter", "image": null },
  "moderation": {
    "isSuspicious": false,
    "isMalwareBlocked": false,
    "verdict": "clean",
    "reasonCodes": [],
    "summary": null,
    "engineVersion": "v2.0.0",
    "updatedAt": 0
  }
}
```

टिप्पणियाँ:

* स्वामी के नाम बदलने/मर्ज करने वाले प्रवाहों द्वारा बनाए गए पुराने स्लग प्रामाणिक Skill पर रिज़ॉल्व होते हैं।
* `metadata.os`: Skill फ्रंटमैटर में घोषित OS प्रतिबंध (जैसे `["macos"]`, `["linux"]`)। घोषित न होने पर `null`।
* `metadata.systems`: Nix सिस्टम लक्ष्य (जैसे `["aarch64-darwin", "x86_64-linux"]`)। घोषित न होने पर `null`।
* यदि Skill में कोई प्लेटफ़ॉर्म मेटाडेटा नहीं है, तो `metadata`, `null` होता है।
* `moderation` केवल तभी शामिल होता है जब Skill फ़्लैग की गई हो या स्वामी उसे देख रहा हो।

### `GET /api/v1/skills/{slug}/moderation`

संरचित मॉडरेशन स्थिति लौटाता है।

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "moderation": {
    "isSuspicious": true,
    "isMalwareBlocked": false,
    "verdict": "suspicious",
    "reasonCodes": ["suspicious.dynamic_code_execution"],
    "summary": "Detected: suspicious.dynamic_code_execution",
    "engineVersion": "v2.0.0",
    "updatedAt": 0,
    "legacyReason": null,
    "evidence": [
      {
        "code": "suspicious.dynamic_code_execution",
        "severity": "critical",
        "file": "index.ts",
        "line": 3,
        "message": "Dynamic code execution detected.",
        "evidence": ""
      }
    ]
  }
}
```

टिप्पणियाँ:

* स्वामी और मॉडरेटर छिपी हुई Skills के मॉडरेशन विवरण तक पहुँच सकते हैं।
* सार्वजनिक कॉलर को पहले से फ़्लैग की गई दृश्यमान Skills के लिए केवल `200` मिलता है।
* सार्वजनिक कॉलर के लिए साक्ष्य को संपादित किया जाता है और केवल स्वामियों/मॉडरेटर के लिए मूल स्निपेट शामिल होते हैं।

### `POST /api/v1/skills/{slug}/report`

मॉडरेटर समीक्षा के लिए किसी Skill की रिपोर्ट करें। रिपोर्ट Skill-स्तर की होती हैं, वैकल्पिक रूप से
किसी संस्करण से लिंक होती हैं और Skill रिपोर्ट कतार में भेजी जाती हैं।

प्रमाणीकरण:

* एक API टोकन आवश्यक है।

अनुरोध:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "reason": "संदिग्ध इंस्टॉल चरण", "version": "1.2.3" }
```

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "ok": true,
  "reported": true,
  "alreadyReported": false,
  "reportId": "skillReports:...",
  "skillId": "skills:...",
  "reportCount": 1
}
```

### `GET /api/v1/skills/-/reports`

Skill रिपोर्ट ग्रहण करने के लिए मॉडरेटर/एडमिन एंडपॉइंट।

क्वेरी पैरामीटर:

* `status` (वैकल्पिक): `open` (डिफ़ॉल्ट), `confirmed`, `dismissed` या `all`
* `limit` (वैकल्पिक): पूर्णांक (1-200)
* `cursor` (वैकल्पिक): पेजिनेशन कर्सर

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "items": [
    {
      "reportId": "skillReports:...",
      "skillId": "skills:...",
      "skillVersionId": "skillVersions:...",
      "slug": "gifgrep",
      "displayName": "GifGrep",
      "version": "1.2.3",
      "reason": "संदिग्ध इंस्टॉल चरण",
      "status": "open",
      "createdAt": 1730000000000,
      "reporter": {
        "userId": "users:...",
        "handle": "reporter",
        "displayName": "रिपोर्टकर्ता"
      },
      "triagedAt": null,
      "triagedBy": null,
      "triageNote": null
    }
  ],
  "nextCursor": null,
  "done": true
}
```

### `POST /api/v1/skills/-/reports/{reportId}/triage`

स्किल रिपोर्ट का समाधान करने या उन्हें दोबारा खोलने के लिए मॉडरेटर/एडमिन एंडपॉइंट।

अनुरोध:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "status": "confirmed", "note": "समीक्षा की गई और प्रभावित संस्करण छिपाया गया।", "finalAction": "hide" }
```

`note`, `confirmed` और `dismissed` के लिए आवश्यक है; `status` को वापस `open` पर
सेट करते समय इसे छोड़ा जा सकता है। उसी ऑडिट-योग्य कार्यप्रवाह में स्किल को छिपाने के लिए ट्राइएज की गई
रिपोर्ट के साथ `finalAction: "hide"` पास करें।

### `GET /api/v1/skills/{slug}/versions`

क्वेरी पैरामीटर:

* `limit` (वैकल्पिक): पूर्णांक
* `cursor` (वैकल्पिक): पेजिनेशन कर्सर

### `GET /api/v1/skills/{slug}/versions/{version}`

संस्करण मेटाडेटा + फ़ाइलों की सूची लौटाता है।

* `version.security` उपलब्ध होने पर सामान्यीकृत स्कैन सत्यापन स्थिति और स्कैनर विवरण
  (VirusTotal + LLM) शामिल करता है।

### `GET /api/v1/skills/{slug}/scan`

किसी स्किल संस्करण के लिए सुरक्षा स्कैन सत्यापन विवरण लौटाता है।

क्वेरी पैरामीटर:

* `version` (वैकल्पिक): विशिष्ट संस्करण स्ट्रिंग।
* `tag` (वैकल्पिक): टैग किए गए संस्करण को रिज़ॉल्व करें (उदाहरण के लिए `latest`)।

टिप्पणियाँ:

* यदि न तो `version` और न ही `tag` दिया गया है, तो नवीनतम संस्करण का उपयोग होता है।
* सामान्यीकृत सत्यापन स्थिति के साथ स्कैनर-विशिष्ट विवरण शामिल करता है।
* `security.hasScanResult` केवल तभी `true` होता है, जब किसी स्कैनर ने निर्णायक निर्णय (`clean`, `suspicious`, या `malicious`) दिया हो।
* `moderation`, नवीनतम संस्करण से प्राप्त वर्तमान स्किल-स्तरीय मॉडरेशन स्नैपशॉट है।
* ऐतिहासिक संस्करण की क्वेरी करते समय, `moderation` और `security` को समान संस्करण संदर्भ मानने से पहले `moderation.matchesRequestedVersion` और `moderation.sourceVersion` जाँचें।

### `POST /api/v1/skills/-/scan`

नई ClawScan जॉब के लिए प्रमाणीकृत सबमिट एंडपॉइंट।

स्थानीय अपलोड स्कैन अब समर्थित नहीं हैं। `multipart/form-data` या `{ "source": { "kind": "upload" } }`
का उपयोग करने वाले अनुरोध `410` लौटाते हैं।

प्रकाशित स्कैन JSON का उपयोग करते हैं:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "source": { "kind": "published", "slug": "gifgrep", "version": "1.2.3" },
  "update": false
}
```

टिप्पणियाँ:

* स्कैन अनुरोध पेलोड और डाउनलोड योग्य रिपोर्ट अवधारण अवधि के बाद स्कैन-अनुरोध स्टोर से समाप्त हो जाते हैं।
* प्रकाशित स्कैन के लिए स्वामी/प्रकाशक प्रबंधन पहुँच या प्लेटफ़ॉर्म मॉडरेटर/एडमिन प्राधिकार आवश्यक है।
* प्रकाशित स्कैन केवल तभी वापस लिखते हैं, जब `update: true` हो और स्कैन सफलतापूर्वक पूरा हो।
* प्रतिक्रिया `{ "ok": true, "scanId": "...", "jobId": "...", "status": "queued", "sourceKind": "published", "update": false, "queue": { "queuedAhead": 0, "queuedAheadIsEstimate": false, "position": 1, "running": 0, "runningIsEstimate": false, "note": "Scans are asynchronous and may take time to complete." } }` के साथ `202` होती है।
* स्कैन जॉब एसिंक्रोनस हैं। मैन्युअल स्कैन अनुरोधों को सामान्य प्रकाशन/बैकफ़िल कार्य से पहले प्राथमिकता दी जाती है, लेकिन पूर्णता फिर भी वर्कर की उपलब्धता पर निर्भर करती है।

### `GET /api/v1/skills/-/scan/{scanId}`

सबमिट किए गए स्कैन के लिए प्रमाणीकृत पोल एंडपॉइंट।

* कतारबद्ध/चल रही/सफल/विफल स्थिति लौटाता है।
* कतारबद्ध रहने के दौरान `queue.queuedAhead` और `queue.position` लौटाता है, ताकि क्लाइंट दिखा सकें कि अनुरोध से पहले कितने प्राथमिकता-प्राप्त मैन्युअल स्कैन हैं। बहुत बड़ी कतारें सीमित की जाती हैं और `queuedAheadIsEstimate: true` के साथ रिपोर्ट की जाती हैं।
* उपलब्ध होने पर, `report` में `clawscan`, `skillspector`, `staticAnalysis`, और `virustotal` अनुभाग होते हैं।
* विफल स्कैन जॉब `lastError` के साथ `status: "failed"` लौटाते हैं।

### `GET /api/v1/skills/-/scan/{scanId}/download`

प्रमाणीकृत रिपोर्ट संग्रह एंडपॉइंट।

* सफल स्कैन आवश्यक है; गैर-अंतिम स्कैन `409` लौटाते हैं।
* `manifest.json`, `clawscan.json`, `skillspector.json`, `static-analysis.json`, `virustotal.json`, और `README.md` वाला ZIP लौटाता है।

### `GET /api/v1/skills/-/scan/download/{name}?version=<version>&kind=skill|plugin`

सबमिट किए गए संस्करणों के लिए प्रमाणीकृत संग्रहीत रिपोर्ट संग्रह एंडपॉइंट।

* स्किल या Plugin तक स्वामी/प्रकाशक प्रबंधन पहुँच या प्लेटफ़ॉर्म मॉडरेटर/एडमिन प्राधिकार आवश्यक है।
* अवरुद्ध या छिपे हुए संस्करणों सहित, सटीक सबमिट किए गए संस्करण के लिए संग्रहीत स्कैन परिणाम लौटाता है।
* `kind` का डिफ़ॉल्ट `skill` है; Plugin/पैकेज स्कैन के लिए `kind=plugin` का उपयोग करें।
* स्कैन-अनुरोध डाउनलोड के समान ZIP संरचना लौटाता है।

### `POST /api/v1/skills/-/scan/batch`

केवल-एडमिन कैनोनिकल बैच रीस्कैन रूट। यह पुराने `POST /api/v1/skills/-/rescan-batch` के समान पेलोड संरचना स्वीकार करता है।

### `POST /api/v1/skills/-/scan/batch/status`

केवल-एडमिन कैनोनिकल बैच स्थिति रूट। यह `{ "jobIds": ["..."] }` स्वीकार करता है और पुराने `POST /api/v1/skills/-/rescan-batch/status` के समान समेकित काउंटर लौटाता है।

### `GET /api/v1/skills/{slug}/verify`

`clawhub skill verify` द्वारा उपयोग किया जाने वाला स्किल कार्ड सत्यापन एनवेलप लौटाता है।

क्वेरी पैरामीटर:

* `version` (वैकल्पिक): विशिष्ट संस्करण स्ट्रिंग।
* `tag` (वैकल्पिक): टैग किए गए संस्करण को रिज़ॉल्व करें (उदाहरण के लिए `latest`)।

टिप्पणियाँ:

* `ok` केवल तभी `true` होता है, जब चयनित संस्करण के पास जनरेट किया गया स्किल कार्ड हो, वह मॉडरेशन द्वारा मैलवेयर के कारण अवरुद्ध न हो, और ClawScan सत्यापन क्लीन हो।
* स्किल पहचान, प्रकाशक पहचान, और चयनित संस्करण मेटाडेटा शीर्ष-स्तरीय एनवेलप फ़ील्ड (`slug`, `displayName`, `publisherHandle`, `version`, `resolvedFrom`, `tag`, `createdAt`) हैं, ताकि शेल ऑटोमेशन नेस्टेड रैपर अनपैक किए बिना उन्हें पढ़ सके।
* `security` शीर्ष-स्तरीय ClawScan/सुरक्षा निर्णय है। ऑटोमेशन को `ok`, `decision`, `reasons`, और `security.status` के आधार पर काम करना चाहिए।
* `security.signals` में `staticScan`, `virusTotal`, और `skillSpector` जैसे सहायक स्कैनर साक्ष्य होते हैं।
* `security.signals.dependencyRegistry` को v1 प्रतिक्रिया संगतता के लिए बनाए रखा गया है, लेकिन डिपेंडेंसी रजिस्ट्री अस्तित्व स्कैनर सेवानिवृत्त हो चुका है और यह कुंजी हमेशा `null` होती है।
* `provenance` केवल तभी `server-resolved-github-import` होता है, जब ClawHub ने प्रकाशन या आयात के दौरान GitHub रेपो/रेफ़/कमिट/पथ रिज़ॉल्व और संग्रहीत किया हो; अन्यथा यह `unavailable` होता है।

### `POST /api/v1/skills/-/security-verdicts`

सटीक स्किल संस्करणों के लिए वर्तमान संक्षिप्त सुरक्षा निर्णय लौटाता है। यह
संग्रह एंडपॉइंट उन क्लाइंट के लिए है, जिन्हें पहले से पता है कि उन्हें किन इंस्टॉल किए गए
ClawHub स्किल संस्करणों को प्रदर्शित करना है, जैसे OpenClaw Control UI।

अनुरोध:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "items": [{ "slug": "gifgrep", "version": "1.2.3" }]
}
```

टिप्पणियाँ:

* `items` में 1-100 अद्वितीय `{ slug, version }` युग्म होने चाहिए।
* परिणाम प्रत्येक आइटम के अनुसार होते हैं; एक अनुपलब्ध स्किल या संस्करण पूरी प्रतिक्रिया को विफल नहीं करता।
* प्रतिक्रिया केवल सुरक्षा संबंधी है। इसमें स्किल कार्ड डेटा, जनरेट किए गए कार्ड की स्थिति, आर्टिफ़ैक्ट फ़ाइल सूचियाँ, या विस्तृत स्कैनर पेलोड शामिल नहीं होते।
* `security.signals` में केवल स्थिति-स्तरीय सहायक साक्ष्य होते हैं; पूरे स्कैनर विवरण के लिए `/scan` या ClawHub सुरक्षा-ऑडिट पेज का उपयोग करें।
* `security.signals.dependencyRegistry` को v1 प्रतिक्रिया संगतता के लिए बनाए रखा गया है, लेकिन डिपेंडेंसी रजिस्ट्री अस्तित्व स्कैनर सेवानिवृत्त हो चुका है और यह कुंजी हमेशा `null` होती है।
* स्किल कार्ड की अनुपस्थिति इस एंडपॉइंट के `ok`, `decision`, या `reasons` को प्रभावित नहीं करती; कार्ड सामग्री की आवश्यकता होने पर क्लाइंट को इंस्टॉल किया गया `skill-card.md` स्थानीय रूप से पढ़ना चाहिए।
* एकल-स्किल स्किल कार्ड सत्यापन एनवेलप की आवश्यकता होने पर `/verify`, जनरेट किए गए कार्ड मार्कडाउन की आवश्यकता होने पर `/card`, और विस्तृत स्कैनर डेटा की आवश्यकता होने पर `/scan` का उपयोग करें।

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "schema": "clawhub.skill.security-verdicts.v1",
  "items": [
    {
      "ok": true,
      "decision": "pass",
      "reasons": [],
      "requestedSlug": "gifgrep",
      "slug": "gifgrep",
      "displayName": "GifGrep",
      "publisherHandle": "steipete",
      "publisherDisplayName": "Peter",
      "requestedVersion": "1.2.3",
      "version": "1.2.3",
      "createdAt": 0,
      "checkedAt": 0,
      "skillUrl": "https://clawhub.ai/steipete/skills/gifgrep",
      "securityAuditUrl": "https://clawhub.ai/steipete/skills/gifgrep/security-audit?version=1.2.3",
      "security": {
        "status": "clean",
        "passed": true,
        "signals": {
          "staticScan": { "status": "clean", "reasonCodes": [] },
          "virusTotal": null,
          "skillSpector": null,
          "dependencyRegistry": null
        }
      }
    },
    {
      "ok": false,
      "decision": "fail",
      "reasons": ["version.not_found"],
      "requestedSlug": "missing-version",
      "requestedVersion": "1.0.0",
      "error": { "code": "version_not_found", "message": "संस्करण नहीं मिला" },
      "security": null
    }
  ]
}
```

### `GET /api/v1/skills/{slug}/file`

सटीक संग्रहीत फ़ाइल बाइट डाउनलोड के रूप में लौटाता है। सीमित एस्केप किए गए टेक्स्ट
पूर्वावलोकन का अनुरोध करने के लिए `preview=1` जोड़ें; मान्य UTF-8 बाइट वाली किसी भी फ़ाइल का पूर्वावलोकन किया जा सकता है, चाहे उसका एक्सटेंशन या MIME
मेटाडेटा कुछ भी हो।

क्वेरी पैरामीटर:

* `path` (आवश्यक)
* `version` (वैकल्पिक)
* `tag` (वैकल्पिक)
* `preview=1` (वैकल्पिक; बाइट मान्य UTF-8 न होने पर `text/plain` या `415` लौटाता है)

टिप्पणियाँ:

* डिफ़ॉल्ट रूप से नवीनतम संस्करण।
* रॉ डाउनलोड सीमा: 10MB।
* टेक्स्ट पूर्वावलोकन सीमा: 200KB।

### `GET /api/v1/packages`

इसके लिए एकीकृत कैटलॉग एंडपॉइंट:

* स्किल
* कोड Plugin
* बंडल Plugin

क्वेरी पैरामीटर:

* `limit` (वैकल्पिक): पूर्णांक (1–100)
* `cursor` (वैकल्पिक): पेजिनेशन कर्सर
* `family` (वैकल्पिक): `skill`, `code-plugin`, या `bundle-plugin`
* `channel` (वैकल्पिक): `official`, `community`, या `private`
* `isOfficial` (वैकल्पिक): `true` या `false`
* `sort` (वैकल्पिक): `updated` (डिफ़ॉल्ट), `recommended`, `trending`, `downloads`, पुराना उपनाम `installs`
* `category` (वैकल्पिक): Plugin श्रेणी फ़िल्टर। केवल तभी समर्थित है, जब
  अनुरोध Plugin पैकेज (`/api/v1/plugins`,
  `/api/v1/code-plugins`, `/api/v1/bundle-plugins`, या `family=code-plugin`/`family=bundle-plugin`
  वाले पैकेज एंडपॉइंट) तक सीमित हो। नियंत्रित श्रेणियाँ और
  पुराने v1 फ़िल्टर उपनाम `GET /api/v1/plugins` के अंतर्गत प्रलेखित हैं।

टिप्पणियाँ:

* `family`, `channel`, `isOfficial`, `featured`,
  `highlightedOnly`, या `sort` के अमान्य मान `400` लौटाते हैं। अज्ञात क्वेरी पैरामीटर अनदेखे किए जाते हैं।
* `GET /api/v1/code-plugins` और `GET /api/v1/bundle-plugins` निश्चित-परिवार उपनाम बने रहते हैं।
* स्किल प्रविष्टियाँ स्किल रजिस्ट्री द्वारा समर्थित रहती हैं और अब भी केवल `POST /api/v1/skills` के माध्यम से प्रकाशित की जा सकती हैं।
* `POST /api/v1/packages` अब भी केवल कोड-Plugin और बंडल-Plugin रिलीज़ के लिए है।
* अनाम कॉलर केवल सार्वजनिक पैकेज चैनल देखते हैं।
* प्रमाणीकृत कॉलर सूची/खोज परिणामों में उन प्रकाशकों के निजी पैकेज देख सकते हैं जिनसे वे संबंधित हैं।
* `channel=private` केवल वे पैकेज लौटाता है जिन्हें प्रमाणीकृत कॉलर पढ़ सकता है।

### `GET /api/v1/packages/search`

स्किल + Plugin पैकेज में एकीकृत कैटलॉग खोज।

क्वेरी पैरामीटर:

* `q` (आवश्यक): क्वेरी स्ट्रिंग
* `limit` (वैकल्पिक): पूर्णांक (1–100)
* `family` (वैकल्पिक): `skill`, `code-plugin`, या `bundle-plugin`
* `channel` (वैकल्पिक): `official`, `community`, या `private`
* `isOfficial` (वैकल्पिक): `true` या `false`
* `category` (वैकल्पिक): Plugin श्रेणी फ़िल्टर। केवल तब समर्थित है जब
  अनुरोध का दायरा Plugin पैकेज तक सीमित हो। नियंत्रित श्रेणियाँ और लेगेसी v1
  फ़िल्टर उपनाम `GET /api/v1/plugins` के अंतर्गत प्रलेखित हैं।

टिप्पणियाँ:

* `family`, `channel`, `isOfficial`, `featured`, या
  `highlightedOnly` के अमान्य मान `400` लौटाते हैं। अज्ञात क्वेरी पैरामीटर अनदेखे किए जाते हैं।
* अनाम कॉलर केवल सार्वजनिक पैकेज चैनल देख सकते हैं।
* प्रमाणित कॉलर उन प्रकाशकों के निजी पैकेज खोज सकते हैं जिनसे वे संबद्ध हैं।
* `channel=private` केवल वे पैकेज लौटाता है जिन्हें प्रमाणित कॉलर पढ़ सकता है।

### `GET /api/v1/plugins`

कोड-Plugin और बंडल-Plugin पैकेजों में केवल-Plugin कैटलॉग ब्राउज़िंग।

क्वेरी पैरामीटर:

* `limit` (वैकल्पिक): पूर्णांक (1-100)
* `cursor` (वैकल्पिक): पृष्ठांकन कर्सर
* `isOfficial` (वैकल्पिक): `true` या `false`
* `sort` (वैकल्पिक): `recommended` (डिफ़ॉल्ट), `trending`, `downloads`, `updated`, लेगेसी उपनाम `installs`
* `category` (वैकल्पिक): Plugin श्रेणी फ़िल्टर। वर्तमान मान:
  `channels`, `models`, `memory`, `context`, `voice`, `media`, `web`,
  `tools`, `runtime`, `gateway`, `security`, `other`।

लेगेसी v1 फ़िल्टर उपनाम पठन एंडपॉइंट पर अभी भी स्वीकार किए जाते हैं:

* `mcp-tooling`, `data`, और `automation` का समाधान `tools` के रूप में होता है।
* `observability` और `deployment` का समाधान `gateway` के रूप में होता है।
* `dev-tools` का समाधान `runtime` के रूप में होता है।

`trending` सात-दिवसीय इंस्टॉल/डाउनलोड लीडरबोर्ड है और सर्वकालिक योग का उपयोग नहीं करता।
एकीकृत `/api/v1/packages` एंडपॉइंट पर यह केवल-Plugin है; Skills कैटलॉग के लिए
`/api/v1/skills?sort=trending` का उपयोग करें।

लेगेसी उपनाम संग्रहीत या लेखक-घोषित श्रेणी मानों के रूप में स्वीकार नहीं किए जाते।

### `GET /api/v1/skills/export`

ऑफ़लाइन विश्लेषण के लिए नवीनतम सार्वजनिक Skills का थोक निर्यात।

प्रमाणीकरण:

* API टोकन आवश्यक है।

क्वेरी पैरामीटर:

* `startDate` (आवश्यक): Skill `updatedAt` के लिए Unix मिलीसेकंड की निचली सीमा।
* `endDate` (आवश्यक): Skill `updatedAt` के लिए Unix मिलीसेकंड की ऊपरी सीमा।
* `limit` (वैकल्पिक): पूर्णांक (1-250), डिफ़ॉल्ट `250`।
* `cursor` (वैकल्पिक): पिछले प्रत्युत्तर का पृष्ठांकन कर्सर।

प्रत्युत्तर:

* बॉडी: ZIP आर्काइव।
* प्रत्येक निर्यातित Skill का मूल `{publisher}/{slug}/` पर होता है।
* होस्ट की गई Skills में नवीनतम संग्रहीत संस्करण फ़ाइलें शामिल होती हैं और उन्हें
  `_manifest.json` में `sourceRef: "public-clawhub"` के साथ सूचीबद्ध किया जाता है।
* `clean` या `suspicious` स्कैन वाली वर्तमान GitHub-समर्थित Skills में
  `_source_handoff.json` के साथ `sourceRef: "public-github"`, रिपॉज़िटरी, कमिट, पथ,
  सामग्री हैश और आर्काइव URL शामिल होते हैं। इनमें ClawHub द्वारा होस्ट की गई स्रोत फ़ाइलें शामिल नहीं होतीं।
* प्रत्येक Skill में `_export_skill_meta.json` शामिल होता है।
* `_manifest.json` हमेशा ZIP के मूल में शामिल होता है।
* जब अलग-अलग Skills या फ़ाइलें निर्यात नहीं की जा सकीं, तब
  `_errors.json` शामिल होता है।

हेडर:

* `X-Next-Cursor`
* `X-Has-More`
* `X-Total-Returned`
* `X-Date-Range`
* `X-Export-Errors`

### `GET /api/v1/plugins/export`

ऑफ़लाइन विश्लेषण के लिए नवीनतम सार्वजनिक Plugin रिलीज़ का थोक निर्यात।

प्रमाणीकरण:

* API टोकन आवश्यक है।

क्वेरी पैरामीटर:

* `startDate` (आवश्यक): Plugin `updatedAt` के लिए Unix मिलीसेकंड की निचली सीमा।
* `endDate` (आवश्यक): Plugin `updatedAt` के लिए Unix मिलीसेकंड की ऊपरी सीमा।
* `limit` (वैकल्पिक): पूर्णांक (1-250), डिफ़ॉल्ट `250`।
* `cursor` (वैकल्पिक): पिछले प्रत्युत्तर का पृष्ठांकन कर्सर।
* `family` (वैकल्पिक): `code-plugin` या `bundle-plugin`। छोड़े जाने का अर्थ दोनों
  Plugin परिवार हैं।

प्रत्युत्तर:

* बॉडी: ZIP आर्काइव।
* प्रत्येक निर्यातित Plugin का मूल `{family}/{packageName}/` पर होता है।
* प्रत्येक निर्यातित Plugin में नवीनतम रिलीज़ की संग्रहीत फ़ाइलें शामिल होती हैं।
* प्रति-Plugin निर्यात मेटाडेटा
  `__clawhub_export/{family}/{packageName}/plugin_meta.json` पर संग्रहीत होता है।
* `_manifest.json` हमेशा ZIP के मूल में शामिल होता है।
* जब अलग-अलग Plugins या फ़ाइलें निर्यात नहीं की जा सकीं, तब
  `_errors.json` शामिल होता है।

हेडर:

* `X-Next-Cursor`
* `X-Has-More`
* `X-Total-Returned`
* `X-Date-Range`
* `X-Export-Errors`

### `GET /api/v1/plugins/search`

कोड-Plugin और बंडल-Plugin पैकेजों में केवल-Plugin खोज।

क्वेरी पैरामीटर:

* `q` (आवश्यक): क्वेरी स्ट्रिंग
* `limit` (वैकल्पिक): पूर्णांक (1-100)
* `isOfficial` (वैकल्पिक): `true` या `false`
* `category` (वैकल्पिक): Plugin श्रेणी फ़िल्टर। वर्तमान मान:
  `channels`, `models`, `memory`, `context`, `voice`, `media`, `web`,
  `tools`, `runtime`, `gateway`, `security`, `other`।

टिप्पणियाँ:

* `GET /api/v1/plugins` के अंतर्गत प्रलेखित लेगेसी v1 फ़िल्टर उपनाम भी
  स्वीकार किए जाते हैं।
* श्रेणी फ़िल्टरिंग Plugin श्रेणी डाइजेस्ट पंक्तियों द्वारा समर्थित एक वास्तविक API फ़िल्टर है,
  न कि खोज-क्वेरी का पुनर्लेखन।
* परिणाम प्रासंगिकता क्रम में लौटाए जाते हैं और वर्तमान में उनका पृष्ठांकन नहीं होता।
* Plugin खोज के लिए ब्राउज़र UI सॉर्ट नियंत्रण लोड किए गए प्रासंगिकता परिणामों को पुनः क्रमित करते हैं,
  जो वर्तमान `/skills` ब्राउज़ व्यवहार से मेल खाता है।

### `GET /api/v1/packages/{name}`

पैकेज विवरण मेटाडेटा लौटाता है।

टिप्पणियाँ:

* एकीकृत कैटलॉग में इस रूट के माध्यम से Skills का समाधान भी हो सकता है।
* यदि कॉलर स्वामी प्रकाशक को नहीं पढ़ सकता, तो निजी पैकेज `404` लौटाते हैं।

### `DELETE /api/v1/packages/{name}`

पैकेज और सभी रिलीज़ को सॉफ़्ट-डिलीट करता है।

टिप्पणियाँ:

* पैकेज स्वामी, संगठन प्रकाशक स्वामी/व्यवस्थापक,
  प्लेटफ़ॉर्म मॉडरेटर या प्लेटफ़ॉर्म व्यवस्थापक के लिए API टोकन आवश्यक है।

### `GET /api/v1/packages/{name}/versions`

संस्करण इतिहास लौटाता है।

क्वेरी पैरामीटर:

* `limit` (वैकल्पिक): पूर्णांक (1–100)
* `cursor` (वैकल्पिक): पृष्ठांकन कर्सर

टिप्पणियाँ:

* यदि कॉलर स्वामी प्रकाशक को नहीं पढ़ सकता, तो निजी पैकेज `404` लौटाते हैं।

### `GET /api/v1/packages/{name}/versions/{version}`

फ़ाइल मेटाडेटा, संगतता, सत्यापन, आर्टिफ़ैक्ट मेटाडेटा और स्कैन डेटा सहित
एक पैकेज संस्करण लौटाता है।

टिप्पणियाँ:

* `version.artifact.kind` पुराने स्वरूप वाले पैकेज आर्काइव के लिए `legacy-zip` या
  ClawPack-समर्थित रिलीज़ के लिए `npm-pack` है।
* ClawPack रिलीज़ में npm-संगत `npmIntegrity`, `npmShasum`, और
  `npmTarballName` फ़ील्ड शामिल होते हैं।
* `version.sha256hash` पुराने क्लाइंट के लिए अप्रचलित संगतता मेटाडेटा है। यह
  `/api/v1/packages/{name}/download` द्वारा लौटाए गए सटीक ZIP बाइट्स को हैश करता है।
  आधुनिक क्लाइंट को `version.artifact.sha256` का उपयोग करना चाहिए, जो
  कैनोनिकल रिलीज़ आर्टिफ़ैक्ट की पहचान करता है।
* स्कैन डेटा मौजूद होने पर `version.vtAnalysis`, `version.llmAnalysis`, और `version.staticScan`
  शामिल होते हैं।
* यदि कॉलर स्वामी प्रकाशक को नहीं पढ़ सकता, तो निजी पैकेज `404` लौटाते हैं।

### `GET /api/v1/packages/{name}/versions/{version}/security`

इंस्टॉल क्लाइंट के लिए पैकेज रिलीज़ का सटीक सुरक्षा और विश्वास सारांश लौटाता है।
यह तय करने के लिए कि समाधान की गई रिलीज़ इंस्टॉल की जा सकती है या नहीं, यह सार्वजनिक OpenClaw
उपयोग सतह है।

प्रमाणीकरण:

* सार्वजनिक पठन एंडपॉइंट। किसी स्वामी, प्रकाशक, मॉडरेटर या व्यवस्थापक टोकन की
  आवश्यकता नहीं है।

प्रत्युत्तर:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "package": {
    "name": "@openclaw/example-plugin",
    "displayName": "Example Plugin",
    "family": "code-plugin"
  },
  "release": {
    "releaseId": "packageReleases:...",
    "version": "1.2.3",
    "artifactKind": "npm-pack",
    "artifactSha256": "0123456789abcdef...",
    "npmIntegrity": "sha512-...",
    "npmShasum": "0123456789abcdef0123456789abcdef01234567",
    "npmTarballName": "example-plugin-1.2.3.tgz",
    "createdAt": 1730000000000
  },
  "trust": {
    "scanStatus": "malicious",
    "moderationState": "quarantined",
    "blockedFromDownload": true,
    "reasons": ["manual:quarantined", "scan:malicious"],
    "pending": false,
    "stale": false
  }
}
```

प्रत्युत्तर फ़ील्ड:

* `package.name`, `package.displayName`, और `package.family` समाधान किए गए
  रजिस्ट्री पैकेज की पहचान करते हैं।
* `release.releaseId`, `release.version`, और `release.createdAt` उस सटीक
  रिलीज़ की पहचान करते हैं जिसका मूल्यांकन किया गया था।
* `release.artifactKind`, `release.artifactSha256`, `release.npmIntegrity`,
  `release.npmShasum`, और `release.npmTarballName` रिलीज़ आर्टिफ़ैक्ट के लिए
  ज्ञात होने पर मौजूद होते हैं।
* `trust.scanStatus` स्कैनर इनपुट और मैन्युअल रिलीज़ मॉडरेशन से प्राप्त
  प्रभावी विश्वास स्थिति है।
* `trust.moderationState` शून्य-योग्य है। मैन्युअल रिलीज़ मॉडरेशन मौजूद न होने पर यह
  `null` होता है।
* `trust.blockedFromDownload` इंस्टॉल अवरोध संकेत है। OpenClaw और अन्य
  इंस्टॉल क्लाइंट को स्कैनर या मॉडरेशन फ़ील्ड से अवरोध नियमों को पुनः प्राप्त करने के बजाय,
  यह मान `true` होने पर इंस्टॉलेशन अवरुद्ध करना चाहिए।
* `trust.reasons` उपयोगकर्ता-दृश्य और ऑडिट स्पष्टीकरण सूची है। कारण कोड
  `manual:quarantined`, `scan:malicious`, और `package:malicious` जैसे
  स्थिर, संक्षिप्त स्ट्रिंग होते हैं।
* `trust.pending` का अर्थ है कि एक या अधिक विश्वास इनपुट अभी भी पूर्ण होने की प्रतीक्षा में हैं।
* `trust.stale` का अर्थ है कि विश्वास सारांश की गणना पुराने इनपुट से की गई थी और
  उच्च-विश्वसनीयता वाले अनुमति निर्णय से पहले इसे रीफ़्रेश करना आवश्यक माना जाना चाहिए।

टिप्पणियाँ:

* यह एंडपॉइंट संस्करण-सटीक है। क्लाइंट को केवल नवीनतम
  पैकेज मेटाडेटा पढ़ने के बाद नहीं, बल्कि उस पैकेज संस्करण का समाधान करने के बाद इसे कॉल करना चाहिए
  जिसे वे इंस्टॉल करना चाहते हैं।
* यदि कॉलर स्वामी प्रकाशक को नहीं पढ़ सकता, तो निजी पैकेज `404` लौटाते हैं।
* यह एंडपॉइंट जानबूझकर स्वामी/मॉडरेटर मॉडरेशन
  एंडपॉइंट से अधिक सीमित है। यह इंस्टॉल निर्णय और सार्वजनिक स्पष्टीकरण प्रदर्शित करता है, न कि
  रिपोर्टकर्ता की पहचान, रिपोर्ट की सामग्री, निजी साक्ष्य या आंतरिक समीक्षा
  समयरेखाएँ।

### `GET /api/v1/packages/{name}/versions/{version}/artifact`

पैकेज संस्करण के लिए स्पष्ट आर्टिफ़ैक्ट रिज़ॉल्वर मेटाडेटा लौटाता है।

टिप्पणियाँ:

* लेगेसी पैकेज संस्करण एक `legacy-zip` आर्टिफ़ैक्ट और लेगेसी ZIP
  `downloadUrl` लौटाते हैं।
* ClawPack संस्करण एक `npm-pack` आर्टिफ़ैक्ट, npm अखंडता फ़ील्ड, एक
  `tarballUrl`, और लेगेसी ZIP संगतता URL लौटाते हैं।
* यह OpenClaw रिज़ॉल्वर सतह है; यह किसी साझा URL से आर्काइव प्रारूप का
  अनुमान लगाने से बचती है।

### `GET /api/v1/packages/{name}/versions/{version}/artifact/download`

स्पष्ट रिज़ॉल्वर पथ के माध्यम से संस्करण आर्टिफ़ैक्ट डाउनलोड करता है।

टिप्पणियाँ:

* ClawPack संस्करण अपलोड किए गए सटीक npm-pack `.tgz` बाइट्स स्ट्रीम करते हैं।
* पुराने ZIP संस्करण `/api/v1/packages/{name}/download?version=` पर रीडायरेक्ट होते हैं।
* डाउनलोड दर बकेट का उपयोग करता है।

### `GET /api/v1/packages/{name}/readiness`

OpenClaw द्वारा भविष्य में उपयोग के लिए परिकलित तत्परता लौटाता है।

तत्परता जाँच में शामिल हैं:

* आधिकारिक चैनल स्थिति
* नवीनतम संस्करण की उपलब्धता
* ClawPack npm-pack आर्टिफ़ैक्ट की उपलब्धता
* आर्टिफ़ैक्ट डाइजेस्ट
* स्रोत रिपॉज़िटरी और कमिट की उत्पत्ति
* OpenClaw संगतता मेटाडेटा
* होस्ट लक्ष्य
* स्कैन स्थिति

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "package": {
    "name": "@openclaw/example-plugin",
    "displayName": "उदाहरण Plugin",
    "family": "code-plugin",
    "isOfficial": true,
    "latestVersion": "1.2.3"
  },
  "ready": false,
  "checks": [
    {
      "id": "clawpack",
      "label": "ClawPack आर्टिफ़ैक्ट",
      "status": "fail",
      "message": "नवीनतम संस्करण केवल पुराने ZIP प्रारूप में है।"
    }
  ],
  "blockers": ["clawpack"]
}
```

### `GET /api/v1/packages/migrations`

आधिकारिक OpenClaw Plugin माइग्रेशन पंक्तियाँ सूचीबद्ध करने के लिए मॉडरेटर एंडपॉइंट।

प्रमाणीकरण:

* मॉडरेटर या एडमिन उपयोगकर्ता के लिए API टोकन आवश्यक है।

क्वेरी पैरामीटर:

* `phase` (वैकल्पिक): `planned`, `published`, `clawpack-ready`,
  `legacy-zip-only`, `metadata-ready`, `blocked`, `ready-for-openclaw`, या
  `all` (डिफ़ॉल्ट)।
* `limit` (वैकल्पिक): पूर्णांक (1-100)
* `cursor` (वैकल्पिक): पृष्ठांकन कर्सर

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "items": [
    {
      "migrationId": "officialPluginMigrations:...",
      "bundledPluginId": "core.search",
      "packageName": "@openclaw/search-plugin",
      "packageId": "packages:...",
      "owner": "platform",
      "sourceRepo": "openclaw/openclaw",
      "sourcePath": "plugins/search",
      "sourceCommit": "abc123",
      "phase": "blocked",
      "blockers": ["ClawPack अनुपलब्ध"],
      "hostTargetsComplete": true,
      "scanClean": false,
      "moderationApproved": false,
      "runtimeBundlesReady": false,
      "notes": null,
      "createdAt": 1760000000000,
      "updatedAt": 1760000000000
    }
  ],
  "nextCursor": null,
  "done": true
}
```

### `POST /api/v1/packages/migrations`

आधिकारिक Plugin माइग्रेशन पंक्ति बनाने या अपडेट करने के लिए एडमिन एंडपॉइंट।

प्रमाणीकरण:

* एडमिन उपयोगकर्ता के लिए API टोकन आवश्यक है।

अनुरोध बॉडी:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "bundledPluginId": "core.search",
  "packageName": "@openclaw/search-plugin",
  "owner": "platform",
  "sourceRepo": "openclaw/openclaw",
  "sourcePath": "plugins/search",
  "sourceCommit": "abc123",
  "phase": "blocked",
  "blockers": ["ClawPack अनुपलब्ध"],
  "hostTargetsComplete": true,
  "scanClean": false,
  "moderationApproved": false,
  "runtimeBundlesReady": false,
  "notes": "प्रकाशक के अपलोड की प्रतीक्षा है"
}
```

टिप्पणियाँ:

* `bundledPluginId` को लोअरकेस में सामान्यीकृत किया जाता है और यह स्थिर अपसर्ट कुंजी है।
* `packageName` को npm नाम के अनुसार सामान्यीकृत किया जाता है; नियोजित
  माइग्रेशन के लिए पैकेज अनुपलब्ध हो सकता है।
* यह केवल माइग्रेशन की तत्परता ट्रैक करता है। यह OpenClaw को परिवर्तित नहीं करता या
  ClawPacks जनरेट नहीं करता।

### `GET /api/v1/packages/moderation/queue`

पैकेज रिलीज़ समीक्षा कतारों के लिए मॉडरेटर/एडमिन एंडपॉइंट।

प्रमाणीकरण:

* मॉडरेटर या एडमिन उपयोगकर्ता के लिए API टोकन आवश्यक है।

क्वेरी पैरामीटर:

* `status` (वैकल्पिक): `open` (डिफ़ॉल्ट), `blocked`, `manual`, या `all`
* `limit` (वैकल्पिक): पूर्णांक (1-100)
* `cursor` (वैकल्पिक): पृष्ठांकन कर्सर

स्थितियों के अर्थ:

* `open`: संदिग्ध, दुर्भावनापूर्ण, लंबित, क्वारंटीन की गई, निरस्त की गई या रिपोर्ट की गई रिलीज़।
* `blocked`: क्वारंटीन की गई, निरस्त की गई या दुर्भावनापूर्ण रिलीज़।
* `manual`: मैन्युअल मॉडरेशन ओवरराइड वाली कोई भी रिलीज़।
* `all`: मैन्युअल ओवरराइड, गैर-स्वच्छ स्कैन स्थिति या पैकेज रिपोर्ट वाली कोई भी रिलीज़।

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "items": [
    {
      "packageId": "packages:...",
      "releaseId": "packageReleases:...",
      "name": "@openclaw/example-plugin",
      "displayName": "उदाहरण Plugin",
      "family": "code-plugin",
      "channel": "community",
      "isOfficial": false,
      "version": "1.2.3",
      "createdAt": 1730000000000,
      "artifactKind": "npm-pack",
      "scanStatus": "malicious",
      "moderationState": "quarantined",
      "moderationReason": "मैन्युअल समीक्षा",
      "sourceRepo": "openclaw/example-plugin",
      "sourceCommit": "abc123",
      "reportCount": 2,
      "lastReportedAt": 1730000001000,
      "reasons": ["manual:quarantined", "scan:malicious", "reports:2"]
    }
  ],
  "nextCursor": null,
  "done": true
}
```

### `POST /api/v1/packages/{name}/report`

मॉडरेटर समीक्षा के लिए किसी पैकेज की रिपोर्ट करें। रिपोर्ट पैकेज-स्तरीय होती हैं और वैकल्पिक रूप से
किसी संस्करण से लिंक की जा सकती हैं। वे मॉडरेशन कतार को डेटा देती हैं, लेकिन स्वयं पैकेज को स्वतः छिपाती या
डाउनलोड अवरुद्ध नहीं करतीं; आर्टिफ़ैक्ट को स्वीकृत, क्वारंटीन या निरस्त करने के लिए मॉडरेटर को रिलीज़ मॉडरेशन का
उपयोग करना चाहिए।

प्रमाणीकरण:

* API टोकन आवश्यक है।

अनुरोध:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "reason": "संदिग्ध नेटिव बाइनरी", "version": "1.2.3" }
```

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "ok": true,
  "reported": true,
  "alreadyReported": false,
  "packageId": "packages:...",
  "releaseId": "packageReleases:...",
  "reportCount": 1
}
```

### `GET /api/v1/packages/reports`

पैकेज रिपोर्ट प्राप्त करने के लिए मॉडरेटर/एडमिन एंडपॉइंट।

प्रमाणीकरण:

* मॉडरेटर या एडमिन उपयोगकर्ता के लिए API टोकन आवश्यक है।

क्वेरी पैरामीटर:

* `status` (वैकल्पिक): `open` (डिफ़ॉल्ट), `confirmed`, `dismissed`, या `all`
* `limit` (वैकल्पिक): पूर्णांक (1-100)
* `cursor` (वैकल्पिक): पृष्ठांकन कर्सर

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "items": [
    {
      "reportId": "packageReports:...",
      "packageId": "packages:...",
      "releaseId": "packageReleases:...",
      "name": "@openclaw/example-plugin",
      "displayName": "उदाहरण Plugin",
      "family": "code-plugin",
      "version": "1.2.3",
      "reason": "संदिग्ध नेटिव बाइनरी",
      "status": "open",
      "createdAt": 1730000000000,
      "reporter": {
        "userId": "users:...",
        "handle": "reporter",
        "displayName": "रिपोर्टकर्ता"
      },
      "triagedAt": null,
      "triagedBy": null,
      "triageNote": null
    }
  ],
  "nextCursor": null,
  "done": true
}
```

### `GET /api/v1/packages/{name}/moderation`

पैकेज मॉडरेशन दृश्यता के लिए स्वामी/मॉडरेटर एंडपॉइंट।

प्रमाणीकरण:

* पैकेज स्वामी, प्रकाशक सदस्य, मॉडरेटर या
  एडमिन उपयोगकर्ता के लिए API टोकन आवश्यक है।

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "package": {
    "packageId": "packages:...",
    "name": "@openclaw/example-plugin",
    "displayName": "उदाहरण Plugin",
    "family": "code-plugin",
    "channel": "community",
    "isOfficial": false,
    "reportCount": 2,
    "lastReportedAt": 1730000001000,
    "scanStatus": "malicious"
  },
  "latestRelease": {
    "releaseId": "packageReleases:...",
    "version": "1.2.3",
    "artifactKind": "npm-pack",
    "scanStatus": "malicious",
    "moderationState": "quarantined",
    "moderationReason": "मैन्युअल समीक्षा",
    "blockedFromDownload": true,
    "reasons": ["manual:quarantined", "scan:malicious", "reports:2"],
    "createdAt": 1730000000000
  }
}
```

### `POST /api/v1/packages/reports/{reportId}/triage`

पैकेज रिपोर्ट का समाधान करने या उन्हें फिर से खोलने के लिए मॉडरेटर/एडमिन एंडपॉइंट।

अनुरोध:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "status": "confirmed",
  "note": "समीक्षा की गई और प्रभावित रिलीज़ को क्वारंटीन किया गया।",
  "finalAction": "quarantine"
}
```

`note`, `confirmed` और `dismissed` के लिए आवश्यक है; `status` को वापस
`open` पर सेट करते समय इसे छोड़ा जा सकता है। उसी ऑडिट-योग्य कार्यप्रवाह में रिलीज़ मॉडरेशन लागू करने के लिए
पुष्टि की गई रिपोर्ट के साथ `finalAction: "quarantine"` या
`finalAction: "revoke"` पास करें।

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "ok": true,
  "reportId": "packageReports:...",
  "packageId": "packages:...",
  "status": "confirmed",
  "reportCount": 0
}
```

### `POST /api/v1/packages/{name}/versions/{version}/moderation`

पैकेज रिलीज़ समीक्षा के लिए मॉडरेटर/एडमिन एंडपॉइंट।

अनुरोध:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "state": "quarantined", "reason": "संदिग्ध नेटिव पेलोड।" }
```

समर्थित स्थितियाँ:

* `approved`: मैन्युअल रूप से समीक्षा की गई और अनुमति दी गई।
* `quarantined`: आगे की कार्रवाई तक अवरुद्ध।
* `revoked`: किसी रिलीज़ पर पहले भरोसा किए जाने के बाद अवरुद्ध।

क्वारंटीन और निरस्त की गई रिलीज़ आर्टिफ़ैक्ट डाउनलोड रूट से `403` लौटाती हैं।
प्रत्येक परिवर्तन एक ऑडिट लॉग प्रविष्टि लिखता है।

### `GET /api/v1/packages/{name}/file`

संग्रहीत पैकेज फ़ाइल के सटीक बाइट्स डाउनलोड के रूप में लौटाता है। Skills फ़ाइलों के लिए उपयोग किए जाने वाले समान सीमित
UTF-8 टेक्स्ट पूर्वावलोकन का अनुरोध करने हेतु `preview=1` जोड़ें।

क्वेरी पैरामीटर:

* `path` (आवश्यक)
* `version` (वैकल्पिक)
* `tag` (वैकल्पिक)
* `preview=1` (वैकल्पिक; बाइट्स के मान्य UTF-8 न होने पर `text/plain` या `415` लौटाता है)

टिप्पणियाँ:

* डिफ़ॉल्ट रूप से नवीनतम रिलीज़ का उपयोग करता है।
* डाउनलोड बकेट के बजाय रीड दर बकेट का उपयोग करता है।
* रॉ डाउनलोड सीमा: 10MB।
* टेक्स्ट पूर्वावलोकन सीमा: 200KB; अपारदर्शी फ़ाइलें केवल पूर्वावलोकन अनुरोधों के लिए `415` लौटाती हैं।
* लंबित VirusTotal स्कैन रीड को अवरुद्ध नहीं करते; दुर्भावनापूर्ण रिलीज़ अब भी कहीं और रोकी जा सकती हैं।
* निजी पैकेज `404` लौटाते हैं, जब तक कि कॉलर स्वामी प्रकाशक को पढ़ न सकता हो।

### `GET /api/v1/packages/{name}/download`

किसी पैकेज रिलीज़ के लिए पुराना नियतात्मक ZIP संग्रह डाउनलोड करता है।

क्वेरी पैरामीटर:

* `version` (वैकल्पिक)
* `tag` (वैकल्पिक)

टिप्पणियाँ:

* डिफ़ॉल्ट रूप से नवीनतम रिलीज़ का उपयोग करता है।
* Skills को `GET /api/v1/download` पर रीडायरेक्ट किया जाता है।
* Plugin/पैकेज संग्रह ऐसी zip फ़ाइलें हैं जिनमें `package/` रूट होता है, ताकि पुराने OpenClaw
  क्लाइंट काम करते रहें।
* यह रूट केवल ZIP के लिए रहता है। यह ClawPack `.tgz` फ़ाइलें स्ट्रीम नहीं करता।
* रिज़ॉल्वर अखंडता जाँच के लिए प्रतिक्रियाओं में `ETag`, `Digest`, `X-ClawHub-Artifact-Type`, और
  `X-ClawHub-Artifact-Sha256` हेडर शामिल होते हैं।
* केवल रजिस्ट्री वाला मेटाडेटा डाउनलोड किए गए संग्रह में इंजेक्ट नहीं किया जाता।
* लंबित VirusTotal स्कैन डाउनलोड अवरुद्ध नहीं करते; दुर्भावनापूर्ण रिलीज़ `403` लौटाती हैं।
* निजी पैकेज `404` लौटाते हैं, जब तक कि कॉलर स्वामी न हो।

### `GET /api/npm/{package}`

ClawPack-समर्थित पैकेज संस्करणों के लिए npm-संगत पैक्यूमेंट लौटाता है।

टिप्पणियाँ:

* केवल अपलोड किए गए ClawPack npm-pack टारबॉल वाले संस्करण सूचीबद्ध होते हैं।
* पुराने केवल-ZIP संस्करण जानबूझकर छोड़े जाते हैं।
* `dist.tarball`, `dist.integrity`, और `dist.shasum` npm-संगत
  फ़ील्ड का उपयोग करते हैं, ताकि उपयोगकर्ता चाहें तो npm को मिरर पर इंगित कर सकें।
* स्कोप किए गए पैकेज पैक्यूमेंट `/api/npm/@scope/name` और npm के
  एन्कोड किए गए `/api/npm/@scope%2Fname` अनुरोध पथ, दोनों का समर्थन करते हैं।

### `GET /api/npm/{package}/-/{tarball}.tgz`

npm मिरर क्लाइंट के लिए अपलोड किए गए सटीक ClawPack टारबॉल बाइट्स स्ट्रीम करता है।

टिप्पणियाँ:

* डाउनलोड दर बकेट का उपयोग करता है।
* डाउनलोड हेडर में ClawHub SHA-256 के साथ npm अखंडता/shasum मेटाडेटा शामिल होता है।
* मॉडरेशन और निजी पैकेज अभिगम जाँच अब भी लागू होती हैं।

### `GET /api/v1/resolve`

किसी स्थानीय फ़िंगरप्रिंट को ज्ञात संस्करण से मैप करने के लिए CLI द्वारा उपयोग किया जाता है।

क्वेरी पैरामीटर:

* `slug` (आवश्यक)
* `hash` (आवश्यक): बंडल फ़िंगरप्रिंट का 64-वर्णीय हेक्स sha256

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "slug": "gifgrep", "match": { "version": "1.2.2" }, "latestVersion": { "version": "1.2.3" } }
```

### `GET /api/v1/download`

होस्ट किए गए skill संस्करण की ZIP डाउनलोड करता है, या ऐसे मौजूदा GitHub-समर्थित skill के लिए GitHub स्रोत हैंडऑफ़ लौटाता है जिसकी `clean` या `suspicious` स्कैन स्थिति हो और जिसका कोई होस्ट किया गया संस्करण न हो।

क्वेरी पैरामीटर:

* `slug` (आवश्यक)
* `version` (वैकल्पिक): semver स्ट्रिंग
* `tag` (वैकल्पिक): टैग नाम (उदा. `latest`)

टिप्पणियाँ:

* यदि न तो `version` और न ही `tag` दिया गया है, तो नवीनतम संस्करण का उपयोग किया जाता है।
* सॉफ़्ट-डिलीट किए गए संस्करण `410` लौटाते हैं।
* GitHub-समर्थित skill हैंडऑफ़ बाइट्स को प्रॉक्सी या मिरर नहीं करते। JSON प्रतिक्रिया में
  `sourceRef: "public-github"`, `repo`, `commit`, `path`, `contentHash`,
  और `archiveUrl` शामिल होते हैं; स्कैन/वर्तमान स्थिति एक गेट है और सफल
  पेलोड मेटाडेटा के रूप में शामिल नहीं होती।
* डाउनलोड आँकड़े प्रति UTC दिन विशिष्ट पहचानों के रूप में गिने जाते हैं (API टोकन मान्य होने पर `userId`, अन्यथा IP)।

## प्रमाणीकरण एंडपॉइंट (Bearer टोकन)

सभी एंडपॉइंट के लिए आवश्यक है:

```
Authorization: Bearer clh_...
```

### `GET /api/v1/whoami`

टोकन सत्यापित करता है और उपयोगकर्ता हैंडल लौटाता है।

### `POST /api/v1/skills`

नया संस्करण प्रकाशित करता है।

* वरीय: `multipart/form-data`, `payload` JSON + `files[]` ब्लॉब्स के साथ।
* `files` (storageId-आधारित) वाला JSON बॉडी भी स्वीकार किया जाता है।
* वैकल्पिक पेलोड फ़ील्ड: `ownerHandle`। मौजूद होने पर, API उस
  प्रकाशक को सर्वर की ओर से रिज़ॉल्व करता है और कर्ता के पास प्रकाशक पहुँच होना आवश्यक बनाता है।
* वैकल्पिक पेलोड फ़ील्ड: `migrateOwner`। `ownerHandle` के साथ `true` होने पर,
  किसी मौजूदा skill को उस स्वामी के पास स्थानांतरित किया जा सकता है, यदि कर्ता वर्तमान
  और लक्षित दोनों प्रकाशकों पर एडमिन/स्वामी हो। इस स्पष्ट सहमति के बिना, स्वामी परिवर्तन
  अस्वीकार कर दिए जाते हैं।

### `POST /api/v1/packages`

code-plugin या bundle-plugin रिलीज़ प्रकाशित करता है।

* Bearer टोकन प्रमाणीकरण आवश्यक है।
* `multipart/form-data` आवश्यक है।
* अनुमत फ़ॉर्म फ़ील्ड हैं `payload`, दोहराए गए `files` ब्लॉब्स, या एक `clawpack`
  टारबॉल संदर्भ। `clawpack` एक `.tgz` ब्लॉब या
  upload-url प्रवाह द्वारा लौटाई गई स्टोरेज आईडी हो सकता है। चरणबद्ध स्टोरेज-आईडी प्रकाशनों में उस
  अपलोड URL के साथ लौटाया गया `clawpackUploadTicket` भी शामिल होना चाहिए।
* या तो `files` या `clawpack` का उपयोग करें, एक ही अनुरोध में दोनों का कभी नहीं।
* JSON बॉडी और कॉलर द्वारा दिए गए `payload.files` / `payload.artifact`
  मेटाडेटा अस्वीकार किए जाते हैं।
* प्रत्यक्ष multipart प्रकाशन अनुरोधों की सीमा 18MB है। ClawPack टारबॉल
  120MB टारबॉल सीमा तक upload-url प्रवाह का उपयोग कर सकते हैं।
* वैकल्पिक पेलोड फ़ील्ड: `ownerHandle`। मौजूद होने पर, केवल एडमिन उस स्वामी की ओर से प्रकाशित कर सकते हैं।

सत्यापन की मुख्य बातें:

* `family` का `code-plugin` या `bundle-plugin` होना आवश्यक है।
* Plugin पैकेजों के लिए `openclaw.plugin.json` आवश्यक है। ClawPack `.tgz` अपलोड में
  यह `package/openclaw.plugin.json` पर होना चाहिए।
* कोड Plugin के लिए `package.json`, स्रोत रिपॉज़िटरी मेटाडेटा, स्रोत कमिट
  मेटाडेटा, कॉन्फ़िग स्कीमा मेटाडेटा, `openclaw.compat.pluginApi`, और
  `openclaw.build.openclawVersion` आवश्यक हैं।
* `openclaw.hostTargets` और `openclaw.environment` वैकल्पिक मेटाडेटा हैं।
* केवल `openclaw` संगठन प्रकाशक और वर्तमान `openclaw` संगठन सदस्यों के
  व्यक्तिगत प्रकाशक `official` चैनल पर प्रकाशित कर सकते हैं।
* किसी की ओर से किए गए प्रकाशन भी लक्षित स्वामी खाते के विरुद्ध आधिकारिक-चैनल पात्रता सत्यापित करते हैं।

### `DELETE /api/v1/skills/{slug}` / `POST /api/v1/skills/{slug}/undelete`

किसी skill को सॉफ़्ट-डिलीट / पुनर्स्थापित करें (स्वामी, मॉडरेटर या एडमिन)।

वैकल्पिक JSON बॉडी:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "reason": "कानूनी समीक्षा लंबित होने के कारण मॉडरेशन हेतु रोका गया।" }
```

मौजूद होने पर, `reason` को skill मॉडरेशन टिप्पणी के रूप में संग्रहीत किया जाता है और ऑडिट लॉग में कॉपी किया जाता है।
स्वामी द्वारा आरंभ किए गए सॉफ़्ट डिलीट स्लग को 30 दिनों के लिए आरक्षित रखते हैं, जिसके बाद
कोई अन्य प्रकाशक उस स्लग का दावा कर सकता है। यह समाप्ति लागू होने पर डिलीट प्रतिक्रिया में `slugReservedUntil` शामिल होता है।
मॉडरेटर/एडमिन द्वारा छिपाना और सुरक्षा निष्कासन इस प्रकार समाप्त नहीं होते।

डिलीट प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "ok": true, "slugReservedUntil": 1730000000000 }
```

स्थिति कोड:

* `200`: ठीक
* `401`: अनधिकृत
* `403`: निषिद्ध
* `404`: skill/उपयोगकर्ता नहीं मिला
* `500`: आंतरिक सर्वर त्रुटि

### `POST /api/v1/users/publisher`

केवल एडमिन। सुनिश्चित करता है कि किसी हैंडल के लिए संगठन प्रकाशक मौजूद हो। यदि हैंडल अब भी किसी
पुराने साझा उपयोगकर्ता/व्यक्तिगत प्रकाशक की ओर संकेत करता है, तो एंडपॉइंट पहले उसे संगठन प्रकाशक में माइग्रेट करता है।
नव-निर्मित संगठन के लिए `memberHandle` दें; कार्यरत एडमिन को सदस्य के रूप में नहीं जोड़ा जाता।
`memberRole` का डिफ़ॉल्ट `owner` है।

* बॉडी: `{ "handle": "openclaw", "displayName": "OpenClaw", "memberHandle": "alice", "memberRole": "owner", "trusted": true }`
* प्रतिक्रिया: `{ "ok": true, "publisherId": "...", "handle": "openclaw", "created": true, "migrated": false, "trusted": true, "member": { "userId": "...", "handle": "alice", "role": "owner" } }`

### `POST /api/v1/publishers`

प्रमाणीकृत स्वयं-सेवा संगठन प्रकाशक निर्माण। नया संगठन प्रकाशक बनाता है और
कॉलर को स्वामी के रूप में जोड़ता है। यह एंडपॉइंट मौजूदा उपयोगकर्ता/व्यक्तिगत हैंडल माइग्रेट नहीं करता और
प्रकाशक को विश्वसनीय/आधिकारिक चिह्नित नहीं करता।

* बॉडी: `{ "handle": "opik", "displayName": "Opik" }`
* प्रतिक्रिया: `{ "ok": true, "publisherId": "...", "handle": "opik", "created": true, "trusted": false }`
* यदि हैंडल पहले से किसी प्रकाशक, उपयोगकर्ता या व्यक्तिगत प्रकाशक द्वारा उपयोग किया जा रहा हो, तो `409` लौटाता है।

### `POST /api/v1/users/reserve`

केवल एडमिन। रिलीज़ प्रकाशित किए बिना वास्तविक स्वामी के लिए रूट स्लग और पैकेज नाम आरक्षित करता है।
पैकेज नाम बिना किसी रिलीज़ पंक्ति वाले निजी प्लेसहोल्डर पैकेज बन जाते हैं, ताकि वही
स्वामी बाद में उस नाम में वास्तविक code-plugin या bundle-plugin रिलीज़ प्रकाशित कर सके।

* बॉडी: `{ "handle": "openclaw", "slugs": ["diffs"], "packageNames": ["@openclaw/diffs"], "reason": "reserved for official OpenClaw plugin" }`
* प्रतिक्रिया: `{ "ok": true, "succeeded": 2, "failed": 0, "results": [{ "kind": "slug", "name": "diffs", "ok": true, "action": "reserved" }] }`

### `POST /api/v1/users/publisher-recovery`

केवल एडमिन। Convex Auth खाता पंक्तियों को संपादित किए बिना सत्यापित प्रतिस्थापन GitHub OAuth प्रिंसिपल के लिए
व्यक्तिगत प्रकाशक पुनर्प्राप्त करता है। अनुरोध में दोनों अपरिवर्तनीय GitHub
प्रदाता खाता आईडी का उल्लेख होना चाहिए; परिवर्तनशील हैंडल केवल ऑपरेटर-सामना करने वाले गार्ड के रूप में उपयोग किए जाते हैं।

एंडपॉइंट का डिफ़ॉल्ट dry-run है। पुनर्प्राप्ति लागू करने के लिए कर्मचारियों द्वारा दोनों
GitHub प्रिंसिपल के बीच निरंतरता का स्वतंत्र रूप से सत्यापन करने के बाद `dryRun: false` और
`confirmIdentityVerified: true` आवश्यक हैं। यदि गंतव्य उपयोगकर्ता के वर्तमान व्यक्तिगत
प्रकाशक के पास skills, पैकेज या GitHub skill स्रोत हों, तो पुनर्प्राप्ति बंद स्थिति में विफल होती है।
पुनर्प्राप्ति, पुनर्प्राप्त प्रकाशक के skills, skill स्लग उपनामों, पैकेजों,
पैकेज इंस्पेक्टर चेतावनियों और व्युत्पन्न खोज डाइजेस्ट पंक्तियों के लिए पुराने `ownerUserId` फ़ील्ड भी माइग्रेट करती है, ताकि
प्रत्यक्ष-स्वामी पथ नई प्रकाशक प्राधिकृति से सहमत हों। पुनर्प्राप्त हैंडल का एक सक्रिय संरक्षित-हैंडल
आरक्षण भी प्रतिस्थापन उपयोगकर्ता को पुनः सौंप दिया जाता है, ताकि बाद का
प्रोफ़ाइल सिंक्रनाइज़ेशन पूर्व उपयोगकर्ता की प्रतिस्पर्धी प्राधिकृति पुनर्स्थापित न कर सके। प्रत्येक प्राथमिक तालिका
प्रति लागू लेनदेन 100 पंक्तियों तक सीमित है; बड़ी पुनर्प्राप्तियों को पहले पुनः आरंभ किए जा सकने वाले स्वामी माइग्रेशन का उपयोग करना चाहिए।
GitHub skill स्रोत प्रकाशक-स्कोप वाले होते हैं और पुनर्लिखित किए जाने के बजाय जाँचे गए के रूप में रिपोर्ट किए जाते हैं।

* बॉडी: `{ "handle": "gingiris", "nextUserHandle": "gingiris-1031", "previousGitHubProviderAccountId": "123", "nextGitHubProviderAccountId": "456", "reason": "Verified account continuity for issue #2555", "confirmIdentityVerified": true, "dryRun": false }`
* प्रतिक्रिया: `{ "ok": true, "dryRun": false, "recovered": true, "publisherId": "...", "handle": "gingiris", "previousUser": { "userId": "...", "handle": "gingiris", "nextHandle": "gingiris-recovered", "githubProviderAccountId": "123", "authAccountCount": 1 }, "nextUser": { "userId": "...", "handle": "gingiris-1031", "nextHandle": "gingiris", "githubProviderAccountId": "456", "authAccountCount": 1 }, "retiredPersonalPublisher": null, "resourceOwnerMigration": { "limitPerTable": 100, "skills": 1, "skillSlugAliases": 1, "packages": 0, "packageInspectorWarnings": 0, "githubSourcesChecked": 1, "handleReservations": 1 }, "identityVerified": true, "reason": "Verified account continuity for issue #2555" }`

### स्वामी स्लग प्रबंधन एंडपॉइंट

* `POST /api/v1/skills/{slug}/rename`
  * बॉडी: `{ "newSlug": "new-canonical-slug" }`
  * प्रतिक्रिया: `{ "ok": true, "slug": "new-canonical-slug", "previousSlug": "old-slug" }`
* `POST /api/v1/skills/{slug}/merge`
  * बॉडी: `{ "targetSlug": "canonical-target-slug" }`
  * प्रतिक्रिया: `{ "ok": true, "sourceSlug": "old-slug", "targetSlug": "canonical-target-slug" }`

टिप्पणियाँ:

* दोनों एंडपॉइंट के लिए API टोकन प्रमाणीकरण आवश्यक है और वे केवल skill स्वामी के लिए काम करते हैं।
* `rename` पिछले स्लग को रीडायरेक्ट उपनाम के रूप में सुरक्षित रखता है।
* `merge` स्रोत सूची को छिपाता है और स्रोत स्लग को लक्षित सूची पर रीडायरेक्ट करता है।

### स्वामित्व हस्तांतरण एंडपॉइंट

* `POST /api/v1/skills/{slug}/transfer`
  * बॉडी: `{ "toUserHandle": "target_handle", "message": "optional" }`
  * प्रतिक्रिया: `{ "ok": true, "transferId": "skillOwnershipTransfers:...", "toUserHandle": "target_handle", "expiresAt": 1730000000000 }`
* `POST /api/v1/skills/{slug}/transfer/accept`
* `POST /api/v1/skills/{slug}/transfer/reject`
* `POST /api/v1/skills/{slug}/transfer/cancel`
  * प्रतिक्रिया (स्वीकार/अस्वीकार/रद्द): `{ "ok": true, "skillSlug": "demo-skill?" }`
* `GET /api/v1/transfers/incoming`
* `GET /api/v1/transfers/outgoing`
  * प्रतिक्रिया संरचना: `{ "transfers": [{ "_id": "...", "skill": { "slug": "demo", "displayName": "Demo" }, "fromUser"|"toUser": { "handle": "..." }, "message": "...", "requestedAt": 0, "expiresAt": 0 }] }`

### `POST /api/v1/users/ban`

किसी उपयोगकर्ता को प्रतिबंधित करें और उसके स्वामित्व वाले skills स्थायी रूप से हटाएँ (केवल मॉडरेटर/एडमिन)।

बॉडी:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "handle": "user_handle", "reason": "वैकल्पिक प्रतिबंध कारण" }
```

या

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "userId": "users_...", "reason": "वैकल्पिक प्रतिबंध कारण" }
```

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "ok": true, "alreadyBanned": false, "deletedSkills": 3 }
```

### `POST /api/v1/users/unban`

किसी उपयोगकर्ता का प्रतिबंध हटाएँ और पात्र skills पुनर्स्थापित करें (केवल एडमिन)।

बॉडी:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "handle": "user_handle", "reason": "वैकल्पिक प्रतिबंध हटाने का कारण" }
```

या

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "userId": "users_...", "reason": "वैकल्पिक प्रतिबंध हटाने का कारण" }
```

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "ok": true, "alreadyUnbanned": false, "restoredSkills": 3 }
```

### `POST /api/v1/users/reclassify-ban`

प्रतिबंध हटाए या सामग्री पुनर्स्थापित किए बिना किसी मौजूदा प्रतिबंध का संग्रहीत कारण बदलें
(केवल एडमिन)। जब तक `dryRun`, `false` न हो, डिफ़ॉल्ट dry-run है।

बॉडी:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "handle": "user_handle", "reason": "थोक प्रकाशन स्पैम", "dryRun": true }
```

या

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "userId": "users_...", "reason": "थोक प्रकाशन स्पैम", "dryRun": false }
```

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "ok": true,
  "dryRun": false,
  "userId": "users_...",
  "handle": "user_handle",
  "previousReason": "मैलवेयर स्वतः-प्रतिबंध",
  "nextReason": "थोक प्रकाशन स्पैम",
  "changed": true
}
```

### `POST /api/v1/users/role`

उपयोगकर्ता भूमिका बदलें (केवल एडमिन)।

बॉडी:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "handle": "user_handle", "role": "moderator" }
```

या

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "userId": "users_...", "role": "admin" }
```

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "ok": true, "role": "moderator" }
```

### `GET /api/v1/users`

उपयोगकर्ताओं को सूचीबद्ध करें या खोजें (केवल एडमिन)।

क्वेरी पैरामीटर:

* `q` (वैकल्पिक): खोज क्वेरी
* `query` (वैकल्पिक): `q` का उपनाम
* `limit` (वैकल्पिक): अधिकतम परिणाम (डिफ़ॉल्ट 20, अधिकतम 200)

प्रतिक्रिया:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  "items": [
    {
      "userId": "users_...",
      "handle": "user_handle",
      "displayName": "उपयोगकर्ता",
      "name": "उपयोगकर्ता",
      "role": "moderator"
    }
  ],
  "total": 1
}
```

### `POST /api/v1/stars/{slug}` / `DELETE /api/v1/stars/{slug}`

Bookmark जोड़ें/हटाएँ। संगतता के लिए पुराना `stars` रूट और प्रतिक्रिया फ़ील्ड नाम बने हुए हैं।
दोनों एंडपॉइंट idempotent हैं।

प्रतिक्रियाएँ:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "ok": true, "starred": true, "alreadyStarred": false }
```

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "ok": true, "unstarred": true, "alreadyUnstarred": false }
```

## पुराने CLI एंडपॉइंट (अप्रचलित)

पुराने CLI संस्करणों के लिए अब भी समर्थित:

* `GET /api/cli/whoami`
* `POST /api/cli/upload-url`
* `POST /api/cli/publish`
* `POST /api/cli/telemetry/install`
* `POST /api/cli/skill/delete`
* `POST /api/cli/skill/undelete`

हटाने की योजना के लिए `DEPRECATIONS.md` देखें।

`POST /api/cli/upload-url`, `uploadUrl` और `uploadTicket` लौटाता है। ऐसे पैकेज
प्रकाशन जो ClawPack टारबॉल को चरणबद्ध करते हैं, उन्हें परिणामी स्टोरेज आईडी
`clawpack` के रूप में और लौटाया गया टिकट `clawpackUploadTicket` के रूप में भेजना आवश्यक है।

## रजिस्ट्री खोज (`/.well-known/clawhub.json`)

CLI साइट से रजिस्ट्री/प्रमाणीकरण सेटिंग्स खोज सकता है:

* `/.well-known/clawhub.json` (JSON, वरीय)
* `/.well-known/clawdhub.json` (पुराना)

स्कीमा:

```json theme={"theme":{"light":"min-light","dark":"min-dark"}}
{ "apiBase": "https://clawhub.ai", "authBase": "https://clawhub.ai", "minCliVersion": "0.0.5" }
```

यदि आप स्वयं होस्ट करते हैं, तो यह फ़ाइल सर्व करें (या `CLAWHUB_REGISTRY` स्पष्ट रूप से सेट करें; पुराना `CLAWDHUB_REGISTRY`)।
