---
seo_title: ClawHub Skill for OpenClaw Web Scraping and File Conversion | EnConvert
meta_desc: Install the EnConvert skill from ClawHub so an OpenClaw agent can read pages into markdown, search the web, extract structured fields and convert files with curl.
keywords: openclaw agent web scraping, clawhub skill, openclaw skill install, agent markdown extraction, openclaw scrape url to markdown, openclaw web search skill, clawhub enconvert, openclaw api key secret, agent structured data extraction, openclaw file conversion skill
---

# ClawHub Skill for OpenClaw Agents

The EnConvert skill is published on [ClawHub](https://clawhub.ai), the skill registry for [OpenClaw](https://openclaw.ai) 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.

<div class="alert alert-info">
<strong>Install:</strong> <code>openclaw skills install @enconvert/enconvert</code> · <strong>Listing:</strong> <a href="https://clawhub.ai/enconvert/skills/enconvert">clawhub.ai/enconvert/skills/enconvert</a> · <strong>Version:</strong> 0.0.1 · <strong>Source:</strong> <a href="https://github.com/enconvert/clawhub-enconvert">enconvert/clawhub-enconvert</a>
</div>

---

## 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.

<div class="alert alert-warning">
<strong>Web search is <code>POST /v2/lookup</code>.</strong> 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.
</div>

---

## Install

Install it with the OpenClaw CLI:

```bash
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:

```bash
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`**.

1. Generate a **private** API key in the [dashboard](/dashboard/api-keys). Private keys start with `sk_`.
2. Make it available to the agent, either as `ENCONVERT_API_KEY` in the environment the agent runs in, or injected for this skill through your OpenClaw config. The [skills configuration reference](https://docs.openclaw.ai/tools/skills) covers the per-skill `env` block.
3. Confirm the key works before asking the agent to do anything:

```bash
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](/docs/authentication.md#private-keys).

<div class="alert alert-warning">
<strong>Without the key, the skill silently never loads.</strong> OpenClaw filters skills at load time against the requirements declared in the file: this one needs the <code>ENCONVERT_API_KEY</code> env var and the <code>curl</code> binary on <code>PATH</code>. 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 <code>curl --version</code> and the <code>whoami</code> call above before debugging anything else.
</div>

---

## 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:

```bash
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_quality` comes first.** It is a number from 0.0 to 1.0 in a `200` response, not an HTTP error. A low score means the render is degraded, so treat the content as suspect rather than authoritative.
- **Every artifact under `outputs` is a 15-minute signed URL, markdown included.** `outputs.markdown.url` is a link, not the text of the page. So are `html_cleaned`, `html_raw`, `screenshot`, `screenshot_full_page`, `pdf`, `links` and `images`. Fetch each with a plain `GET` and **no** `X-API-Key` header: 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](/docs/concepts/signed-urls.md).
- **`structured` is the exception.** It comes back inline at the top level of the response, not under `outputs`.

An agent that expects inline markdown reads an object where it wanted text, and reports the page as empty. Two steps, not one:

```bash
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.

```bash
curl -sS -X POST https://api.enconvert.com/v1/convert/anything-to-markdown \
  -H "X-API-Key: $ENCONVERT_API_KEY" -F "file=@report.docx"
```

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](https://clawhub.ai/enconvert/skills/enconvert)
- **Publisher**: [@enconvert](https://clawhub.ai/@enconvert)
- **OpenClaw skills**: [docs.openclaw.ai/tools/skills](https://docs.openclaw.ai/tools/skills)
- **ClawHub skill format**: [docs.openclaw.ai/clawhub/skill-format](https://docs.openclaw.ai/clawhub/skill-format)
- **Underlying API**: [Introduction](/docs/introduction.md), [Perceive](/docs/endpoints/perceive.md), [Anything to Markdown](/docs/endpoints/convert/documents/anything-to-markdown.md)
- **Source**: [enconvert/clawhub-enconvert](https://github.com/enconvert/clawhub-enconvert)

For a coding agent that supports the Model Context Protocol instead, [MCP Setup](/docs/guides/integrations/mcp-setup.md) 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.
