ClawHub Skill for OpenClaw Agents#
The EnConvert skill is published on ClawHub, the skill registry for OpenClaw agents. Installing it gives an agent six operations: read a URL into markdown, search the web, list a site's URLs, extract typed fields from pages, and convert a file to markdown or to PDF. Every page read carries a render_quality score from 0.0 to 1.0, so a bot wall or an empty single-page-app shell arrives flagged instead of being passed along as if it were the page.
openclaw skills install @enconvert/enconvert · Listing: clawhub.ai/enconvert/skills/enconvert · Version: 0.0.1 · Source: enconvert/clawhub-enconvert
What a ClawHub skill is#
A ClawHub skill is a single markdown instruction file. The agent reads it and executes the calls itself with curl. That is the whole mechanism.
This matters more than it sounds. The six operations below are not registered tool schemas. Nothing appears in a tool list, no argument object is validated before a call goes out, and there is no SDK sitting between the agent and the API. The skill tells the agent which endpoint to hit, which header to send and what the response looks like; the agent composes the HTTP request. Call them operations, not tools, and the behaviour you observe will make sense: an agent that has not read the file will not call anything, and an agent that has read it can deviate from it.
The practical upside is that nothing needs installing beyond curl, and the same instructions work on any platform that can run a shell command.
The six operations#
| Operation | Endpoint | What comes back |
|---|---|---|
| Perceive URL | POST /v2/perceive |
render_quality, plus an outputs object of 15-minute signed URLs |
| Web Search | POST /v2/lookup |
results[] with title, url, snippet, position |
| Discover URLs | POST /v2/discover |
urls[] and total, with no page rendered |
| Extract Structured | POST /v2/distill |
results[], one entry per URL, each with data and extraction_tier |
| Convert File to Markdown | POST /v1/convert/anything-to-markdown |
JSON carrying presigned_url |
| Convert File to PDF | POST /v1/convert/anything-to-pdf |
JSON carrying presigned_url |
Every call sends the header X-API-Key, never Authorization: Bearer. All six run against the same REST API documented across this site, so your plan quota and rate limits apply exactly as they do everywhere else.
POST /v2/lookup. The V2 namespace has no endpoint named after the word "search"; a request to one returns 404. If an agent reaches for that path, the skill file it read was out of date.
Install#
Install it with the OpenClaw CLI:
openclaw skills install @enconvert/enconvert
That is the form the ClawHub listing renders. Add --global to install it for every project rather than the current one, and openclaw skills update --all later to pick up new versions.
The ClawHub CLI installs the same skill, if that is the tool you already have:
npm i -g clawhub
clawhub install @enconvert/enconvert
The npm package clawhub is the CLI. There is an unrelated package of the same name on PyPI whose releases are all yanked, so pip install clawhub is not a route to this CLI.
Give the skill your API key#
The skill reads one secret: ENCONVERT_API_KEY.
- Generate a private API key in the dashboard. Private keys start with
sk_. - Make it available to the agent, either as
ENCONVERT_API_KEYin the environment the agent runs in, or injected for this skill through your OpenClaw config. The skills configuration reference covers the per-skillenvblock. - Confirm the key works before asking the agent to do anything:
curl -sS https://api.enconvert.com/v1/whoami -H "X-API-Key: $ENCONVERT_API_KEY"
# {"project_id":"2","plan_slug":"free"}
A public pk_ key is rejected here with a 403. Public keys exist for browser widgets and no operation in this skill accepts one. See Private Keys.
ENCONVERT_API_KEY env var and the curl binary on PATH. If either is missing the skill is simply ineligible, and there is no error message to read. The symptom is an agent that answers as though it had never heard of EnConvert. Check curl --version and the whoami call above before debugging anything else.
What comes back from a page read#
The response shape of POST /v2/perceive is the single thing most worth understanding before an agent runs it:
curl -sS -X POST https://api.enconvert.com/v2/perceive \
-H "X-API-Key: $ENCONVERT_API_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://example.com","outputs":["markdown"],"only_main_content":true}'
Three rules govern the reply:
render_qualitycomes first. It is a number from 0.0 to 1.0 in a200response, not an HTTP error. A low score means the render is degraded, so treat the content as suspect rather than authoritative.- Every artifact under
outputsis a 15-minute signed URL, markdown included.outputs.markdown.urlis a link, not the text of the page. So arehtml_cleaned,html_raw,screenshot,screenshot_full_page,pdf,linksandimages. Fetch each with a plainGETand noX-API-Keyheader: the signature in the URL is the authentication, and attaching your key would hand it to the storage host for nothing. More in Signed URLs. structuredis the exception. It comes back inline at the top level of the response, not underoutputs.
An agent that expects inline markdown reads an object where it wanted text, and reports the page as empty. Two steps, not one:
MD=$(curl -sS -X POST https://api.enconvert.com/v2/perceive \
-H "X-API-Key: $ENCONVERT_API_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://example.com","outputs":["markdown"]}' \
| grep -o '"url":"[^"]*"' | head -n1 | cut -d'"' -f4)
curl -sS "$MD" # no key here
File conversion works the same way at the end: the JSON carries presigned_url, and you fetch that with a plain GET and no key.
Converting a file#
Both convert endpoints take multipart/form-data with a single field named file. Do not set Content-Type by hand; the multipart boundary sets it.
curl -sS -X POST https://api.enconvert.com/v1/convert/anything-to-markdown \
-H "X-API-Key: $ENCONVERT_API_KEY" -F "[email protected]"
The filename extension decides the input format. This is the flow's sharpest edge on an agent platform, where the input is usually a URL rather than a local path: download the source first with no X-API-Key header (it is a third-party host), keep the original filename, then post the bytes. A name the API cannot read is repaired from the bytes when the format carries a signature (a PDF, an image or a DOCX survives it), but a text format has none, so markdown saved as notes.lJzoMq6Akq comes back as 400 Invalid file format '.ljzomq6akq' for anything-to-markdown. The scripts/convert.sh helper bundled with the skill does the whole download-post-fetch sequence correctly.
Troubleshooting#
The agent never mentions EnConvert.
The skill did not load. Either ENCONVERT_API_KEY is not visible to the agent process or curl is not on PATH. Load-time filtering is silent by design, so there is nothing in the logs to find.
401 or 403 on every call.
The key is missing, wrong, or a public pk_ key. Run the whoami call above; it fails in exactly the same way and tells you in one line.
A 404 from web search.
The agent guessed an endpoint named after the word "search". No such path exists. Web search is POST /v2/lookup.
400 Invalid file format.
The uploaded file had no usable extension and no signature in its bytes to recover one from, which is every text format: CSV, HTML, Markdown, plain text. Keep the source filename, or rename the download to one with the right suffix.
The page comes back empty, or as [object Object].
outputs.markdown is a signed URL. Fetch it. Only structured arrives inline.
A download link stopped working. Signed URLs last 15 minutes. Run the operation again rather than trying to refresh the link.
Source and links#
- ClawHub listing: clawhub.ai/enconvert/skills/enconvert
- Publisher: @enconvert
- OpenClaw skills: docs.openclaw.ai/tools/skills
- ClawHub skill format: docs.openclaw.ai/clawhub/skill-format
- Underlying API: Introduction, Perceive, Anything to Markdown
- Source: enconvert/clawhub-enconvert
For a coding agent that supports the Model Context Protocol instead, MCP Setup exposes the same operations as real registered tools.
Frequently asked questions#
How do I install the EnConvert skill in OpenClaw?#
Run openclaw skills install @enconvert/enconvert. That is the command the ClawHub listing shows. The ClawHub CLI installs the same skill with clawhub install @enconvert/enconvert after npm i -g clawhub. Then set ENCONVERT_API_KEY to a private sk_ key from your dashboard, because the skill will not load without it.
How do I make an OpenClaw agent read a web page as markdown?#
Ask it for the page once the skill is installed. It calls POST /v2/perceive with outputs: ["markdown"], then fetches outputs.markdown.url with a plain GET and no key. Markdown is roughly six times smaller than the raw HTML of the same page, which cuts the token cost of everything the agent does with it afterwards.
Why does the skill do nothing at all?#
OpenClaw filters skills at load time against their declared requirements. This one declares the ENCONVERT_API_KEY env var and the curl binary. If either is absent the skill is excluded before the agent ever sees it, with no error message. That is the cause almost every time.
Is the skill a registered tool the agent can call?#
No. It is a markdown instruction file the agent reads and acts on with curl. There is no tool schema and no argument validation, which is why the skill file spells out each endpoint, header and response shape. Nothing else needs installing.
Can I use a public pk_ key?#
No. Public keys are for browser widgets and every operation here rejects them with a 403. Use a private key that starts with sk_, generated in Dashboard, API keys.
How does the agent know a page failed to render?#
Every perceive response carries render_quality, a number from 0.0 to 1.0 inside a normal 200. A challenge page, a cookie wall or a script that never settled scores low. The skill instructs the agent to read that score first and surface a degraded read rather than presenting it as reliable.