Overview
The URL is first checked to be a public web address; private, loopback and other internal hosts are refused. The page is then loaded by a headless Chrome rendering service and printed with Chrome's PDF output. The render has a 25-second limit, and failures such as an unreachable site or a timeout come back as an error response with an explanatory message.
Margins are numbers in inches and default to 0.4 on every side; the response echoes them as strings with an `in` suffix, such as `"0.4in"`. `landscape` defaults to false. `format` is matched case-insensitively against A4, Letter, Legal, Tabloid, Ledger, A3, A5 and A6, and anything else falls back to A4. `printBackground` defaults to true; set it to false and the page's background colors and images are left out.
After rendering, the PDF is opened once to count its pages. If that read fails, the file is still delivered and `pageCount` is null. The PDF is stored under a random `pdfName`, and `downloadURL` is a signed link that works until `expires`, a Unix timestamp in milliseconds two days after the call. The response never contains the PDF bytes, so download the file before it expires.
On the Free plan the margin, `landscape`, `format` and `printBackground` parameters are removed before rendering, so every free PDF uses the defaults, and the `format` and `pageCount` response fields are null. Pages behind a login, cookie wall or bot check render as whatever the browser is shown, which may be the wall itself.
Live Test Website to PDF Skill Skill →
The tool
Once your client is connected to the VerveKit server, this appears in its tool list as WebsitetoPDFSkill. It is read-only and open-world — it fetches and never mutates anything on your side — so most clients call it without asking you to confirm.
{
"name": "WebsitetoPDFSkill",
"arguments": {
"url": "https://en.wikipedia.org/wiki/PDF"
}
}You do not name the tool yourself; the model picks it. Asking about https://en.wikipedia.org/wiki/PDF in the terms this skill covers is enough for it to reach for WebsitetoPDFSkill on its own — naming it explicitly also works, and is the way to force the call.
Connecting
One server URL covers every skill in the catalog, including this one. Authorization is OAuth: the client opens a browser once, and there is no key to paste into a config file.
{
"mcpServers": {
"vervekit": {
"url": "https://api.vervekit.com/v1/mcp"
}
}
}https://api.vervekit.com/v1/mcpPer-client setup — Claude, Cursor, VS Code, ChatGPT — is on the MCP setup page.
Arguments
These are the properties on the tool's inputSchema, so a well-behaved client validates them before the call is made. Premium arguments are accepted on every plan but only take effect on plans that include them.
| Argument | Type | Description |
|---|---|---|
urlRequired | string | The URL of the website to convert to PDF url |
marginTopOptionalPremium | number | The top margin of the PDF in inches (e.g., 0.4) default 0.4 |
marginRightOptionalPremium | number | The right margin of the PDF in inches (e.g., 0.4) default 0.4 |
marginBottomOptionalPremium | number | The bottom margin of the PDF in inches (e.g., 0.4) default 0.4 |
marginLeftOptionalPremium | number | The left margin of the PDF in inches (e.g., 0.4) default 0.4 |
landscapeOptionalPremium | boolean | Set to true for landscape orientation |
formatOptionalPremium | string | Paper sizeA4LetterLegalTabloidLedgerA3A5A6default A4 |
printBackgroundOptionalPremium | boolean | Print background colors and images; set false for an ink-saving document default true |
What the model gets back
The result carries a structuredContent object matching the tool's declared outputSchema, so a client reads fields without parsing prose. status is "ok" and error is null on success; a null field means the value was not available for that input, not that the call failed.
{
"status": "ok",
"error": null,
"data": {
"marginLeft": "0.4in",
"marginRight": "0.4in",
"marginTop": "0.4in",
"marginBottom": "0.4in",
"landscape": false,
"format": "A4",
"pageCount": 6,
"pdfName": "128deceb-c515-444b-8863-82cb3f6ba632.pdf",
"expires": 1766097122116,
"url": "https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts",
"downloadURL": "https://storage.googleapis.com/apiverve-helpers.appspot.com/websitetopdf/128deceb-c515-444b-8863-82cb3f6ba632.pdf?GoogleAccessId=1089020767582-compute%40developer.gserviceaccount.com&Expires=1766097122&Signature=LI747FKqKj5i5TYX3KIoVy%2FHgXsLOSXfVEUM0Ekqz2SiiYOZWuk3Of7QBDUklSrcbjiHV0AjbzFTKt6oDU83UkN282HbmhxwrolN6v1Zb9twVi1y7gmTpapCiJi%2BpA1r89ioe%2Fe0%2FV7KrIWaqsorzpdJrnMqe2izMWBaZq%2FYkSO2qlwSyhg2R8EsfxYNAANtd%2FuNS0RuIzqTdhNCiTrRirnDAKS3dMCySQJRznHFnyqzNj1OXwVjvdpSMn9XhWCUa%2FDRR8q%2BE9B0yF8eTvIrDSe2OzJT%2FJLc9rxcLfXAny21gtNqrzMJPU4yM9Ge%2BEbepmDnNZf9xpODNsnq5eLF0g%3D%3D"
}
}
Response fields
Paths are relative to data. Premium fields are absent rather than zeroed on plans that do not include them, so check for presence instead of comparing to 0.
| Field | Type | Example | Description |
|---|---|---|---|
marginLeft | string | 0.4in | Left margin of generated PDF in inches |
marginRight | string | 0.4in | Right margin of generated PDF in inches |
marginTop | string | 0.4in | Top margin of generated PDF in inches |
marginBottom | string | 0.4in | Bottom margin of generated PDF in inches |
landscape | boolean | false | PDF orientation mode (true for landscape) |
formatPremium | string | A4 | Paper size used |
pageCountPremium | number | 6 | Number of pages in the generated PDF; null if it could not be read |
pdfName | string | 128deceb-c515-444b-8863-82cb3f6ba632.pdf | Generated PDF filename with unique identifier |
expires | number | 1766097122116 | PDF expiration timestamp in milliseconds |
url | string | https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts | Original source URL that was converted to PDF |
downloadURL | string | https://storage.googleapis.com/apiverve-helpers.appspot.com/websitetopdf/128deceb-c515-444b-8863-82c… | Temporary signed URL for downloading the PDF file |
Failure modes
Errors come back as tool errors carrying a sentence the model can act on, not a bare status code. Error handling covers the full list.
| Status | What it means |
|---|---|
400 / 422 | The arguments did not validate. The message names the offending one. |
401 | The OAuth session is invalid or expired — reconnect the server. |
403 | Blocked by a key restriction or an IP allow-list. Never a bad identity. |
404 | This skill is not part of VerveKit. Check the catalog. |
429 | Out of credits, or a brief rate limit. The message tells them apart. |
A call costs 40 credits each time the tool actually runs; a model that reasons about the tool without calling it costs nothing.
Use cases
- Billing Receipt Archival
- SaaS platforms pass payment confirmation URLs to provide customers with downloadable PDF receipts via the temporary download link.
- Article Offline Reading
- To preserve online research, bookmarking tools submit article URLs and save the resulting PDF download links for offline reading.
- Policy Compliance Tracking
- When terms of service update, legal teams generate timestamped PDF records directly from live policy pages for compliance archives.
- Automated Report Exports
- Archive public analytics dashboards by converting page URLs into PDF files to attach to scheduled client reports.
Other ways to use Website to PDF Skill
Set up Website to PDF Skill on VerveKit, or reach the same source a different way. Your VerveKit account and credits work on all of them — one key, one balance.
Related
More in Documents: