Loslegen
HTTP-API
HTTP-API
Basis-URL: https://clawhub.ai (Standard).
Alle v1-Pfade befinden sich unter /api/v1/....
Die veralteten Pfade /api/... und /api/cli/... bleiben aus Kompatibilitätsgründen erhalten (siehe DEPRECATIONS.md).
OpenAPI: /api/v1/openapi.json.
Wiederverwendung des öffentlichen Katalogs
Drittanbieter-Verzeichnisse dürfen die öffentlichen Lese-Endpunkte verwenden, um ClawHub-Skills aufzulisten oder zu durchsuchen. Bitte speichern Sie Ergebnisse im Cache, beachten Sie 429/Retry-After, verlinken Sie Benutzer zurück zum kanonischen ClawHub-Eintrag (https://clawhub.ai/<owner>/skills/<slug>) und vermeiden Sie den Eindruck, ClawHub unterstütze die Drittanbieter-Website. Versuchen Sie nicht, verborgene, private oder durch die Moderation blockierte Inhalte außerhalb der öffentlichen API-Oberfläche zu spiegeln.
Web-Slug-Kurzformen werden über Registry-Familien hinweg aufgelöst, API-Clients sollten jedoch die von Lese-Endpunkten zurückgegebenen kanonischen URLs verwenden, anstatt die Routenpriorität zu rekonstruieren.
Ratenbegrenzungen
Durchsetzungsmodell:
-
Anonyme Anfragen: Durchsetzung pro IP-Adresse.
-
Authentifizierte Anfragen (gültiges Bearer-Token): Durchsetzung pro Benutzer-Bucket.
-
Wenn das Token fehlt oder ungültig ist, fällt das Verhalten auf die Durchsetzung pro IP-Adresse zurück.
-
Authentifizierte Schreib-Endpunkte sollten kein bloßes
Unauthorizedzurückgeben, wenn dem Server der Grund bekannt ist. Fehlende Tokens, ungültige/widerrufene Tokens und gelöschte/gesperrte/deaktivierte Konten sollten jeweils einen handlungsorientierten Text erhalten, damit CLI- Clients den Benutzern mitteilen können, wodurch sie blockiert wurden. -
Lesen: 3000/min pro IP-Adresse, 12000/min pro Schlüssel
-
Schreiben: 300/min pro IP-Adresse, 3000/min pro Schlüssel
-
Download: 1200/min pro IP-Adresse, 6000/min pro Schlüssel (Download-Endpunkte)
Header:
- Abwärtskompatibilität:
X-RateLimit-Limit,X-RateLimit-Reset - Standardisiert:
RateLimit-Limit,RateLimit-Reset - Bei
429:X-RateLimit-Remaining: 0undRateLimit-Remaining: 0 - Bei
429:Retry-After
Header-Semantik:
X-RateLimit-Reset: absolute Unix-Epochenzeit in SekundenRateLimit-Reset: Sekunden bis zum Zurücksetzen (Verzögerung)X-RateLimit-Remaining/RateLimit-Remaining: exakt verbleibendes Kontingent, sofern vorhanden. Erfolgreiche Shard-Anfragen lassen diesen Header weg, anstatt einen ungefähren globalen Wert zurückzugeben.Retry-After: Wartezeit in Sekunden vor einem erneuten Versuch (Verzögerung) bei429
Beispielantwort für 429:
HTTP/2 429content-type: text/plain; charset=utf-8x-ratelimit-limit: 20x-ratelimit-remaining: 0x-ratelimit-reset: 1771404540ratelimit-limit: 20ratelimit-remaining: 0ratelimit-reset: 34retry-after: 34 Ratenbegrenzung überschrittenHinweise für Clients:
- Wenn
Retry-Aftervorhanden ist, warten Sie vor dem erneuten Versuch entsprechend viele Sekunden. - Verwenden Sie einen mit Zufallsabweichung versehenen Backoff, um synchronisierte Wiederholungsversuche zu vermeiden.
- Wenn
Retry-Afterfehlt, greifen Sie aufRateLimit-Resetzurück (oder berechnen Sie den Wert anhand vonX-RateLimit-Reset).
IP-Quelle:
- Verwendet vertrauenswürdige Client-IP-Header, einschließlich
cf-connecting-ip, nur wenn die Bereitstellung vertrauenswürdige weitergeleitete Header ausdrücklich aktiviert. - ClawHub verwendet vertrauenswürdige Weiterleitungs-Header, um Client-IP-Adressen am Edge zu ermitteln.
- Wenn keine vertrauenswürdige Client-IP-Adresse verfügbar ist, verwenden anonyme Anfragen Fallback-Buckets, deren Geltungsbereich ausschließlich durch die Art der Ratenbegrenzung bestimmt wird. Diese Fallback-Buckets enthalten keine vom Aufrufer bereitgestellten Pfade, Slugs, Paketnamen, Versionen, Abfragezeichenfolgen oder anderen Artefaktparameter.
Fehlerantworten
Öffentliche v1-Fehlerantworten sind Klartext mit content-type: text/plain; charset=utf-8.
Dazu gehören Validierungsfehler (400), fehlende öffentliche Ressourcen (404), Authentifizierungs- und
Berechtigungsfehler (401/403), Ratenbegrenzungen (429) und blockierte Downloads. Clients
sollten den Antworttext als menschenlesbare Zeichenfolge auslesen. Unbekannte Abfrageparameter werden
aus Kompatibilitätsgründen ignoriert, erkannte Abfrageparameter mit ungültigen Werten geben jedoch
400 zurück.
Öffentliche Endpunkte (keine Authentifizierung)
GET /api/v1/search
Abfrageparameter:
q(erforderlich): Abfragezeichenfolgelimit(optional): GanzzahlhighlightedOnly(optional):true, um nach hervorgehobenen Skills zu filternnonSuspiciousOnly(optional):true, um verdächtige (flagged.suspicious) Skills auszublendennonSuspicious(optional): veralteter Alias fürnonSuspiciousOnly
Antwort:
{ "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" } } ]}Hinweise:
- Ergebnisse werden nach Relevanz sortiert zurückgegeben (Ähnlichkeit der Einbettungen + Verstärkungen für exakte Slug-/Namenstoken + eine geringe vorherige Gewichtung der Popularität).
- Die Relevanz wird stärker gewichtet als die Popularität. Eine genaue Übereinstimmung mit einem Slug- oder Anzeigenamen-Token kann eine ungenauere Übereinstimmung mit deutlich stärkerer Interaktion übertreffen.
- ASCII-Text wird an Wort- und Interpunktionsgrenzen tokenisiert. Beispielsweise enthält
personal-mapein eigenständigesmap-Token, währendamap-jsapi-skilldie Tokensamap,jsapiundskillenthält; eine Suche nachmapergibt daher fürpersonal-mapeine stärkere lexikalische Übereinstimmung als füramap-jsapi-skill. - Die Popularität wird logarithmisch skaliert und gedeckelt. Skills mit hoher Interaktion können niedriger eingestuft werden, wenn der Abfragetext weniger gut übereinstimmt.
- Ein verdächtiger oder verborgener Moderationsstatus kann abhängig von den Aufruferfiltern und dem aktuellen Moderationsstatus dazu führen, dass ein Skill aus der öffentlichen Suche entfernt wird.
Hinweise zur Auffindbarkeit für Herausgeber:
- Nehmen Sie die Begriffe, nach denen Benutzer tatsächlich suchen werden, in den Anzeigenamen, die Zusammenfassung und die Tags auf. Verwenden Sie ein eigenständiges Slug-Token nur, wenn es zugleich eine stabile Identität darstellt, die Sie beibehalten möchten.
- Benennen Sie einen Slug nicht nur um, um eine einzelne Abfrage zu bedienen, es sei denn, der neue Slug ist langfristig ein besserer kanonischer Name. Alte Slugs werden zu Weiterleitungsaliasen, aber die kanonische URL, der angezeigte Slug und zukünftige Suchübersichten verwenden den neuen Slug.
- Umbenennungsaliase bewahren die Auflösung für alte URLs und Installationen, die über die Registry aufgelöst werden, die Suchrangfolge basiert jedoch nach der Indizierung der Umbenennung auf den kanonischen Skill-Metadaten. Bestehende Statistiken bleiben dem Skill zugeordnet.
- Wenn ein Skill unerwartet unsichtbar ist, prüfen Sie im angemeldeten Zustand zunächst den Moderationsstatus mit
clawhub inspect @owner/slug, bevor Sie rangfolgerelevante Metadaten ändern.
GET /api/v1/skills
Abfrageparameter:
limit(optional): Ganzzahl (1–200)cursor(optional): Paginierungscursor für jede Sortierung außertrendingsort(optional):updated(Standard),recommended(Alias:default),createdAt(Alias:newest),downloads,stars(Alias:rating), die veralteten InstallationsaliaseinstallsCurrent/installs/installsAllTimewerdendownloads,trendingzugeordnetnonSuspiciousOnly(optional):true, um verdächtige (flagged.suspicious) Skills auszublendennonSuspicious(optional): veralteter Alias fürnonSuspiciousOnly
Ungültige sort-Werte geben 400 zurück.
Hinweise:
recommendedverwendet Interaktions- und Aktualitätssignale.trendingsortiert nach Installationen in den letzten 7 Tagen (telemetriebasiert).createdAtist für Crawls neuer Skills stabil;updatedändert sich, wenn bestehende Skills erneut veröffentlicht werden.- Bei
nonSuspiciousOnly=truekönnen cursorbasierte Sortierungen weniger alslimitElemente auf einer Seite zurückgeben, da verdächtige Skills erst nach dem Abruf der Seite herausgefiltert werden. - Verwenden Sie
nextCursor, sofern vorhanden, um die Paginierung fortzusetzen. Eine kurze Seite bedeutet für sich genommen nicht, dass das Ende der Ergebnisse erreicht ist.
Antwort:
{ "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}
Antwort:
{ "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 }}Hinweise:
- Alte Slugs, die durch Umbenennungs-/Zusammenführungsabläufe des Eigentümers erstellt wurden, werden zum kanonischen Skill aufgelöst.
metadata.os: im Skill-Frontmatter deklarierte Betriebssystemeinschränkungen (z. B.["macos"],["linux"]).null, wenn nicht deklariert.metadata.systems: Nix-Systemziele (z. B.["aarch64-darwin", "x86_64-linux"]).null, wenn nicht deklariert.metadataistnull, wenn der Skill keine Plattformmetadaten besitzt.moderationist nur enthalten, wenn der Skill markiert wurde oder der Eigentümer ihn aufruft.
GET /api/v1/skills/{slug}/moderation
Gibt den strukturierten Moderationsstatus zurück.
Antwort:
{ "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": "" } ] }}Hinweise:
- Eigentümer und Moderatoren können auf Moderationsdetails für verborgene Skills zugreifen.
- Öffentliche Aufrufer erhalten
200nur für bereits markierte sichtbare Skills. - Belege werden für öffentliche Aufrufer redigiert und enthalten nur für Eigentümer/Moderatoren unverarbeitete Ausschnitte.
POST /api/v1/skills/{slug}/report
Meldet einen Skill zur Überprüfung durch Moderatoren. Meldungen gelten auf Skill-Ebene, können optional mit einer Version verknüpft sein und werden in die Warteschlange für Skill-Meldungen aufgenommen.
Authentifizierung:
- Erfordert ein API-Token.
Anfrage:
{ "reason": "Verdächtiger Installationsschritt", "version": "1.2.3" }Antwort:
{ "ok": true, "reported": true, "alreadyReported": false, "reportId": "skillReports:...", "skillId": "skills:...", "reportCount": 1}GET /api/v1/skills/-/reports
Moderator-/Administrator-Endpunkt zur Entgegennahme von Skill-Meldungen.
Abfrageparameter:
status(optional):open(Standard),confirmed,dismissedoderalllimit(optional): Ganzzahl (1-200)cursor(optional): Paginierungscursor
Antwort:
{ "items": [ { "reportId": "skillReports:...", "skillId": "skills:...", "skillVersionId": "skillVersions:...", "slug": "gifgrep", "displayName": "GifGrep", "version": "1.2.3", "reason": "Verdächtiger Installationsschritt", "status": "open", "createdAt": 1730000000000, "reporter": { "userId": "users:...", "handle": "reporter", "displayName": "Meldende Person" }, "triagedAt": null, "triagedBy": null, "triageNote": null } ], "nextCursor": null, "done": true}POST /api/v1/skills/-/reports/{reportId}/triage
Moderator-/Administrator-Endpunkt zum Abschließen oder erneuten Öffnen von Skill-Meldungen.
Anfrage:
{ "status": "confirmed", "note": "Geprüft und betroffene Version ausgeblendet.", "finalAction": "hide" }note ist für confirmed und dismissed erforderlich; beim
Zurücksetzen von status auf open kann es entfallen. Übergeben Sie finalAction: "hide" mit einer triagierten
Meldung, um den Skill im selben auditierbaren Arbeitsablauf auszublenden.
GET /api/v1/skills/{slug}/versions
Abfrageparameter:
limit(optional): Ganzzahlcursor(optional): Paginierungscursor
GET /api/v1/skills/{slug}/versions/{version}
Gibt Versionsmetadaten und eine Dateiliste zurück.
version.securityenthält den normalisierten Verifizierungsstatus des Scans und Scannerdetails (VirusTotal + LLM), sofern verfügbar.
GET /api/v1/skills/{slug}/scan
Gibt Details zur Verifizierung des Sicherheitsscans für eine Skill-Version zurück.
Abfrageparameter:
version(optional): bestimmte Versionszeichenfolge.tag(optional): eine mit einem Tag versehene Version auflösen (zum Beispiellatest).
Hinweise:
- Wenn weder
versionnochtagangegeben ist, wird die neueste Version verwendet. - Enthält den normalisierten Verifizierungsstatus sowie scannerspezifische Details.
security.hasScanResultist nur danntrue, wenn ein Scanner ein eindeutiges Urteil geliefert hat (clean,suspiciousodermalicious).moderationist eine aktuelle, aus der neuesten Version abgeleitete Moderationsmomentaufnahme auf Skill-Ebene.- Prüfen Sie bei der Abfrage einer historischen Version
moderation.matchesRequestedVersionundmoderation.sourceVersion, bevor Siemoderationundsecuritydemselben Versionskontext zuordnen.
POST /api/v1/skills/-/scan
Authentifizierter Übermittlungsendpunkt für neue ClawScan-Aufträge.
Scans lokaler Uploads werden nicht mehr unterstützt. Anfragen mit
multipart/form-data oder { "source": { "kind": "upload" } } geben 410 zurück.
Veröffentlichte Scans verwenden JSON:
{ "source": { "kind": "published", "slug": "gifgrep", "version": "1.2.3" }, "update": false}Hinweise:
- Nutzdaten von Scananfragen und herunterladbare Berichte verfallen nach Ablauf des Aufbewahrungszeitraums im Scananfragenspeicher.
- Veröffentlichte Scans erfordern Verwaltungszugriff als Eigentümer oder Herausgeber oder die Berechtigung eines Plattformmoderators bzw. -administrators.
- Veröffentlichte Scans schreiben Ergebnisse nur zurück, wenn
update: trueund der Scan erfolgreich abgeschlossen wird. - Die Antwort lautet
202mit{ "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." } }. - Scanaufträge werden asynchron ausgeführt. Manuelle Scananfragen werden vor regulären Veröffentlichungs- und Backfill-Aufträgen priorisiert, ihre Fertigstellung hängt jedoch weiterhin von der Verfügbarkeit der Worker ab.
GET /api/v1/skills/-/scan/{scanId}
Authentifizierter Abfrageendpunkt für einen übermittelten Scan.
- Gibt den Status „in Warteschlange“, „wird ausgeführt“, „erfolgreich“ oder „fehlgeschlagen“ zurück.
- Gibt während des Wartens
queue.queuedAheadundqueue.positionzurück, damit Clients anzeigen können, wie viele priorisierte manuelle Scans sich vor der Anfrage befinden. Sehr große Warteschlangen werden begrenzt und mitqueuedAheadIsEstimate: truegemeldet. - Sofern verfügbar, enthält
reportdie Abschnitteclawscan,skillspector,staticAnalysisundvirustotal. - Fehlgeschlagene Scanaufträge geben
status: "failed"mitlastErrorzurück.
GET /api/v1/skills/-/scan/{scanId}/download
Authentifizierter Endpunkt für Berichtsarchive.
- Erfordert einen erfolgreichen Scan; noch nicht abgeschlossene Scans geben
409zurück. - Gibt eine ZIP-Datei mit
manifest.json,clawscan.json,skillspector.json,static-analysis.json,virustotal.jsonundREADME.mdzurück.
GET /api/v1/skills/-/scan/download/{name}?version=<version>&kind=skill|plugin
Authentifizierter Endpunkt für gespeicherte Berichtsarchive übermittelter Versionen.
- Erfordert Verwaltungszugriff als Eigentümer oder Herausgeber des Skills oder Plugins oder die Berechtigung eines Plattformmoderators bzw. -administrators.
- Gibt gespeicherte Scanergebnisse für die exakt übermittelte Version zurück, einschließlich blockierter oder ausgeblendeter Versionen.
kindverwendet standardmäßigskill; verwenden Siekind=pluginfür Plugin-/Paketscans.- Gibt dieselbe ZIP-Struktur wie Downloads von Scananfragen zurück.
POST /api/v1/skills/-/scan/batch
Nur für Administratoren zugängliche kanonische Route für erneute Batch-Scans. Sie akzeptiert dieselbe Nutzdatenstruktur wie das veraltete POST /api/v1/skills/-/rescan-batch.
POST /api/v1/skills/-/scan/batch/status
Nur für Administratoren zugängliche kanonische Batch-Statusroute. Sie akzeptiert { "jobIds": ["..."] } und gibt dieselben aggregierten Zähler wie das veraltete POST /api/v1/skills/-/rescan-batch/status zurück.
GET /api/v1/skills/{slug}/verify
Gibt den von clawhub skill verify verwendeten Skill-Card-Verifizierungsumschlag zurück.
Abfrageparameter:
version(optional): bestimmte Versionszeichenfolge.tag(optional): eine mit einem Tag versehene Version auflösen (zum Beispiellatest).
Hinweise:
okist nur danntrue, wenn für die ausgewählte Version eine Skill Card generiert wurde, sie nicht durch die Malware-Moderation blockiert ist und die ClawScan-Verifizierung keine Probleme ergibt.- Skill-Identität, Herausgeberidentität und Metadaten der ausgewählten Version sind Felder der obersten Umschlagebene (
slug,displayName,publisherHandle,version,resolvedFrom,tag,createdAt), damit Shell-Automatisierungen sie lesen können, ohne verschachtelte Wrapper entpacken zu müssen. securityist das ClawScan-/Sicherheitsurteil auf oberster Ebene. Automatisierungen sollten sich anok,decision,reasonsundsecurity.statusorientieren.security.signalsenthält unterstützende Scannerbelege wiestaticScan,virusTotalundskillSpector.security.signals.dependencyRegistrybleibt für die Kompatibilität mit v1-Antworten erhalten, aber der Scanner zur Existenzprüfung in der Abhängigkeitsregistrierung wurde eingestellt und dieser Schlüssel ist immernull.provenanceist nur dannserver-resolved-github-import, wenn ClawHub während der Veröffentlichung oder des Imports ein GitHub-Repository, eine Referenz, einen Commit und einen Pfad aufgelöst und gespeichert hat; andernfalls ist esunavailable.
POST /api/v1/skills/-/security-verdicts
Gibt aktuelle kompakte Sicherheitsurteile für exakte Skill-Versionen zurück. Dieser Sammlungsendpunkt ist für Clients vorgesehen, die bereits wissen, welche installierten ClawHub-Skill-Versionen sie anzeigen müssen, beispielsweise die OpenClaw Control UI.
Anfrage:
{ "items": [{ "slug": "gifgrep", "version": "1.2.3" }]}Hinweise:
itemsmuss 1–100 eindeutige{ slug, version }-Paare enthalten.- Ergebnisse werden pro Element zurückgegeben; ein fehlender Skill oder eine fehlende Version lässt nicht die gesamte Antwort fehlschlagen.
- Die Antwort enthält ausschließlich Sicherheitsinformationen. Sie enthält keine Skill-Card-Daten, keinen Status der generierten Karte, keine Artefaktdateilisten und keine detaillierten Scanner-Nutzdaten.
security.signalsenthält nur unterstützende Belege auf Statusebene; verwenden Sie/scanoder die ClawHub-Seite für Sicherheitsaudits, um vollständige Scannerdetails abzurufen.security.signals.dependencyRegistrybleibt für die Kompatibilität mit v1-Antworten erhalten, aber der Scanner zur Existenzprüfung in der Abhängigkeitsregistrierung wurde eingestellt und dieser Schlüssel ist immernull.- Das Fehlen einer Skill Card wirkt sich nicht auf
ok,decisionoderreasonsdieses Endpunkts aus; Clients sollten die installierteskill-card.mdlokal lesen, wenn sie Karteninhalte benötigen. - Verwenden Sie
/verify, wenn Sie den Skill-Card-Verifizierungsumschlag für einen einzelnen Skill benötigen,/cardfür das generierte Karten-Markdown und/scanfür detaillierte Scannerdaten.
Antwort:
{ "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": "Version nicht gefunden" }, "security": null } ]}GET /api/v1/skills/{slug}/file
Gibt die exakt gespeicherten Dateibytes als Download zurück. Fügen Sie preview=1 hinzu, um eine begrenzte Vorschau
mit maskiertem Text anzufordern; jede Datei mit gültigen UTF-8-Bytes kann unabhängig von ihrer Erweiterung oder ihren MIME-
Metadaten in der Vorschau angezeigt werden.
Abfrageparameter:
path(erforderlich)version(optional)tag(optional)preview=1(optional; gibttext/plainoder415zurück, wenn die Bytes kein gültiges UTF-8 darstellen)
Hinweise:
- Verwendet standardmäßig die neueste Version.
- Limit für Rohdownloads: 10MB.
- Limit für Textvorschauen: 200KB.
GET /api/v1/packages
Einheitlicher Katalogendpunkt für:
- Skills
- Code-Plugins
- Bundle-Plugins
Abfrageparameter:
limit(optional): Ganzzahl (1–100)cursor(optional): Paginierungscursorfamily(optional):skill,code-pluginoderbundle-pluginchannel(optional):official,communityoderprivateisOfficial(optional):trueoderfalsesort(optional):updated(Standard),recommended,trending,downloads, veralteter Aliasinstallscategory(optional): Plugin-Kategoriefilter. Wird nur unterstützt, wenn die Anfrage auf Plugin-Pakete beschränkt ist (/api/v1/plugins,/api/v1/code-plugins,/api/v1/bundle-pluginsoder Paketendpunkte mitfamily=code-plugin/family=bundle-plugin). Kontrollierte Kategorien und veraltete v1-Filteraliase sind unterGET /api/v1/pluginsdokumentiert.
Hinweise:
- Ungültige Werte für
family,channel,isOfficial,featured,highlightedOnlyodersortgeben400zurück. Unbekannte Abfrageparameter werden ignoriert. GET /api/v1/code-pluginsundGET /api/v1/bundle-pluginsbleiben Aliase für feste Familien.- Skill-Einträge basieren weiterhin auf der Skill-Registrierung und können nach wie vor nur über
POST /api/v1/skillsveröffentlicht werden. POST /api/v1/packagesist weiterhin ausschließlich für Veröffentlichungen von Code-Plugins und Bundle-Plugins vorgesehen.- Anonyme Aufrufer sehen nur öffentliche Paketkanäle.
- Authentifizierte Aufrufer können in Listen-/Suchergebnissen private Pakete von Herausgebern sehen, denen sie angehören.
channel=privategibt nur Pakete zurück, die der authentifizierte Aufrufer lesen darf.
GET /api/v1/packages/search
Einheitliche Katalogsuche über Skills und Plugin-Pakete hinweg.
Abfrageparameter:
q(erforderlich): Abfragezeichenfolgelimit(optional): Ganzzahl (1–100)family(optional):skill,code-pluginoderbundle-pluginchannel(optional):official,communityoderprivateisOfficial(optional):trueoderfalsecategory(optional): Plugin-Kategoriefilter. Wird nur unterstützt, wenn die Anfrage auf Plugin-Pakete beschränkt ist. Kontrollierte Kategorien und ältere v1- Filteraliase sind unterGET /api/v1/pluginsdokumentiert.
Hinweise:
- Ungültige Werte für
family,channel,isOfficial,featuredoderhighlightedOnlygeben400zurück. Unbekannte Abfrageparameter werden ignoriert. - Anonyme Aufrufer sehen nur öffentliche Paketkanäle.
- Authentifizierte Aufrufer können private Pakete von Herausgebern durchsuchen, denen sie angehören.
channel=privategibt nur Pakete zurück, die der authentifizierte Aufrufer lesen kann.
GET /api/v1/plugins
Reine Plugin-Katalogübersicht über Code-Plugin- und Bundle-Plugin-Pakete.
Abfrageparameter:
limit(optional): Ganzzahl (1-100)cursor(optional): PaginierungscursorisOfficial(optional):trueoderfalsesort(optional):recommended(Standard),trending,downloads,updated, älterer Aliasinstallscategory(optional): Plugin-Kategoriefilter. Aktuelle Werte:channels,models,memory,context,voice,media,web,tools,runtime,gateway,security,other.
Ältere v1-Filteraliase werden an Leseendpunkten weiterhin akzeptiert:
mcp-tooling,dataundautomationwerden intoolsaufgelöst.observabilityunddeploymentwerden ingatewayaufgelöst.dev-toolswird inruntimeaufgelöst.
trending ist eine Rangliste der Installationen/Downloads über sieben Tage und verwendet keine Gesamtwerte über den gesamten Zeitraum.
Am vereinheitlichten Endpunkt /api/v1/packages gilt sie nur für Plugins; verwenden Sie
/api/v1/skills?sort=trending für den Skills-Katalog.
Ältere Aliase werden nicht als gespeicherte oder vom Autor deklarierte Kategoriewerte akzeptiert.
GET /api/v1/skills/export
Massenexport der neuesten öffentlichen Skills für die Offline-Analyse.
Authentifizierung:
- API-Token erforderlich.
Abfrageparameter:
startDate(erforderlich): Untergrenze in Unix-Millisekunden für Skill-updatedAt.endDate(erforderlich): Obergrenze in Unix-Millisekunden für Skill-updatedAt.limit(optional): Ganzzahl (1-250), Standardwert250.cursor(optional): Paginierungscursor aus der vorherigen Antwort.
Antwort:
- Inhalt: ZIP-Archiv.
- Jeder exportierte Skill hat sein Stammverzeichnis unter
{publisher}/{slug}/. - Gehostete Skills enthalten die Dateien der neuesten gespeicherten Version und sind in
_manifest.jsonmitsourceRef: "public-clawhub"aufgeführt. - Aktuelle GitHub-gestützte Skills mit einem
clean- odersuspicious-Scan enthalten_source_handoff.jsonmitsourceRef: "public-github", Repository, Commit, Pfad, Inhalts-Hash und Archiv-URL. Sie enthalten keine von ClawHub gehosteten Quelldateien. - Jeder Skill enthält
_export_skill_meta.json. _manifest.jsonist immer im Stammverzeichnis der ZIP-Datei enthalten._errors.jsonist enthalten, wenn einzelne Skills oder Dateien nicht exportiert werden konnten.
Header:
X-Next-CursorX-Has-MoreX-Total-ReturnedX-Date-RangeX-Export-Errors
GET /api/v1/plugins/export
Massenexport der neuesten öffentlichen Plugin-Releases für die Offline-Analyse.
Authentifizierung:
- API-Token erforderlich.
Abfrageparameter:
startDate(erforderlich): Untergrenze in Unix-Millisekunden für Plugin-updatedAt.endDate(erforderlich): Obergrenze in Unix-Millisekunden für Plugin-updatedAt.limit(optional): Ganzzahl (1-250), Standardwert250.cursor(optional): Paginierungscursor aus der vorherigen Antwort.family(optional):code-pluginoderbundle-plugin. Wenn nicht angegeben, sind beide Plugin-Familien gemeint.
Antwort:
- Inhalt: ZIP-Archiv.
- Jedes exportierte Plugin hat sein Stammverzeichnis unter
{family}/{packageName}/. - Jedes exportierte Plugin enthält die gespeicherten Dateien des neuesten Releases.
- Die Exportmetadaten je Plugin werden unter
__clawhub_export/{family}/{packageName}/plugin_meta.jsongespeichert. _manifest.jsonist immer im Stammverzeichnis der ZIP-Datei enthalten._errors.jsonist enthalten, wenn einzelne Plugins oder Dateien nicht exportiert werden konnten.
Header:
X-Next-CursorX-Has-MoreX-Total-ReturnedX-Date-RangeX-Export-Errors
GET /api/v1/plugins/search
Reine Plugin-Suche über Code-Plugin- und Bundle-Plugin-Pakete.
Abfrageparameter:
q(erforderlich): Abfragezeichenfolgelimit(optional): Ganzzahl (1-100)isOfficial(optional):trueoderfalsecategory(optional): Plugin-Kategoriefilter. Aktuelle Werte:channels,models,memory,context,voice,media,web,tools,runtime,gateway,security,other.
Hinweise:
- Die unter
GET /api/v1/pluginsdokumentierten älteren v1-Filteraliase werden ebenfalls akzeptiert. - Die Kategoriefilterung ist ein echter API-Filter, der auf Digest- Zeilen für Plugin-Kategorien basiert, und keine Umschreibung der Suchabfrage.
- Die Ergebnisse werden nach Relevanz sortiert zurückgegeben und derzeit nicht paginiert.
- Die Sortiersteuerelemente der Browser-Benutzeroberfläche für die Plugin-Suche ordnen die geladenen Relevanzergebnisse neu,
entsprechend dem aktuellen Übersichtsverhalten von
/skills.
GET /api/v1/packages/{name}
Gibt Detailmetadaten zum Paket zurück.
Hinweise:
- Im vereinheitlichten Katalog können über diese Route auch Skills aufgelöst werden.
- Private Pakete geben
404zurück, sofern der Aufrufer den zugehörigen Herausgeber nicht lesen darf.
DELETE /api/v1/packages/{name}
Löscht ein Paket und alle Releases vorläufig.
Hinweise:
- Erfordert ein API-Token des Paketinhabers, eines Inhabers/Administrators des veröffentlichenden Unternehmens, eines Plattformmoderators oder eines Plattformadministrators.
GET /api/v1/packages/{name}/versions
Gibt den Versionsverlauf zurück.
Abfrageparameter:
limit(optional): Ganzzahl (1–100)cursor(optional): Paginierungscursor
Hinweise:
- Private Pakete geben
404zurück, sofern der Aufrufer den zugehörigen Herausgeber nicht lesen darf.
GET /api/v1/packages/{name}/versions/{version}
Gibt eine Paketversion zurück, einschließlich Dateimetadaten, Kompatibilität, Verifizierung, Artefaktmetadaten und Scandaten.
Hinweise:
version.artifact.kindistlegacy-zipfür Paketarchive des alten Formats odernpm-packfür ClawPack-gestützte Releases.- ClawPack-Releases enthalten npm-kompatible Felder für
npmIntegrity,npmShasumundnpmTarballName. version.sha256hashsind veraltete Kompatibilitätsmetadaten für alte Clients. Sie bilden einen Hash der exakten ZIP-Bytes, die von/api/v1/packages/{name}/downloadzurückgegeben werden. Moderne Clients solltenversion.artifact.sha256verwenden, das das kanonische Release-Artefakt identifiziert.version.vtAnalysis,version.llmAnalysisundversion.staticScansind enthalten, wenn Scandaten vorhanden sind.- Private Pakete geben
404zurück, sofern der Aufrufer den zugehörigen Herausgeber nicht lesen darf.
GET /api/v1/packages/{name}/versions/{version}/security
Gibt die exakte Sicherheits- und Vertrauenszusammenfassung eines Paket-Releases für Installations- Clients zurück. Dies ist die öffentliche OpenClaw-Nutzungsoberfläche für die Entscheidung, ob ein aufgelöstes Release installiert werden darf.
Authentifizierung:
- Öffentlicher Leseendpunkt. Es ist kein Token eines Inhabers, Herausgebers, Moderators oder Administrators erforderlich.
Antwort:
{ "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 }}Antwortfelder:
package.name,package.displayNameundpackage.familyidentifizieren das aufgelöste Registrierungspaket.release.releaseId,release.versionundrelease.createdAtidentifizieren das exakt ausgewertete Release.release.artifactKind,release.artifactSha256,release.npmIntegrity,release.npmShasumundrelease.npmTarballNamesind vorhanden, wenn sie für das Release-Artefakt bekannt sind.trust.scanStatusist der effektive Vertrauensstatus, der aus Scanner-Eingaben und der manuellen Release-Moderation abgeleitet wird.trust.moderationStatekann null sein. Der Wert istnull, wenn keine manuelle Release- Moderation vorliegt.trust.blockedFromDownloadist das Installationssperrsignal. OpenClaw und andere Installations-Clients sollten die Installation sperren, wenn dieser Werttrueist, anstatt Sperrregeln aus Scanner- oder Moderationsfeldern neu abzuleiten.trust.reasonsist die Liste der für Benutzer sichtbaren Erklärungen und Prüfprotokollerläuterungen. Ursachencodes sind stabile, kompakte Zeichenfolgen wiemanual:quarantined,scan:maliciousundpackage:malicious.trust.pendingbedeutet, dass eine oder mehrere Vertrauenseingaben noch auf ihren Abschluss warten.trust.stalebedeutet, dass die Vertrauenszusammenfassung aus veralteten Eingaben berechnet wurde und vor einer Freigabeentscheidung mit hoher Sicherheit als aktualisierungsbedürftig behandelt werden sollte.
Hinweise:
- Dieser Endpunkt ist versionsgenau. Clients sollten ihn nach dem Auflösen der zu installierenden Paketversion aufrufen, nicht bereits nach dem Lesen der neuesten Paketmetadaten.
- Private Pakete geben
404zurück, sofern der Aufrufer den zugehörigen Herausgeber nicht lesen darf. - Dieser Endpunkt ist absichtlich enger gefasst als Moderationsendpunkte für Inhaber/Moderatoren. Er stellt die Installationsentscheidung und die öffentliche Erklärung bereit, nicht jedoch die Identitäten der Meldenden, Meldungsinhalte, private Beweismittel oder interne Prüfungs- zeitleisten.
GET /api/v1/packages/{name}/versions/{version}/artifact
Gibt die expliziten Metadaten des Artefakt-Resolvers für eine Paketversion zurück.
Hinweise:
- Ältere Paketversionen geben ein
legacy-zip-Artefakt und eine ältere ZIP-downloadUrlzurück. - ClawPack-Versionen geben ein
npm-pack-Artefakt, npm-Integritätsfelder, eintarballUrlund die ältere ZIP-Kompatibilitäts-URL zurück. - Dies ist die OpenClaw-Resolver-Oberfläche; sie vermeidet es, das Archivformat anhand einer gemeinsam genutzten URL zu erraten.
GET /api/v1/packages/{name}/versions/{version}/artifact/download
Lädt das Versionsartefakt über den expliziten Resolver-Pfad herunter.
Hinweise:
- ClawPack-Versionen streamen exakt die Bytes des hochgeladenen npm-Packs
.tgz. - Veraltete ZIP-Versionen leiten zu
/api/v1/packages/{name}/download?version=weiter. - Verwendet das Ratenlimit-Kontingent für Downloads.
GET /api/v1/packages/{name}/readiness
Gibt die berechnete Bereitschaft für die zukünftige Nutzung durch OpenClaw zurück.
Die Bereitschaftsprüfungen umfassen:
- Status des offiziellen Kanals
- Verfügbarkeit der neuesten Version
- Verfügbarkeit des ClawPack-npm-Pack-Artefakts
- Artefakt-Digest
- Provenienz von Quell-Repository und Commit
- OpenClaw-Kompatibilitätsmetadaten
- Host-Ziele
- Scanstatus
Antwort:
{ "package": { "name": "@openclaw/example-plugin", "displayName": "Beispiel-Plugin", "family": "code-plugin", "isOfficial": true, "latestVersion": "1.2.3" }, "ready": false, "checks": [ { "id": "clawpack", "label": "ClawPack-Artefakt", "status": "fail", "message": "Die neueste Version ist eine veraltete Version, die nur als ZIP vorliegt." } ], "blockers": ["clawpack"]}GET /api/v1/packages/migrations
Moderator-Endpunkt zum Auflisten der Migrationszeilen offizieller OpenClaw-Plugins.
Authentifizierung:
- Erfordert ein API-Token für einen Moderator oder Administrator.
Abfrageparameter:
phase(optional):planned,published,clawpack-ready,legacy-zip-only,metadata-ready,blocked,ready-for-openclawoderall(Standardwert).limit(optional): Ganzzahl (1-100)cursor(optional): Paginierungscursor
Antwort:
{ "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 fehlt"], "hostTargetsComplete": true, "scanClean": false, "moderationApproved": false, "runtimeBundlesReady": false, "notes": null, "createdAt": 1760000000000, "updatedAt": 1760000000000 } ], "nextCursor": null, "done": true}POST /api/v1/packages/migrations
Administrator-Endpunkt zum Erstellen oder Aktualisieren einer Migrationszeile für ein offizielles Plugin.
Authentifizierung:
- Erfordert ein API-Token für einen Administrator.
Anfragetext:
{ "bundledPluginId": "core.search", "packageName": "@openclaw/search-plugin", "owner": "platform", "sourceRepo": "openclaw/openclaw", "sourcePath": "plugins/search", "sourceCommit": "abc123", "phase": "blocked", "blockers": ["ClawPack fehlt"], "hostTargetsComplete": true, "scanClean": false, "moderationApproved": false, "runtimeBundlesReady": false, "notes": "Warten auf den Upload durch den Herausgeber"}Hinweise:
bundledPluginIdwird in Kleinbuchstaben normalisiert und ist der stabile Upsert-Schlüssel.packageNamewird als npm-Name normalisiert; bei geplanten Migrationen kann das Paket fehlen.- Dies erfasst nur die Migrationsbereitschaft. Es verändert OpenClaw nicht und erzeugt keine ClawPacks.
GET /api/v1/packages/moderation/queue
Moderator-/Administrator-Endpunkt für Warteschlangen zur Prüfung von Paketveröffentlichungen.
Authentifizierung:
- Erfordert ein API-Token für einen Moderator oder Administrator.
Abfrageparameter:
status(optional):open(Standardwert),blocked,manualoderalllimit(optional): Ganzzahl (1-100)cursor(optional): Paginierungscursor
Bedeutung der Statuswerte:
open: verdächtige, schädliche, ausstehende, unter Quarantäne gestellte, widerrufene oder gemeldete Veröffentlichungen.blocked: unter Quarantäne gestellte, widerrufene oder schädliche Veröffentlichungen.manual: jede Veröffentlichung mit einer manuellen Moderationsüberschreibung.all: jede Veröffentlichung mit einer manuellen Überschreibung, einem nicht sauberen Scanstatus oder einer Paketmeldung.
Antwort:
{ "items": [ { "packageId": "packages:...", "releaseId": "packageReleases:...", "name": "@openclaw/example-plugin", "displayName": "Beispiel-Plugin", "family": "code-plugin", "channel": "community", "isOfficial": false, "version": "1.2.3", "createdAt": 1730000000000, "artifactKind": "npm-pack", "scanStatus": "malicious", "moderationState": "quarantined", "moderationReason": "manuelle Prüfung", "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
Meldet ein Paket zur Prüfung durch einen Moderator. Meldungen beziehen sich auf das Paket und können optional mit einer Version verknüpft werden. Sie fließen in die Moderationswarteschlange ein, blenden jedoch nicht automatisch Inhalte aus und blockieren selbst keine Downloads; Moderatoren sollten die Veröffentlichungsmoderation verwenden, um Artefakte zu genehmigen, unter Quarantäne zu stellen oder zu widerrufen.
Authentifizierung:
- Erfordert ein API-Token.
Anfrage:
{ "reason": "Verdächtige native Binärdatei", "version": "1.2.3" }Antwort:
{ "ok": true, "reported": true, "alreadyReported": false, "packageId": "packages:...", "releaseId": "packageReleases:...", "reportCount": 1}GET /api/v1/packages/reports
Moderator-/Administrator-Endpunkt für den Eingang von Paketmeldungen.
Authentifizierung:
- Erfordert ein API-Token für einen Moderator oder Administrator.
Abfrageparameter:
status(optional):open(Standardwert),confirmed,dismissedoderalllimit(optional): Ganzzahl (1-100)cursor(optional): Paginierungscursor
Antwort:
{ "items": [ { "reportId": "packageReports:...", "packageId": "packages:...", "releaseId": "packageReleases:...", "name": "@openclaw/example-plugin", "displayName": "Beispiel-Plugin", "family": "code-plugin", "version": "1.2.3", "reason": "Verdächtige native Binärdatei", "status": "open", "createdAt": 1730000000000, "reporter": { "userId": "users:...", "handle": "reporter", "displayName": "Meldende Person" }, "triagedAt": null, "triagedBy": null, "triageNote": null } ], "nextCursor": null, "done": true}GET /api/v1/packages/{name}/moderation
Eigentümer-/Moderator-Endpunkt für die Sichtbarkeit der Paketmoderation.
Authentifizierung:
- Erfordert ein API-Token für den Paketeigentümer, ein Mitglied des Herausgebers, einen Moderator oder Administrator.
Antwort:
{ "package": { "packageId": "packages:...", "name": "@openclaw/example-plugin", "displayName": "Beispiel-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": "manuelle Prüfung", "blockedFromDownload": true, "reasons": ["manual:quarantined", "scan:malicious", "reports:2"], "createdAt": 1730000000000 }}POST /api/v1/packages/reports/{reportId}/triage
Moderator-/Administrator-Endpunkt zum Abschließen oder erneuten Öffnen von Paketmeldungen.
Anfrage:
{ "status": "confirmed", "note": "Betroffene Veröffentlichung wurde geprüft und unter Quarantäne gestellt.", "finalAction": "quarantine"}note ist für confirmed und dismissed erforderlich; es kann weggelassen werden, wenn
status wieder auf open gesetzt wird. Übergeben Sie bei einer bestätigten Meldung finalAction: "quarantine" oder
finalAction: "revoke", um die Veröffentlichungsmoderation im selben
auditierbaren Arbeitsablauf anzuwenden.
Antwort:
{ "ok": true, "reportId": "packageReports:...", "packageId": "packages:...", "status": "confirmed", "reportCount": 0}POST /api/v1/packages/{name}/versions/{version}/moderation
Moderator-/Administrator-Endpunkt zur Prüfung von Paketveröffentlichungen.
Anfrage:
{ "state": "quarantined", "reason": "Verdächtige native Nutzlast." }Unterstützte Statuswerte:
approved: manuell geprüft und zugelassen.quarantined: bis zur weiteren Prüfung blockiert.revoked: blockiert, nachdem einer Veröffentlichung zuvor vertraut wurde.
Unter Quarantäne gestellte und widerrufene Veröffentlichungen geben über Artefakt-Downloadrouten 403 zurück.
Jede Änderung schreibt einen Eintrag in das Auditprotokoll.
GET /api/v1/packages/{name}/file
Gibt exakt die gespeicherten Bytes einer Paketdatei als Download zurück. Fügen Sie preview=1 hinzu, um dieselbe begrenzte
UTF-8-Textvorschau anzufordern, die für Skill-Dateien verwendet wird.
Abfrageparameter:
path(erforderlich)version(optional)tag(optional)preview=1(optional; gibttext/plainoder415zurück, wenn die Bytes kein gültiges UTF-8 sind)
Hinweise:
- Verwendet standardmäßig die neueste Veröffentlichung.
- Verwendet das Ratenlimit-Kontingent für Lesezugriffe, nicht das Download-Kontingent.
- Limit für Rohdownloads: 10MB.
- Limit für Textvorschauen: 200KB; undurchsichtige Dateien geben nur bei Vorschauanfragen
415zurück. - Ausstehende VirusTotal-Scans blockieren Lesezugriffe nicht; schädliche Veröffentlichungen können an anderer Stelle dennoch zurückgehalten werden.
- Private Pakete geben
404zurück, sofern der Aufrufer nicht zum Lesen des besitzenden Herausgebers berechtigt ist.
GET /api/v1/packages/{name}/download
Lädt das veraltete deterministische ZIP-Archiv für eine Paketveröffentlichung herunter.
Abfrageparameter:
version(optional)tag(optional)
Hinweise:
- Verwendet standardmäßig die neueste Veröffentlichung.
- Skills leiten zu
GET /api/v1/downloadweiter. - Plugin-/Paketarchive sind ZIP-Dateien mit einem
package/-Stammverzeichnis, damit ältere OpenClaw- Clients weiterhin funktionieren. - Diese Route bleibt ausschließlich für ZIP-Dateien vorgesehen. Sie streamt keine ClawPack-Dateien des Typs
.tgz. - Antworten enthalten die Header
ETag,Digest,X-ClawHub-Artifact-TypeundX-ClawHub-Artifact-Sha256für Integritätsprüfungen des Resolvers. - Metadaten, die nur in der Registry vorhanden sind, werden nicht in das heruntergeladene Archiv eingefügt.
- Ausstehende VirusTotal-Scans blockieren Downloads nicht; schädliche Veröffentlichungen geben
403zurück. - Private Pakete geben
404zurück, sofern der Aufrufer nicht der Eigentümer ist.
GET /api/npm/{package}
Gibt ein npm-kompatibles Packument für ClawPack-gestützte Paketversionen zurück.
Hinweise:
- Es werden nur Versionen mit hochgeladenen ClawPack-npm-Pack-Tarballs aufgeführt.
- Veraltete Versionen, die nur als ZIP vorliegen, werden absichtlich ausgelassen.
dist.tarball,dist.integrityunddist.shasumverwenden npm-kompatible Felder, sodass Benutzer npm bei Bedarf auf den Spiegelserver verweisen können.- Packuments für Pakete mit Gültigkeitsbereich unterstützen sowohl
/api/npm/@scope/nameals auch den von npm codierten Anfragepfad/api/npm/@scope%2Fname.
GET /api/npm/{package}/-/{tarball}.tgz
Streamt exakt die Bytes des hochgeladenen ClawPack-Tarballs für npm-Spiegelclients.
Hinweise:
- Verwendet das Ratenlimit-Kontingent für Downloads.
- Download-Header enthalten ClawHub-SHA-256 sowie npm-Integritäts-/Shasum-Metadaten.
- Prüfungen der Moderation und des Zugriffs auf private Pakete gelten weiterhin.
GET /api/v1/resolve
Wird von der CLI verwendet, um einen lokalen Fingerabdruck einer bekannten Version zuzuordnen.
Abfrageparameter:
slug(erforderlich)hash(erforderlich): 64-stelliger hexadezimaler SHA-256-Wert des Bundle-Fingerabdrucks
Antwort:
{ "slug": "gifgrep", "match": { "version": "1.2.2" }, "latestVersion": { "version": "1.2.3" } }GET /api/v1/download
Lädt eine ZIP-Datei einer gehosteten Skill-Version herunter oder gibt eine GitHub-Quellübergabe für einen
aktuellen GitHub-basierten Skill mit einem clean- oder suspicious-Scan und ohne gehostete
Version zurück.
Abfrageparameter:
slug(erforderlich)version(optional): Semver-Zeichenfolgetag(optional): Tag-Name (z. B.latest)
Hinweise:
- Wenn weder
versionnochtagangegeben ist, wird die neueste Version verwendet. - Als vorläufig gelöscht markierte Versionen geben
410zurück. - Übergaben GitHub-basierter Skills leiten keine Bytes weiter und spiegeln sie nicht. Die JSON-Antwort
enthält
sourceRef: "public-github",repo,commit,path,contentHashundarchiveUrl; der Scan-/Aktualitätsstatus dient als Sperre und ist nicht als Metadaten der erfolgreichen Nutzlast enthalten. - Downloadstatistiken werden als eindeutige Identitäten pro UTC-Tag gezählt (
userIdbei gültigem API-Token, andernfalls IP-Adresse).
Authentifizierungsendpunkte (Bearer-Token)
Alle Endpunkte erfordern:
Authorization: Bearer clh_...GET /api/v1/whoami
Validiert das Token und gibt den Benutzer-Handle zurück.
POST /api/v1/skills
Veröffentlicht eine neue Version.
- Bevorzugt:
multipart/form-datamitpayload-JSON undfiles[]-Blobs. - Ein JSON-Body mit
files(auf Basis der Speicher-ID) wird ebenfalls akzeptiert. - Optionales Nutzlastfeld:
ownerHandle. Wenn vorhanden, löst die API diesen Herausgeber serverseitig auf und verlangt, dass der Akteur Herausgeberzugriff besitzt. - Optionales Nutzlastfeld:
migrateOwner. Beitruezusammen mitownerHandlekann ein bestehender Skill zu diesem Eigentümer verschoben werden, wenn der Akteur sowohl beim aktuellen als auch beim Zielherausgeber Administrator oder Eigentümer ist. Ohne diese ausdrückliche Zustimmung werden Eigentümeränderungen abgelehnt.
POST /api/v1/packages
Veröffentlicht eine Code-Plugin- oder Bundle-Plugin-Version.
- Erfordert Authentifizierung per Bearer-Token.
- Erfordert
multipart/form-data. - Zulässige Formularfelder sind
payload, wiederholtefiles-Blobs oder eine einzelneclawpack- Tarball-Referenz.clawpackkann ein.tgz-Blob oder eine vom Upload-URL-Ablauf zurückgegebene Speicher-ID sein. Veröffentlichungen mit bereitgestellter Speicher-ID müssen außerdem das mit dieser Upload-URL zurückgegebeneclawpackUploadTicketenthalten. - Verwenden Sie entweder
filesoderclawpack, niemals beide in derselben Anfrage. - JSON-Bodies und vom Aufrufer bereitgestellte
payload.files- bzw.payload.artifact- Metadaten werden abgelehnt. - Direkte mehrteilige Veröffentlichungsanfragen sind auf 18MB begrenzt. ClawPack-Tarballs können den Upload-URL-Ablauf bis zur Tarball-Obergrenze von 120MB verwenden.
- Optionales Nutzlastfeld:
ownerHandle. Wenn vorhanden, dürfen nur Administratoren im Namen dieses Eigentümers veröffentlichen.
Wichtige Validierungsregeln:
familymusscode-pluginoderbundle-pluginsein.- Plugin-Pakete erfordern
openclaw.plugin.json. ClawPack-.tgz-Uploads müssen es unterpackage/openclaw.plugin.jsonenthalten. - Code-Plugins erfordern
package.json, Metadaten zum Quell-Repository, Metadaten zum Quell-Commit, Metadaten zum Konfigurationsschema,openclaw.compat.pluginApiundopenclaw.build.openclawVersion. openclaw.hostTargetsundopenclaw.environmentsind optionale Metadaten.- Nur der Organisationsherausgeber
openclawund die persönlichen Herausgeber aktueller Mitglieder der Organisationopenclawdürfen im Kanalofficialveröffentlichen. - Veröffentlichungen im Namen anderer prüfen die Berechtigung für den offiziellen Kanal weiterhin anhand des Ziel-Eigentümerkontos.
DELETE /api/v1/skills/{slug} / POST /api/v1/skills/{slug}/undelete
Einen Skill vorläufig löschen bzw. wiederherstellen (Eigentümer, Moderator oder Administrator).
Optionaler JSON-Body:
{ "reason": "Zur Moderation bis zum Abschluss der rechtlichen Prüfung zurückgehalten." }Wenn vorhanden, wird reason als Moderationshinweis des Skills gespeichert und in das Auditprotokoll kopiert.
Vom Eigentümer veranlasste vorläufige Löschungen reservieren den Slug für 30 Tage; anschließend kann der Slug von
einem anderen Herausgeber beansprucht werden. Die Löschantwort enthält slugReservedUntil, wenn dieser Ablauf gilt.
Ausblendungen durch Moderatoren/Administratoren und sicherheitsbedingte Entfernungen laufen nicht auf diese Weise ab.
Löschantwort:
{ "ok": true, "slugReservedUntil": 1730000000000 }Statuscodes:
200: erfolgreich401: nicht autorisiert403: verboten404: Skill/Benutzer nicht gefunden500: interner Serverfehler
POST /api/v1/users/publisher
Nur für Administratoren. Stellt sicher, dass für einen Handle ein Organisationsherausgeber vorhanden ist. Wenn der Handle noch auf einen
alten gemeinsam genutzten Benutzer-/persönlichen Herausgeber verweist, migriert der Endpunkt ihn zunächst zu einem Organisationsherausgeber.
Geben Sie für eine neu erstellte Organisation memberHandle an; der ausführende Administrator wird nicht als Mitglied hinzugefügt.
memberRole ist standardmäßig owner.
- Body:
{ "handle": "openclaw", "displayName": "OpenClaw", "memberHandle": "alice", "memberRole": "owner", "trusted": true } - Antwort:
{ "ok": true, "publisherId": "...", "handle": "openclaw", "created": true, "migrated": false, "trusted": true, "member": { "userId": "...", "handle": "alice", "role": "owner" } }
POST /api/v1/publishers
Authentifizierte Self-Service-Erstellung eines Organisationsherausgebers. Erstellt einen neuen Organisationsherausgeber und fügt den Aufrufer als Eigentümer hinzu. Dieser Endpunkt migriert keine bestehenden Benutzer-/persönlichen Handles und markiert den Herausgeber nicht als vertrauenswürdig/offiziell.
- Body:
{ "handle": "opik", "displayName": "Opik" } - Antwort:
{ "ok": true, "publisherId": "...", "handle": "opik", "created": true, "trusted": false } - Gibt
409zurück, wenn der Handle bereits von einem Herausgeber, Benutzer oder persönlichen Herausgeber verwendet wird.
POST /api/v1/users/reserve
Nur für Administratoren. Reserviert Root-Slugs und Paketnamen für einen rechtmäßigen Eigentümer, ohne eine Version zu veröffentlichen. Paketnamen werden zu privaten Platzhalterpaketen ohne Versionszeilen, sodass derselbe Eigentümer später die tatsächliche Code-Plugin- oder Bundle-Plugin-Version unter diesem Namen veröffentlichen kann.
- Body:
{ "handle": "openclaw", "slugs": ["diffs"], "packageNames": ["@openclaw/diffs"], "reason": "reserved for official OpenClaw plugin" } - Antwort:
{ "ok": true, "succeeded": 2, "failed": 0, "results": [{ "kind": "slug", "name": "diffs", "ok": true, "action": "reserved" }] }
POST /api/v1/users/publisher-recovery
Nur für Administratoren. Stellt einen persönlichen Herausgeber für einen verifizierten Ersatz-GitHub-OAuth-Principal wieder her, ohne Convex-Auth-Kontozeilen zu bearbeiten. Die Anfrage muss beide unveränderlichen GitHub- Provider-Konto-IDs angeben; veränderliche Handles dienen nur als Kontrollmaßnahme für Bediener.
Der Endpunkt verwendet standardmäßig einen Probelauf. Das Anwenden der Wiederherstellung erfordert dryRun: false und
confirmIdentityVerified: true, nachdem Mitarbeiter die Kontinuität zwischen beiden
GitHub-Principals unabhängig überprüft haben. Die Wiederherstellung wird sicher abgebrochen, wenn der aktuelle persönliche
Herausgeber des Zielbenutzers Skills, Pakete oder GitHub-Skill-Quellen besitzt.
Die Wiederherstellung migriert außerdem alte ownerUserId-Felder für die Skills des wiederhergestellten Herausgebers,
Skill-Slug-Aliasse, Pakete, Warnungen der Paketprüfung und abgeleitete Such-Digest-Zeilen, damit
Pfade direkter Eigentümer mit der neuen Herausgeberautorität übereinstimmen. Eine aktive Reservierung eines geschützten Handles
für den wiederhergestellten Handle wird ebenfalls dem Ersatzbenutzer zugewiesen, sodass eine spätere
Profilsynchronisierung die konkurrierende Autorität des früheren Benutzers nicht wiederherstellen kann. Jede Primärtabelle ist auf
100 Zeilen pro Anwendungstransaktion begrenzt; größere Wiederherstellungen müssen zunächst eine fortsetzbare Eigentümermigration verwenden.
GitHub-Skill-Quellen sind herausgeberspezifisch und werden als geprüft gemeldet, statt neu geschrieben zu werden.
- Body:
{ "handle": "gingiris", "nextUserHandle": "gingiris-1031", "previousGitHubProviderAccountId": "123", "nextGitHubProviderAccountId": "456", "reason": "Verified account continuity for issue #2555", "confirmIdentityVerified": true, "dryRun": false } - Antwort:
{ "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" }
Endpunkte zur Verwaltung von Eigentümer-Slugs
POST /api/v1/skills/{slug}/rename- Body:
{ "newSlug": "new-canonical-slug" } - Antwort:
{ "ok": true, "slug": "new-canonical-slug", "previousSlug": "old-slug" }
- Body:
POST /api/v1/skills/{slug}/merge- Body:
{ "targetSlug": "canonical-target-slug" } - Antwort:
{ "ok": true, "sourceSlug": "old-slug", "targetSlug": "canonical-target-slug" }
- Body:
Hinweise:
- Beide Endpunkte erfordern eine Authentifizierung per API-Token und funktionieren nur für den Skill-Eigentümer.
renamebehält den vorherigen Slug als Weiterleitungsalias bei.mergeblendet den Quelleintrag aus und leitet den Quell-Slug zum Zieleintrag weiter.
Endpunkte zur Eigentumsübertragung
POST /api/v1/skills/{slug}/transfer- Body:
{ "toUserHandle": "target_handle", "message": "optional" } - Antwort:
{ "ok": true, "transferId": "skillOwnershipTransfers:...", "toUserHandle": "target_handle", "expiresAt": 1730000000000 }
- Body:
POST /api/v1/skills/{slug}/transfer/acceptPOST /api/v1/skills/{slug}/transfer/rejectPOST /api/v1/skills/{slug}/transfer/cancel- Antwort (annehmen/ablehnen/abbrechen):
{ "ok": true, "skillSlug": "demo-skill?" }
- Antwort (annehmen/ablehnen/abbrechen):
GET /api/v1/transfers/incomingGET /api/v1/transfers/outgoing- Antwortstruktur:
{ "transfers": [{ "_id": "...", "skill": { "slug": "demo", "displayName": "Demo" }, "fromUser"|"toUser": { "handle": "..." }, "message": "...", "requestedAt": 0, "expiresAt": 0 }] }
- Antwortstruktur:
POST /api/v1/users/ban
Einen Benutzer sperren und dessen Skills dauerhaft löschen (nur Moderatoren/Administratoren).
Body:
{ "handle": "user_handle", "reason": "optionaler Sperrgrund" }oder
{ "userId": "users_...", "reason": "optionaler Sperrgrund" }Antwort:
{ "ok": true, "alreadyBanned": false, "deletedSkills": 3 }POST /api/v1/users/unban
Die Sperre eines Benutzers aufheben und berechtigte Skills wiederherstellen (nur Administratoren).
Body:
{ "handle": "user_handle", "reason": "optionaler Grund für die Aufhebung der Sperre" }oder
{ "userId": "users_...", "reason": "optionaler Grund für die Aufhebung der Sperre" }Antwort:
{ "ok": true, "alreadyUnbanned": false, "restoredSkills": 3 }POST /api/v1/users/reclassify-ban
Den gespeicherten Grund einer bestehenden Sperre ändern, ohne die Sperre aufzuheben oder
Inhalte wiederherzustellen (nur Administratoren). Verwendet standardmäßig einen Probelauf, sofern dryRun nicht false ist.
Body:
{ "handle": "user_handle", "reason": "Spam durch Massenveröffentlichungen", "dryRun": true }oder
{ "userId": "users_...", "reason": "Spam durch Massenveröffentlichungen", "dryRun": false }Antwort:
{ "ok": true, "dryRun": false, "userId": "users_...", "handle": "user_handle", "previousReason": "automatische Sperre wegen Schadsoftware", "nextReason": "Spam durch Massenveröffentlichungen", "changed": true}POST /api/v1/users/role
Eine Benutzerrolle ändern (nur Administratoren).
Body:
{ "handle": "user_handle", "role": "moderator" }oder
{ "userId": "users_...", "role": "admin" }Antwort:
{ "ok": true, "role": "moderator" }GET /api/v1/users
Benutzer auflisten oder suchen (nur Administratoren).
Abfrageparameter:
q(optional): Suchanfragequery(optional): Alias fürqlimit(optional): maximale Anzahl von Ergebnissen (Standardwert 20, maximal 200)
Antwort:
{ "items": [ { "userId": "users_...", "handle": "user_handle", "displayName": "Benutzer", "name": "Benutzer", "role": "moderator" } ], "total": 1}POST /api/v1/stars/{slug} / DELETE /api/v1/stars/{slug}
Ein Lesezeichen hinzufügen/entfernen. Die alte Route stars und die Namen der Antwortfelder bleiben
aus Kompatibilitätsgründen erhalten. Beide Endpunkte sind idempotent.
Antworten:
{ "ok": true, "starred": true, "alreadyStarred": false }{ "ok": true, "unstarred": true, "alreadyUnstarred": false }Alte CLI-Endpunkte (veraltet)
Für ältere CLI-Versionen weiterhin unterstützt:
GET /api/cli/whoamiPOST /api/cli/upload-urlPOST /api/cli/publishPOST /api/cli/telemetry/installPOST /api/cli/skill/deletePOST /api/cli/skill/undelete
Den Plan zur Entfernung finden Sie unter DEPRECATIONS.md.
POST /api/cli/upload-url gibt uploadUrl und uploadTicket zurück. Paketveröffentlichungen,
die einen ClawPack-Tarball bereitstellen, müssen die resultierende Speicher-ID als
clawpack und das zurückgegebene Ticket als clawpackUploadTicket senden.
Registry-Erkennung (/.well-known/clawhub.json)
Die CLI kann Registry-/Authentifizierungseinstellungen von der Website ermitteln:
/.well-known/clawhub.json(JSON, bevorzugt)/.well-known/clawdhub.json(alt)
Schema:
{ "apiBase": "https://clawhub.ai", "authBase": "https://clawhub.ai", "minCliVersion": "0.0.5" }Wenn Sie selbst hosten, stellen Sie diese Datei bereit (oder setzen Sie CLAWHUB_REGISTRY ausdrücklich; früher CLAWDHUB_REGISTRY).