WebsitePublisher

Build and publish complete websites via WebsitePublisher.ai. Create pages, upload assets, manage dynamic data (products, team members, blog posts), configure...

MIT-0 · Free to use, modify, and redistribute. No attribution required.
0 · 10 · 0 current installs · 0 all-time installs
byMichael Egberts@megberts
MIT-0
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description claim to publish websites and the skill only requires an API token and project ID for WebsitePublisher.ai — these are appropriate and proportional for that purpose. No unrelated binaries, config paths, or services are requested.
Instruction Scope
SKILL.md contains explicit curl-based API calls to api.websitepublisher.ai and cdn.websitepublisher.ai for listing status, creating pages, uploading assets, and managing entities. Instructions only reference the declared env vars and the documented endpoints; they do not instruct reading unrelated files, system credentials, or transmitting data to other endpoints.
Install Mechanism
Instruction-only skill with no install spec and no code files. Nothing is downloaded or written to disk by the skill itself, which minimizes installation risk.
Credentials
Requires two environment variables (WEBSITEPUBLISHER_TOKEN, WEBSITEPUBLISHER_PROJECT). Both are directly relevant: the token is the API credential and the project ID scopes operations. No additional or unrelated secrets are requested.
Persistence & Privilege
always is false and the skill does not request persistent or elevated platform privileges. It does not modify other skills or system-wide settings. Autonomous invocation is enabled by default but is not excessive here.
Assessment
This skill appears to be a straightforward integration with WebsitePublisher.ai. Before installing: 1) Verify you trust the WebsitePublisher.ai service and review their privacy/terms, because the token grants full project control; 2) Store the API token in a secure place (environment variables are acceptable) and avoid sharing it; 3) Understand that any content or assets you upload will be hosted/published publicly if the project is published; 4) If you need stricter safety, create a limited project or token with only the permissions needed. No other red flags were found in the SKILL.md or bundled files.

Like a lobster shell, security has layers — review code before you run it.

Current versionv1.0.0
Download zip
latestvk97ahezv2yts79z0cjebmb5ybs839cgh

License

MIT-0
Free to use, modify, and redistribute. No attribution required.

Runtime requirements

🌐 Clawdis
EnvWEBSITEPUBLISHER_TOKEN, WEBSITEPUBLISHER_PROJECT
Primary envWEBSITEPUBLISHER_TOKEN

SKILL.md

WebsitePublisher.ai

Build and publish real websites through conversation. You describe it — the AI builds and deploys it.

The user's credentials are set as environment variables:

  • WEBSITEPUBLISHER_TOKEN — API token (starts with wpa_)
  • WEBSITEPUBLISHER_PROJECT — Project ID (numeric, e.g. 12345)

If either variable is missing, stop and instruct the user:

  1. Sign up at https://www.websitepublisher.ai/dashboard
  2. Copy their API token and Project ID from the dashboard
  3. Add to their OpenClaw config:
    {
      "env": {
        "WEBSITEPUBLISHER_TOKEN": "wpa_xxxx...",
        "WEBSITEPUBLISHER_PROJECT": "12345"
      }
    }
    

Authentication

Every API call requires these headers:

Authorization: Bearer $WEBSITEPUBLISHER_TOKEN
Content-Type: application/json
Accept: application/json

Base URL: https://api.websitepublisher.ai


Workflow — Build a Complete Website

When asked to build a website, follow this exact sequence:

Step 1 — Check existing content

curl -s \
  -H "Authorization: Bearer $WEBSITEPUBLISHER_TOKEN" \
  -H "Accept: application/json" \
  "https://api.websitepublisher.ai/papi/project/$WEBSITEPUBLISHER_PROJECT/status"

This returns the project URL, existing pages, and current status. Always do this first.

Step 2 — Create pages (use bulk for multiple pages)

Single page:

curl -s -X POST \
  -H "Authorization: Bearer $WEBSITEPUBLISHER_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "slug": "index.html",
    "content": "<!DOCTYPE html><html lang=\"en\">...</html>",
    "title": "Homepage",
    "seotitle": "Company Name — Tagline",
    "seodescription": "One sentence describing the page for search engines."
  }' \
  "https://api.websitepublisher.ai/papi/project/$WEBSITEPUBLISHER_PROJECT/pages"

Multiple pages at once (preferred — saves API calls):

curl -s -X POST \
  -H "Authorization: Bearer $WEBSITEPUBLISHER_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "pages": [
      {"slug": "index.html", "content": "...", "title": "Home"},
      {"slug": "about.html", "content": "...", "title": "About"},
      {"slug": "contact.html", "content": "...", "title": "Contact"}
    ]
  }' \
  "https://api.websitepublisher.ai/papi/project/$WEBSITEPUBLISHER_PROJECT/pages/bulk"

Step 3 — Upload assets (images, CSS, JS)

curl -s -X POST \
  -H "Authorization: Bearer $WEBSITEPUBLISHER_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "slug": "images/logo.png",
    "content": "BASE64_ENCODED_DATA",
    "alt": "Company Logo"
  }' \
  "https://api.websitepublisher.ai/papi/project/$WEBSITEPUBLISHER_PROJECT/assets"

Asset URL pattern: https://cdn.websitepublisher.ai/[path]/[slug]
Reference assets in HTML using this CDN URL.

Step 4 — Confirm live URL

The project URL is returned by the status endpoint. Share it with the user.


PAPI — Pages & Assets (Full Reference)

Pages

ActionMethodEndpoint
List pagesGET/papi/project/{id}/pages
Get pageGET/papi/project/{id}/pages/{slug}
Create pagePOST/papi/project/{id}/pages
Bulk createPOST/papi/project/{id}/pages/bulk
Update pagePUT/papi/project/{id}/pages/{slug}
Patch pagePATCH/papi/project/{id}/pages/{slug}
Delete pageDELETE/papi/project/{id}/pages/{slug}
List versionsGET/papi/project/{id}/pages/{slug}/versions
RollbackPOST/papi/project/{id}/pages/{slug}/rollback

Page fields:

{
  "slug": "about.html",
  "content": "full HTML string",
  "title": "label shown in dashboard",
  "seotitle": "browser tab + search title",
  "seodescription": "meta description for search",
  "seokeywords": "comma,separated,keywords",
  "canonical": "https://example.com/about"
}

Patch a page (partial update — send only changed HTML fragment):

curl -s -X PATCH \
  -H "Authorization: Bearer $WEBSITEPUBLISHER_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "patches": [
      {
        "search": "<h1>Old Title</h1>",
        "replace": "<h1>New Title</h1>"
      }
    ]
  }' \
  "https://api.websitepublisher.ai/papi/project/$WEBSITEPUBLISHER_PROJECT/pages/index.html"

Assets

ActionMethodEndpoint
List assetsGET/papi/project/{id}/assets
Get assetGET/papi/project/{id}/assets/{slug}
Upload assetPOST/papi/project/{id}/assets
Bulk uploadPOST/papi/project/{id}/assets/bulk
Delete assetDELETE/papi/project/{id}/assets/{slug}

Asset fields:

{
  "slug": "images/hero.jpg",
  "content": "BASE64_STRING or https://example.com/image.jpg",
  "alt": "Description for accessibility",
  "type": "image"
}

Tip: You can pass a public image URL as content — the platform fetches and stores it automatically.


MAPI — Dynamic Data (Products, Blog, Team, etc.)

Use MAPI when the website needs structured, repeatable data — product listings, blog posts, team members, portfolio items, etc.

Create an entity (data model)

curl -s -X POST \
  -H "Authorization: Bearer $WEBSITEPUBLISHER_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "name": "products",
    "properties": [
      {"name": "name", "type": "string", "required": true},
      {"name": "price", "type": "number"},
      {"name": "description", "type": "text"},
      {"name": "image", "type": "image"}
    ]
  }' \
  "https://api.websitepublisher.ai/mapi/project/$WEBSITEPUBLISHER_PROJECT/entities"

Create records

curl -s -X POST \
  -H "Authorization: Bearer $WEBSITEPUBLISHER_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "name": "Wireless Headphones",
    "price": 89.99,
    "description": "Premium noise-cancelling headphones",
    "image": "https://example.com/headphones.jpg"
  }' \
  "https://api.websitepublisher.ai/mapi/project/$WEBSITEPUBLISHER_PROJECT/products"

Note: MAPI endpoint uses the plural entity name — e.g. /products not /product.

MAPI Reference

ActionMethodEndpoint
List entitiesGET/mapi/project/{id}/entities
Create entityPOST/mapi/project/{id}/entities
Get entity schemaGET/mapi/project/{id}/entities/{name}/properties
List recordsGET/mapi/project/{id}/{entity}
Get recordGET/mapi/project/{id}/{entity}/{recordId}
Create recordPOST/mapi/project/{id}/{entity}
Update recordPUT/mapi/project/{id}/{entity}/{recordId}
Delete recordDELETE/mapi/project/{id}/{entity}/{recordId}

Public read: MAPI records are publicly readable at the same endpoint without a token — useful for frontend JavaScript fetching live data.


SAPI — Contact Forms

Add a working contact form to any page in two steps.

Step 1 — Configure the form

curl -s -X POST \
  -H "Authorization: Bearer $WEBSITEPUBLISHER_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "page_slug": "contact.html",
    "fields": [
      {"name": "name", "type": "text", "required": true, "label": "Your Name"},
      {"name": "email", "type": "email", "required": true, "label": "Email Address"},
      {"name": "message", "type": "textarea", "required": true, "label": "Message"}
    ],
    "submit_label": "Send Message",
    "success_message": "Thank you! We will get back to you shortly.",
    "notification_email": "hello@example.com"
  }' \
  "https://api.websitepublisher.ai/sapi/project/$WEBSITEPUBLISHER_PROJECT/forms"

Important: Always send ALL fields on every configure_form call — no partial updates.

Step 2 — Add the form HTML to the page

The API returns a form_id. Use this snippet in the page HTML:

<form id="wp-contact-form" data-form-id="FORM_ID_HERE">
  <!-- fields rendered by JS -->
</form>
<script src="https://api.websitepublisher.ai/sapi/form.js"></script>

SAPI Reference

ActionMethodEndpoint
Configure formPOST/sapi/project/{id}/forms
List formsGET/sapi/project/{id}/forms
Remove formDELETE/sapi/project/{id}/forms/{form_id}

Rate Limits

PlanLimit
Free30 requests/min
Starter60 requests/min
Pro+150-300 requests/min

Always prefer bulk endpoints (/pages/bulk, /assets/bulk) over individual calls to stay within rate limits. A bulk call counts as one request regardless of how many items it creates.


Common Patterns

Landing page (one page)

  1. GET /status — check project
  2. POST /pages — create index.html with full content
  3. POST /forms — configure contact form if needed
  4. Share project URL

Multi-page website

  1. GET /status — check project
  2. POST /pages/bulk — create all pages in one call
  3. POST /assets/bulk — upload all images in one call
  4. POST /forms — configure contact form on contact page
  5. Share project URL

Website with dynamic data (e.g. product catalogue)

  1. GET /status — check project
  2. POST /entities — create data model (e.g. "products")
  3. POST /{entity} — create records (one per product)
  4. POST /pages/bulk — create pages with JS that fetches MAPI data
  5. Share project URL

Error Handling

All endpoints return standard HTTP status codes:

CodeMeaning
200/201Success
400Invalid request — check your JSON fields
401Invalid or missing token
404Page/asset/entity not found
422Validation error — response body contains field errors
429Rate limit exceeded — use bulk endpoints or wait
500Server error — try again

On error, the response body always contains a message field with a description.


Support & Docs

Files

3 total
Select a file
Select a file to preview.

Comments

Loading comments…