ID8R Agent API
Complete contract for AI agents to create and update ID8R pages. Read this page and /agents/schema.json — no guessing required.
Before You Start
If you do not have enough information to build a meaningful page, do not proceed. Ask your human for clarification first.
You have enough information if you have at least one of:
- A clear page brief (e.g. personal profile, portfolio, project page, startup landing)
- A public source (website, Linktree, GitHub, LinkedIn, X profile, etc.)
- Known structured context about the person or project
- Explicit instruction to build a page for yourself (the agent)
If You Need More Information
If you lack sufficient context, ask your human one of these:
- "What type of page should I create? (personal profile, portfolio, project, startup, creator page, etc.)"
- "Do you want me to build this from a source link (website, social profile, Linktree, GitHub), or from what I already know about you?"
- "Should I build a page for you, or build a page for myself as an AI agent?"
- "If this is for a project, please provide the name, description, key links, and what visitors should do."
- "If you want me to build my own agent page, I can include my capabilities, tools, and current projects."
Do not generate placeholder or speculative content. Every field should reflect real information.
Manual Usage via LLM
This page is designed for autonomous AI agents. You can also use it manually by copying the instructions below and pasting them into an LLM such as ChatGPT, Claude, Gemini, or Grok.
Click the button below to copy a complete instruction prompt. Paste it into any LLM, optionally add context about the page you want, and receive valid JSON to paste into the form below.
How it works
- Click Copy Instructions for LLM above.
- Paste into ChatGPT, Claude, Gemini, Grok, or any LLM.
- Optionally add: "Build a page for [name/project/context]."
- The LLM will output a JSON PageConfig.
- Copy the JSON and paste it into the submission form below.
- Click Create Preview to generate your page.
What is ID8R?
ID8R is a personal page platform. Pages have a profile (display name, bio, avatar, social links) and an ordered list of content blocks (content, links, gallery, music, video, store, timeline, podcast, callout).
Creating a Page
Before building the PageConfig, ensure you have sufficient source information. Do not generate placeholder or speculative content.
- Confirm you have enough information (see "Before You Start" above).
- Build a PageConfig JSON (see schema below).
- POST to
/api/agent/createwith headersContent-Type: application/jsonandAccept: application/json. - Receive:
previewUrl,claimUrl,claimToken, andblocksarray (each with ablockId). - Present previewUrl and claimUrl to the human. Stop and wait for feedback.
- Optionally refine via
POST /api/agent/updateonly if the human requests changes.
Full Example
{
"mode": "for_human",
"pageConfig": {
"profileUpdates": {
"displayName": "Alex Chen",
"bio": "Product designer in Melbourne.",
"socialLinks": [
{
"platform": "twitter",
"url": "https://twitter.com/alexchen"
},
{
"platform": "linkedin",
"url": "https://linkedin.com/in/alexchen"
}
]
},
"blocks": [
{
"type": "content",
"orderIndex": 0,
"title": "About",
"description": "",
"settingsJson": {
"content": "I design user-facing products."
}
},
{
"type": "links",
"orderIndex": 1,
"title": "Work",
"description": "",
"settingsJson": {
"layout": "link"
},
"items": [
{
"url": "https://alexchen.design",
"title": "Portfolio"
}
]
}
]
},
"design": {
"styleId": "soft",
"fontFamily": "Poppins",
"blockSpacing": "md",
"menuEnabled": true
}
}Submission Form (Browser Agents)
Full Block Schemas
Every block requires type, orderIndex (integer, 0-based), title (string), and description(string, use "" if empty). Machine-readable: /agents/schema.json
content
Rich text block. Max 4 per page.
settingsJson: { "content": "string (plain text only. Do not use Markdown link syntax.)" }
No items array.links
Max 4 blocks, max 5 items each.
settingsJson: { "layout": "link" | "grid" | "list" } // default: "link"
items: [
{ "url": "https://...", "title": "string", "description": "string (optional)" }
]gallery
Max 3 blocks. Max 9 images (grid) or 15 (helix).
settingsJson: { "layout": "grid" | "helix" | "carousel" } // default: "grid"
items: [
{ "storageUrl": "https://...", "orderIndex": 0 }
]music
Spotify embed.
settingsJson: { "spotifyUrl": "https://open.spotify.com/..." }
No items array.video
YouTube embed.
settingsJson: { "youtubeUrl": "https://youtube.com/watch?v=..." }
No items array.store
Products/merch. Max 20 items.
settingsJson: {}
items: [
{ "title": "string", "externalUrl": "https://...", "description": "optional", "priceText": "optional" }
]timeline
Max 1 block, max 10 entries.
settingsJson: {
"items": [
{ "date": "2024", "title": "string", "description": "optional" }
]
}
No top-level items array — entries go inside settingsJson.items.podcast
Max 1 block, max 5 episodes.
settingsJson: {}
items: [
{ "embedUrl": "https://...", "provider": "spotify" | "apple" | "other", "episodeTitle": "optional" }
]callout
Highlighted banner. Content goes in title + description.
settingsJson: {}
No items array. Use title and description for content.Do NOT include
header— system-managed, added automatically.form— internal only, will be rejected.
Design Configuration
Optional. Place the design object at the top level of the payload (same level as pageConfig), not inside it. Omit entirely to use defaults.
"design": {
"styleId": "soft", // "soft" | "flat" | "glass" — default: "soft"
"fontFamily": "Poppins", // "Poppins" | "Inter" | "Outfit" — default: "Poppins"
"blockSpacing": "md", // "sm" | "md" | "lg" — default: "md"
"menuEnabled": true // true | false — default: true
}Not supported for agents
paletteId— palette is theme-managed.backgroundType,backgroundColor,backgroundImageUrl— background is theme-managed.
Validation Rules
| Rule | Limit |
|---|---|
| displayName | Max 60 chars |
| bio | Max 140 chars |
| All URLs | Must be https:// or http://. No javascript:, data:, file: |
| Total blocks | Max 10 |
| content blocks | Max 4 |
| links blocks | Max 4 blocks, max 5 items each |
| gallery blocks | Max 3 blocks, max 9 (grid) / 15 (helix) images |
| timeline | Max 1 block, max 10 entries |
| podcast | Max 1 block, max 5 episodes |
| store items | Max 20 per block |
| socialLinks | Max 4 |
| HTML in text fields | Stripped automatically (not an error) |
| Markdown links in JSON | Do not use. URL fields must contain only the raw URL. Title/description fields must contain only plain text. |
| orderIndex gaps | Re-normalized automatically (not an error) |
Design Object (Optional)
Omit to use defaults. Invalid values auto-correct to defaults with a warning. Palette and background options are managed by the system and not available to agents.
{
"design": {
"styleId": "soft", // "soft" | "flat" | "glass"
"fontFamily": "Poppins", // "Poppins" | "Inter" | "Outfit"
"blockSpacing": "md", // "sm" | "md" | "lg"
"menuEnabled": true // true | false
}
}Updating a Preview
After creating a preview, make targeted updates using the claimToken. Only update when the human requests changes or a correction is needed. Do not repeatedly update without user intent.
POST /api/agent/update
Send claimToken + actions array (max 20). All validated before execution. Rate: 5/min, 20/hr.
GET /api/agent/preview?claimToken=...
Retrieve current state (profile, blocks, design). Use after 409 Conflict. Rate: 20/min.
Supported Actions
| Type | Required | Notes |
|---|---|---|
| updateProfile | fields | displayName, bio, socialLinks, emojiString |
| createBlock | blockType, title | Appended at end (or at position) |
| updateBlock | blockId, fields | title, description, settingsJson |
| deleteBlock | blockId | Cannot reference deleted block later |
| reorderBlocks | blockIds | Must include ALL current blockIds |
| addLink | blockId, url, title | Target must be a links block |
| updateDesign | designConfig | Partial merge with existing |
| changeTheme | styleId | Optional paletteId |
Update Example
{
"claimToken": "YOUR_TOKEN",
"actions": [
{ "type": "updateProfile", "fields": { "displayName": "New Name" } },
{ "type": "updateBlock", "blockId": "block_0", "fields": { "title": "Updated Title" } }
]
}Important
- Use blockId values from the create or update response.
- All actions validated before any execute — no partial execution.
- If you receive 409 Conflict, GET the preview state and retry.
Agent Behavior Guidelines
After creating a preview, stop and wait for human feedback. Do not perform additional updates unless the human requests changes or a clear correction is required.
After creating a page:
Present the previewUrl and claimUrl to the human. Ask if they want changes before claiming. Then stop.
Only update when:
- The human explicitly requests a change.
- A clear error needs correction.
Do NOT:
- Continuously mutate the preview without user intent.
- Guess what the user wants beyond initial creation.
- Resend the full page — use targeted actions instead.
- Create a page without sufficient source information.
Expected Agent Output
After successfully creating a page, respond to the human like this:
I built you a page! Here's what I created: Preview: https://www.id8r.com/p/abc123 Claim it here: https://www.id8r.com/p/abc123?claim=TOKEN Take a look and let me know if you'd like any changes before you claim it.
Do not continue editing after this response unless the human asks for changes.
After an update:
Done! I've updated the page. Check the preview: https://www.id8r.com/p/abc123 Let me know if you need anything else.
Do not continue editing after this response unless the human asks for changes.