https://gui.new/apiCreate a new canvas. Returns a shareable URL.
| Field | Type | Required | Description |
|---|---|---|---|
| html | string | Yes | HTML content (max 2MB) |
| title | string | No | Display name in toolbar & OG image |
| frames | array | No | Multiple HTML variants as tabs. Each: {html, label?} |
curl -X POST https://gui.new/api/canvas \
-H 'Content-Type: application/json' \
-d '{
"title": "My Dashboard",
"html": "<h1 style=\"color:white\">Hello World</h1>"
}'{
"id": "abc123xyz",
"url": "https://gui.new/abc123xyz",
"edit_token": "tok_...",
"expires_at": "2026-02-28T16:00:00Z"
}Update an existing canvas. Requires edit_token. All viewers see changes live via SSE.
| Header | Value |
|---|---|
| Authorization | Bearer <edit_token> |
curl -X PUT https://gui.new/api/canvas/abc123xyz \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer tok_...' \
-d '{"html": "<h1>Updated!</h1>"}'Server-Sent Events stream. Receive real-time updates when canvas HTML changes.
const source = new EventSource(
'https://gui.new/api/canvas/abc123xyz/events'
);
source.addEventListener('update', (e) => {
const { html } = JSON.parse(e.data);
// Re-render with new HTML
});Every canvas automatically gets:
| Feature | Free | Pro |
|---|---|---|
| Auth | None — just POST | API key via Authorization: Bearer |
| Rate limit | 5 creates / hour | 100 creates / hour |
| Max size | 2 MB | 10 MB |
| Expiry | 24 hours | 14 days |
| Edits | 3 per canvas | Unlimited |
| Visibility | Public only | Public or private (password-protected) |
| Watermark | gui.new badge | No watermark |
Free tier requires no account or API key. Rate limited by IP address.
JavaScript / TypeScript
npmjs.com →npm install gui-newimport GuiNew from 'gui-new'
const gui = new GuiNew()
const canvas = await gui.create({
title: 'My Dashboard',
html: '<h1>Hello</h1>'
})
console.log(canvas.url)Python
pypi.org →pip install gui-newimport gui_new
canvas = gui_new.create(
"<h1>Hello</h1>",
title="My Dashboard"
)
print(canvas.url)