Install
openclaw skills install @icexun/drop-files-skillUpload generated HTML/Markdown files to DropFiles and get a shareable public link. Invoke when the user wants to share, publish, or generate a public link for any HTML or Markdown content they produced.
openclaw skills install @icexun/drop-files-skillUpload generated HTML or Markdown content to the DropFiles service and return a public shareable link. The service is free, globally accessible, and hosted on Cloudflare's edge network.
Invoke this skill when the user wants to:
https://dropfiles.tokendealhub.comPOST /api/v1/uploadGET /api/v1/info/{id}https://dropfiles.tokendealhub.com/v/{id}IMPORTANT: Always use curl to send the upload request. The API is behind Cloudflare WAF which may block requests from other HTTP clients (e.g. Python urllib, Node fetch) with HTTP 403 (error code 1010). curl is the only reliably working client.
Send a POST request to https://dropfiles.tokendealhub.com/api/v1/upload with Content-Type: application/json.
When the content to upload is large (e.g. over 2KB) or contains special characters (quotes, backslashes, HTML tags, etc.), do NOT inline the content in a shell command. Instead, write the JSON payload to a temporary file first, then use curl -d @file:
# Step 1: Write JSON payload to a temp file (use Python or any method)
python3 -c "
import json
payload = json.dumps({
'content': open('your_file.md').read(),
'type': 'markdown',
'expire': '7d',
'title': 'My Document'
})
with open('/tmp/dropfiles_payload.json', 'w') as f:
f.write(payload)
"
# Step 2: Upload using curl with file reference
curl -X POST https://dropfiles.tokendealhub.com/api/v1/upload \
-H "Content-Type: application/json" \
-d @/tmp/dropfiles_payload.json
# Step 3: Clean up
rm /tmp/dropfiles_payload.json
| Field | Type | Required | Description |
|---|---|---|---|
content | string | Yes | The HTML or Markdown text to upload. Max 5MB. |
type | string | No | html, markdown, or auto (default: auto, auto-detects from content). |
expire | string | No | 1h, 1d, 7d, or 30d (default: 7d). |
title | string | No | Optional title shown on the share page. |
password | string | No | Optional password to protect the share page. See Password Policy below. |
lang | string | No | en, zh, or auto (default: auto). |
curl -X POST https://dropfiles.tokendealhub.com/api/v1/upload \
-H "Content-Type: application/json" \
-d '{
"content": "# Hello World\n\nThis is a shared Markdown document.",
"type": "markdown",
"expire": "7d",
"title": "My Document"
}'
curl -X POST https://dropfiles.tokendealhub.com/api/v1/upload \
-H "Content-Type: application/json" \
-d '{
"content": "# Secret Report\n\nConfidential content.",
"type": "markdown",
"expire": "1d",
"password": "user_provided_password"
}'
curl -X POST https://dropfiles.tokendealhub.com/api/v1/upload \
-H "Content-Type: application/json" \
-d '{
"content": "# Protected Document\n\nContent here.",
"type": "markdown",
"expire": "7d",
"password": "482917"
}'
The default behavior is no password — the share link is publicly accessible by anyone with the URL.
Password protection is opt-in and supports three modes:
password field entirely, or send null. The share page is publicly readable.password field. The share page will prompt viewers for this password."482917") and include it in the password field. The generated password must be clearly communicated back to the user so they can share it with intended viewers.0-9 repeated 6 times, random)."482917".Generated password: 482917. The user needs this to share with viewers.{
"success": true,
"data": {
"id": "abc123def456",
"url": "https://dropfiles.tokendealhub.com/v/abc123def456",
"preview_url": "https://dropfiles.tokendealhub.com/v/abc123def456?preview=1",
"expire_at": "2026-07-22T10:30:00.000Z",
"type": "markdown",
"size": 42
}
}
{
"success": false,
"error": {
"code": "CONTENT_REQUIRED",
"message": "Content is required"
}
}
Common error codes:
CONTENT_REQUIRED — content field is empty.CONTENT_TOO_LARGE — content exceeds 5MB.INVALID_TYPE — type is not one of html, markdown, auto.INVALID_EXPIRE — expire is not one of 1h, 1d, 7d, 30d.RATE_LIMIT_EXCEEDED — too many requests from the same IP.type: use auto unless the user specifies. Auto-detection treats content containing <html or <!doctype as HTML, otherwise Markdown.expire: default 7d unless the user requests a different lifetime.title: optional, set if the user provides one.curl (see "Upload Request" section above).
curl -d argument.curl -d @/tmp/dropfiles_payload.json. Clean up the temp file afterwards.url (and preview_url if relevant) to the user. If a password was generated, prominently display it: Generated password: XXXXXX.error.message to the user and suggest fixes.When type is auto (the default), the server detects the type:
<html or <!doctype (case-insensitive) → htmlmarkdownHTML content is sanitized server-side (scripts are stripped) for safety. Markdown content is rendered to HTML with a GitHub-like stylesheet on the share page.
RATE_LIMIT_EXCEEDED, wait and retry.<script> tags and event handlers are removed.preview_url adds ?preview=1 and is useful when embedding the link in a context that should not inflate the access counter on initial load.