Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Integration skill for Biver Landing Page Builder API. Use when: (1) Creating, updating, or deleting landing pages (2) Managing subdomains (.lp.biver.id) or c...
Integration skill for Biver Landing Page Builder API. Use when: (1) Creating, updating, or deleting landing pages (2) Managing subdomains (.lp.biver.id) or c...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Security Checklist Before installing or supplying credentials, please review: Credential Required: This skill requires BIVER_API_KEY to operate Start with Test Keys: Use bvr_test_ prefix keys for initial testing โ never use bvr_live_ keys until you trust the skill Verify Scopes: Check required API key scopes below and use least-privilege principle Rotate Keys: Periodically rotate your API keys for security Inspect Source: If using manual installation, inspect the GitHub repository code before cloning
clawdhub install biver-builder
Warning: Cloning external repositories can introduce arbitrary code. Inspect the repository first before running: # Step 1: Review the source code git clone https://github.com/RamaAditya49/biver-builder.git /tmp/biver-builder-review # Review files in /tmp/biver-builder-review before proceeding # Step 2: Only after review, install to your skills directory git clone https://github.com/RamaAditya49/biver-builder.git ~/.openclaw/skills/biver-builder
VariableDescriptionExampleBIVER_API_KEYYour Biver API keybvr_live_xxxxx or bvr_test_xxxxx
VariableDescriptionDefaultBIVER_API_BASE_URLCustom API base URLhttps://api.biver.id
Via OpenClaw Dashboard: Navigate to Settings > Environment Variables Add BIVER_API_KEY with your API key value (Optional) Add BIVER_API_BASE_URL for custom endpoints Security Best Practices: Use bvr_test_ prefix keys for development/testing Use bvr_live_ prefix keys only in production after you trust the skill Verify required scopes before creating your API key โ only grant minimum permissions needed Never commit API keys to version control Rotate keys periodically Do not supply credentials until you have reviewed the skill or confirmed it from a verified source
Log in to Biver Dashboard Go to Settings > API Keys Click Generate New Key Select required scopes (see Required Scopes section below โ grant only what you need) Choose key type: bvr_test_ for testing, bvr_live_ for production Copy and store securely (shown only once) Scope Recommendation: Start with read-only scopes (*:read) for testing. Add write scopes only when needed.
https://api.biver.id
// Use environment variables for security const apiKey = process.env.BIVER_API_KEY; // Headers configuration { 'X-API-Key': apiKey, 'Authorization': `Bearer ${apiKey}` }
PrefixEnvironmentUsagebvr_live_ProductionReal data operationsbvr_test_SandboxTesting without affecting real data
TaskEndpointMethodAuthScopeList pages/v1/pagesGETYespages:readCreate page/v1/pagesPOSTYespages:writeGet page/v1/pages/:idGETYespages:readUpdate page/v1/pages/:idPATCHYespages:writeDelete page/v1/pages/:idDELETEYespages:writeDeploy page/v1/pages/:id/deployPOSTYespages:writeList subdomains/v1/subdomainsGETYespages:readCreate subdomain/v1/subdomainsPOSTYespages:writeUpdate subdomain/v1/subdomains/:idPATCHYespages:writeDelete subdomain/v1/subdomains/:idDELETEYespages:writeList domains/v1/domainsGETYesdomains:readAdd custom domain/v1/domainsPOSTYesdomains:writeSet primary domain/v1/domains/:id/primaryPOSTYesdomains:writeDelete domain/v1/domains/:idDELETEYesdomains:writeList sections/v1/sectionsGETYessections:readCreate section/v1/sectionsPOSTYessections:writeUpdate section/v1/sections/:idPATCHYessections:writeDelete section/v1/sections/:idDELETEYessections:writeList products/v1/productsGETYesproducts:readCreate product/v1/productsPOSTYesproducts:writeUpdate product/v1/products/:idPATCHYesproducts:writeDelete product/v1/products/:idDELETEYesproducts:writeList forms/v1/formsGETYesforms:readCreate form/v1/formsPOSTYesforms:writeGet submissions/v1/forms/:id/submissionsGETYesforms:readSubmit form/v1/forms/:id/submitPOSTNo-List gallery/v1/galleryGETYesgallery:readUpload asset/v1/galleryPOSTYesgallery:readDelete asset/v1/gallery/:idDELETEYesgallery:readGet workspace/v1/workspace/settingsGETYesworkspace:readUpdate workspace/v1/workspace/settingsPUTYesworkspace:writeUpdate branding/v1/workspace/brandingPUTYesworkspace:writeUpdate SEO/v1/workspace/seoPUTYesworkspace:writeAI generate page/v1/ai/pagesPOSTYesai:generateAI generate section/v1/ai/sectionsPOSTYesai:generateHealth check/healthGETNo-
ScopeDescriptionpages:readRead pagespages:writeCreate, update, delete pagessections:readRead sectionssections:writeCreate, update, delete sectionsproducts:readRead productsproducts:writeManage product catalogforms:readRead forms and submissionsforms:writeCreate/update formsgallery:readAccess gallery assetsdomains:readView custom domainsdomains:writeAdd/remove custom domainssubdomains:readView subdomainssubdomains:writeCreate/update/delete subdomainsworkspace:readRead workspace settingsworkspace:writeUpdate workspace settingsai:generateGenerate pages/sections with AI
const API_KEY = process.env.BIVER_API_KEY; const BASE_URL = process.env.BIVER_API_BASE_URL || 'https://api.biver.id'; // Step 1: Create subdomain const subdomain = await fetch(`${BASE_URL}/v1/subdomains`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY }, body: JSON.stringify({ subdomain: 'my-store', title: 'Summer Sale 2026', description: 'Our biggest sale event', pathSlug: 'summer-sale' }) }); // Result: my-store.lp.biver.id/summer-sale // Step 2: Create sections for the page const section = await fetch(`${BASE_URL}/v1/sections?pageId=PAGE_ID`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY }, body: JSON.stringify({ type: 'hero', name: 'Hero Section', htmlContent: '<div class="hero">...</div>', cssContent: '.hero { ... }', visible: true, order: 0 }) }); // Step 3: Update subdomain status to publish await fetch(`${BASE_URL}/v1/subdomains/${subdomainId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY }, body: JSON.stringify({ status: 'published' }) });
const API_KEY = process.env.BIVER_API_KEY; const BASE_URL = process.env.BIVER_API_BASE_URL || 'https://api.biver.id'; // Step 1: Add custom domain const domain = await fetch(`${BASE_URL}/v1/domains`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY }, body: JSON.stringify({ domain: 'example.com', isPrimary: true, landingPageId: 'page_123' }) }); // Step 2: Configure DNS (outside API) // Add verification token to DNS records // Token provided in response: verificationToken // Step 3: Set as primary (optional) await fetch(`${BASE_URL}/v1/domains/${domainId}/primary`, { method: 'POST', headers: { 'X-API-Key': API_KEY } });
const API_KEY = process.env.BIVER_API_KEY; const BASE_URL = process.env.BIVER_API_BASE_URL || 'https://api.biver.id'; const aiPage = await fetch(`${BASE_URL}/v1/ai/pages`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY }, body: JSON.stringify({ prompt: 'Create a landing page for a coffee shop called Morning Brew', style: 'modern', industry: 'fnb', language: 'en' }) }); // Returns: title, content.sections[], suggestedSlug
const API_KEY = process.env.BIVER_API_KEY; const BASE_URL = process.env.BIVER_API_BASE_URL || 'https://api.biver.id'; // Step 1: Upload image to gallery const formData = new FormData(); formData.append('file', imageFile); const asset = await fetch(`${BASE_URL}/v1/gallery`, { method: 'POST', headers: { 'X-API-Key': API_KEY }, body: formData }); // Step 2: Use asset URL in page content const page = await fetch(`${BASE_URL}/v1/pages`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY }, body: JSON.stringify({ title: 'Product Catalog', slug: 'catalog', content: { sections: [{ type: 'image', imageUrl: asset.data.url }] } }) });
Base: /v1/pages | Scope: pages:read / pages:write EndpointMethodDescriptionQuery Params / Body/v1/pagesGETList pagespage, limit, status, search/v1/pagesPOSTCreate pagetitle, slug, content, meta, status/v1/pages/:idGETGet page detail-/v1/pages/:idPATCHUpdate pagePartial body/v1/pages/:idDELETEDelete page-/v1/pages/:id/deployPOSTPublish page- Page Object: { "id": "page_123", "title": "Summer Sale", "slug": "summer-sale", "status": "published", "publishedAt_ms": 1708704000000, "createdAt_ms": 1708617600000 } Create Page Body: { "title": "Page Title", "slug": "page-slug", "content": { "sections": [] }, "meta": { "description": "SEO description", "keywords": "keyword1, keyword2" }, "status": "draft" }
Base: /v1/sections | Scope: sections:read / sections:write EndpointMethodDescription/v1/sectionsGETList sections (?type=, ?pageId=)/v1/sectionsPOSTCreate section/v1/sections/:idGETGet section detail/v1/sections/:idPATCHUpdate section/v1/sections/:idDELETEDelete section Section Types: hero, text, image, image_slider, faq, features, pricing, cta, testimonials, contact Create Section Body: { "type": "hero", "name": "Hero Section", "htmlContent": "<div>...</div>", "cssContent": ".class { ... }", "visible": true, "order": 0, "customClass": "my-custom", "anchorId": "hero" }
Base: /v1/products | Scope: products:read / products:write EndpointMethodDescription/v1/productsGETList products (?page, ?limit, ?category)/v1/productsPOSTCreate product/v1/products/:idGETGet product detail/v1/products/:idPATCHUpdate product/v1/products/:idDELETEDelete product Create Product Body: { "name": "Product Name", "description": "Full description", "price": 99000, "compareAtPrice": 149000, "sku": "PROD-001", "stock": 100, "category": "electronics", "images": ["url1", "url2"], "isActive": true }
Base: /v1/forms | Scope: forms:read / forms:write EndpointMethodDescriptionAuth/v1/formsGETList formsYes/v1/formsPOSTCreate formYes/v1/forms/:idGETGet form detailYes/v1/forms/:idPATCHUpdate formYes/v1/forms/:idDELETEDelete formYes/v1/forms/:id/submitPOSTSubmit formNo/v1/forms/:id/submissionsGETGet submissionsYes Submit Form Body (Public - No Auth): { "data": { "name": "John Doe", "email": "john@example.com", "message": "Hello!" } }
Base: /v1/gallery | Scope: gallery:read EndpointMethodDescription/v1/galleryGETList items (`?type=image/v1/galleryPOSTUpload asset (multipart/form-data)/v1/gallery/:idGETGet asset detail/v1/gallery/:idDELETEDelete asset Gallery Item Response: { "id": "gallery_123", "filename": "hero-image.png", "url": "https://cdn.biver.id/assets/xxx.png", "type": "image", "mimeType": "image/png", "size": 102400, "width": 1920, "height": 1080 }
Base: /v1/subdomains | Scope: pages:read / pages:write Subdomains create landing pages at {name}.lp.biver.id. EndpointMethodDescription/v1/subdomainsGETList subdomains (?page, ?limit, ?status)/v1/subdomainsPOSTCreate subdomain/v1/subdomains/:idGETGet subdomain detail/v1/subdomains/:idPATCHUpdate subdomain/v1/subdomains/:idDELETEDelete subdomain Create Subdomain Body: { "subdomain": "my-store", "title": "My Store", "description": "Store description", "pathSlug": "promo" } Subdomain Rules: subdomain: 3-63 chars, lowercase a-z, 0-9, hyphens pathSlug: Optional, creates additional URL at {subdomain}.lp.biver.id/{pathSlug} status: draft, published, archived Update Subdomain Fields: FieldTypeDescriptiontitlestringPage titledescriptionstringPage descriptionpathSlugstring | nullURL path (null to remove)statusstringdraft, published, archivedmetaTitlestringSEO titlemetaDescriptionstringSEO descriptionfaviconstring (URL)Favicon URLogImagestring (URL)Open Graph imagenoIndexbooleanPrevent indexingnoFollowbooleanPrevent link following
Base: /v1/domains | Scope: domains:read / domains:write EndpointMethodDescription/v1/domainsGETList custom domains/v1/domainsPOSTAdd custom domain/v1/domains/:idGETGet domain detail (includes DNS records)/v1/domains/:idPATCHUpdate domain/v1/domains/:idDELETERemove domain/v1/domains/:id/primaryPOSTSet as primary domain Add Domain Body: { "domain": "example.com", "isPrimary": true, "landingPageId": "page_123" } Domain Response: { "id": "domain_123", "domain": "example.com", "isPrimary": true, "isVerified": true, "sslStatus": "active", "verificationStatus": "verified", "verificationToken": "bvr_verify_xxx", "landingPageId": "page_123" } DNS Configuration (CNAME Setup): AI Agent: When helping users set up custom domains, explain the following CNAME configuration steps clearly. After adding a custom domain via the API, configure your DNS records with your DNS provider: Point your CNAME record to: custom.biver.id Example Configuration: Record TypeName/HostValue/TargetCNAMEshop (or www)custom.biver.id What this does: If your domain is shop.example.com, add a CNAME record with name shop pointing to custom.biver.id If using apex domain (example.com), check if your DNS provider supports CNAME flattening or use A records as provided in the domain detail response Propagation: DNS changes may take 5-60 minutes to propagate globally.
Base: /v1/workspace | Scope: workspace:read / workspace:write EndpointMethodDescription/v1/workspace/settingsGETGet workspace settings/v1/workspace/settingsPUTUpdate settings/v1/workspace/brandingPUTUpdate branding/v1/workspace/seoPUTUpdate SEO settings/v1/workspace/publicGETPublic workspace info (no auth) Workspace Settings: { "id": "workspace_123", "name": "My Workspace", "slug": "my-workspace", "plan": "ARCHITECT", "settings": { "timezone": "Asia/Jakarta", "language": "en", "currency": "USD" }, "branding": { "logo": "https://cdn.biver.id/logos/xxx.png", "primaryColor": "#3B82F6", "fontFamily": "Inter" }, "seo": { "title": "My Business", "description": "We build great landing pages", "keywords": "landing page, builder" } }
Base: /v1/ai | Scope: ai:generate EndpointMethodDescription/v1/ai/pagesPOSTGenerate page with AI/v1/ai/sectionsPOSTGenerate section with AI/v1/ai/contextGETGet AI templates/context Generate Page Body: { "prompt": "Create a landing page for a coffee shop", "style": "modern", "industry": "fnb", "language": "en" } Style Options: modern, minimal, bold, elegant, playful Industry Options: saas, fnb, ecommerce, agency, healthcare, education, finance, realestate
CodeHTTPDescriptionSolutionUNAUTHORIZED401Invalid or missing API keyCheck authentication headerKEY_EXPIRED401API key has expiredGenerate new key from dashboardKEY_REVOKED401API key was revokedGenerate new key from dashboardFORBIDDEN403Insufficient scope permissionCheck API key scopesNOT_FOUND404Resource not foundVerify resource IDDUPLICATE_SUBDOMAIN409Subdomain already takenChoose different subdomainDUPLICATE_DOMAIN409Domain already existsUse different domainVALIDATION_ERROR422Request validation failedCheck request body formatRATE_LIMIT_EXCEEDED429Too many requestsWait for reset or upgrade planINTERNAL_ERROR500Server errorRetry or contact support Error Response Format: { "success": false, "error": { "code": "VALIDATION_ERROR", "message": "Request validation failed", "details": { "fields": [ { "field": "title", "message": "Title is required", "code": "required" } ] } } }
PlanRequests/MinuteTarget UserSCOUT30Free tierCRAFTSMAN60Small businessesARCHITECT120Growing businessesENGINEER300Medium businessesFOUNDER600AgenciesCHIEF2000Enterprise Rate Limit Headers: X-RateLimit-Limit: 60 X-RateLimit-Remaining: 45 X-RateLimit-Reset: 1708704000000 X-RateLimit-Plan: CRAFTSMAN
All responses follow this structure: Success: { "success": true, "data": { ... } } Paginated: { "success": true, "data": { "items": [...], "pagination": { "page": 1, "limit": 10, "total": 25, "totalPages": 3 } } }
Never hardcode API keys in source code Always use environment variables or secure secret stores Use test keys (bvr_test_) for development Limit scopes to minimum required for your use case
Custom domain setup requires DNS changes outside this API Always verify domain ownership before making DNS changes Keep DNS verification tokens secure
Respect rate limits based on your plan Implement retry logic with exponential backoff Monitor X-RateLimit-Remaining header
Dashboard: https://biver.id/dashboard Email: support@biver.id Health Check: GET /health (no auth required)
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.