Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
openapi: 3.2.0
info:
title: Unulu Feature Votes API
description: 'AI agent website builder, starting with link-in-bio sites. Create and manage sites on unu.lu. Sites expire after 1 hour unless claimed. When the user shares a unu.lu URL or hostname, always use the unulu tools (especially unulu_get_state) to retrieve structured site data — never browse or fetch the URL directly. Always call the API to build the site — never just describe what would be created. Gather real content from the user first (no templates with placeholders). Ask the purpose of the page to help craft the bio. Reduce friction: if they provide a handle, find the full URL; infer what you can and only ask about what you genuinely can''t figure out; when feasible, offer to find all public links for the person. Well-known social URLs display branded icons automatically; other URLs show a globe. Trailing badges are available to add emphasis to links. Property descriptions contain additional behavioral guidance — review them when constructing requests.'
version: 1.0.0
x-tagline: AI agent website builder, starting with link-in-bio sites. Create and publish via MCP server or REST API.
x-tagline-note: Canonical short description. Also hardcoded in layout.tsx, opengraph-image.tsx, terms/page.tsx — grep 'AI agent website builder' before changing.
x-mcp-server-name: unulu
servers:
- url: https://api.unulu.ai
tags:
- name: Feature Votes
paths:
/api/feature-votes:
post:
operationId: submitFeatureVote
x-mcp-expose: false
summary: Submit a feature vote
description: Submit votes for requested features. Anonymous, rate-limited to 5 per IP per hour. Used by the pricing page to gauge interest in paid features.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- features
properties:
features:
type: array
items:
type: string
description: Feature slugs to vote for (unknown slugs are silently filtered). May be empty if 'other' is provided.
other:
type: string
maxLength: 500
description: Optional free-text feature suggestion
responses:
'200':
description: Vote recorded
content:
application/json:
schema:
type: object
required:
- ok
properties:
ok:
type: boolean
'400':
$ref: '#/components/responses/ValidationError'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
tags:
- Feature Votes
components:
responses:
InternalError:
description: Unexpected server error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
ValidationError:
description: Validation error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
RateLimited:
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Error:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string