API & MCP Documentation
Create, read, and update link-in-bio sites programmatically. Connect via MCP server or REST API — no authentication required.
MCP Server (recommended for agents)
Any MCP-compatible AI agent can connect and call tools directly. No authentication required. Rate limited.
- Transport
- Streamable HTTP (event-stream compatible)
- URL
https://mcp.unulu.ai- Discovery
- /.well-known/mcp/server.json
Add to your MCP client config:
{
"mcpServers": {
"unulu": {
"type": "streamable-http",
"url": "https://mcp.unulu.ai"
}
}
}Authentication & site ownership
Creating a site, reading site state, and checking handle availability work anonymously. Updating a site requires proof of ownership: use the claim_token returned when an unclaimed site is created, or an edit_token for a claimed site. In a single assistant conversation this is usually automatic because the create response includes the claim token.
REST API
Standard REST endpoints. No API key or account required. Rate limited.
- Base URL
https://api.unulu.ai- Spec
- /openapi.json
Endpoints
Core endpoints available via both MCP tools and REST:
| Method | Path | Description | MCP tool |
|---|---|---|---|
POST | /api/sites | Create a link-in-bio site | unulu_create_site |
GET | /api/sites/{site_id} | Get site state | unulu_get_state |
PATCH | /api/sites/{site_id} | Update a site | unulu_update_site |
GET | /api/claims/check-handle | Check handle availability | unulu_check_handle |
Additional REST-only endpoints:
| Method | Path | Description |
|---|---|---|
DELETE | /api/sites/{site_id} | Delete a site |
POST | /api/sites/{site_id}/report-abuse | Report a site for abuse |
POST | /api/feature-votes | Submit a feature vote |
POST | /api/sites/{site_id}/request-edit | Request edit access |
GET | /api/sites/{site_id}/edit-verify | Verify edit access |
MCP surface
Claude and other MCP clients primarily use the four public tools. For clients that support additional MCP surfaces, unulu also exposes one optional prompt and one optional widget resource:
- Prompt:
create-site - Resource:
ui://unulu/widget.html
What you can build
Link-in-bio sites with:
- Display name and bio
- Up to 20 links with optional leading icons and trailing badges
- Well-known social URLs display branded icons automatically
- 17 built-in themes (minimal, gradient, brutalist, glass, and more)
- Instant publishing on unu.lu
- Sites expire after 1 hour unless claimed with an email
Machine-readable docs
- llms.txt — agent-friendly documentation
- openapi.json — OpenAPI 3.1 spec
- agent.json — AI agent manifest
- server.json — MCP server discovery
Claude tool-use examples
Three worked examples showing how Claude calls unulu tools via MCP.
1. Create a site
User: “Build a link-in-bio site for Alex Chen with GitHub and LinkedIn links.”
{
"tool": "unulu_create_site",
"input": {
"name": "Alex Chen",
"bio": "Full-stack developer. Open source contributor.",
"links": [
{
"title": "GitHub",
"url": "https://github.com/alexchen"
},
{
"title": "LinkedIn",
"url": "https://linkedin.com/in/alexchen"
}
]
}
}Response:
{
"site_id": "st_abc123",
"url": "https://k7m2x.unu.lu",
"expires_at": "2026-03-09T15:00:00Z",
"assistant_message": "Your site is live at [k7m2x.unu.lu](https://k7m2x.unu.lu). It expires in 1 hour — claim it to keep it permanently.",
"claim_token": "eyJ...",
"claim_code_short": "A7K2-M9X4"
}2. Update an existing site
User: “Add my portfolio link and switch to the gradient theme.”
Claude first calls unulu_get_state to read the current links, then sends the full updated list:
{
"tool": "unulu_update_site",
"input": {
"site_id": "st_abc123",
"skin_id": "midnight-gradient",
"links": [
{
"title": "GitHub",
"url": "https://github.com/alexchen"
},
{
"title": "LinkedIn",
"url": "https://linkedin.com/in/alexchen"
},
{
"title": "Portfolio",
"url": "https://alexchen.dev"
}
],
"claim_token": "eyJ..."
}
}3. Check handle availability
User: “Is the handle alexchen available?”
{
"tool": "unulu_check_handle",
"input": {
"handle": "alexchen"
}
}Response:
{
"available": true,
"handle": "alexchen"
}Troubleshooting
- If Claude cannot connect, verify the server URL is exactly
https://mcp.unulu.aiand the transport is Streamable HTTP. - If
unulu_update_sitereturns a forbidden or authorization error, retry in the same conversation that created the site or provide the site'sclaim_tokenoredit_token. - If you hit a rate limit, wait for the hourly window to reset and try again.
- If a site looks stale after an update, reload the
unu.lupage. Published HTML is cached briefly; a normal refresh should show the latest state within about a minute.
Support & policies
- Help — setup help, claiming, editing, deletion, and abuse reporting
- Trust & Security — infrastructure, retention, and incident response
- Privacy Policy — data handling and retention
- Terms of Service — service terms and copyright takedown
Live example
See a live site at unulu.unu.lu.
← Back to unulu\u2122