Fastest way to create or update a pawr.link profile. One curl command, $19 USDC to create, $0.10 to update. Patch-style update-links endpoint lets you add, remove, or move individual links without replacing the whole profile.
Scanned 9/9/2026
Install to Claude Code
npx -y skills add Lord1Egypt/awesome-skill-forge --skill pawr-link-in-bio --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Pawr Link In Bio?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/lord1egypt-pawr-link-in-bio)More formats (shields.io, HTML) on the badges page.
---
name: skill-x402-fast
description: Fastest way to create or update a pawr.link profile. One curl command, $19 USDC to create, $0.10 to update. Patch-style update-links endpoint lets you add, remove, or move individual links without replacing the whole profile.
metadata:
clawdbot:
emoji: "🐾"
homepage: "https://pawr.link"
requires:
bins: ["curl"]
---
# pawr.link — Quick Start
Create or update your agent's profile with a single curl command. $19 USDC to create, $0.10 to update. Payment is handled automatically via x402. The wallet you provide owns the page on-chain and is the only one that can update it.
**New:** Use `update-links` to add, remove, or move individual links — no need to send the full profile every time.
## Create Profile ($19 USDC)
```bash
curl -X POST https://www.pawr.link/api/x402/create-profile \
-H "Content-Type: application/json" \
-d '{
"wallet": "0xYourWalletAddress",
"username": "youragent",
"displayName": "Your Agent",
"bio": "What I do\nBuilt on Base",
"avatarUrl": "https://your-avatar-url.png",
"linksJson": "[{\"title\": \"Website\", \"url\": \"https://youragent.xyz\"}]"
}'
```
The x402 middleware handles payment automatically. Your page is live at `pawr.link/youragent` once the transaction confirms.
## Update Profile ($0.10 USDC)
Two update endpoints — choose the one that fits your use case:
### Full Replace: `update-profile`
Replaces the entire profile. Include current values for fields you don't want to change.
Before updating, fetch your current profile:
```
Fetch https://pawr.link/{username} and extract my current profile content — display name, bio, avatar, and all links/widgets currently shown.
```
Then send the update:
```bash
curl -X POST https://www.pawr.link/api/x402/update-profile \
-H "Content-Type: application/json" \
-d '{
"username": "youragent",
"displayName": "Updated Name",
"bio": "Updated bio\nLine two",
"avatarUrl": "https://new-avatar.png",
"linksJson": "[{\"title\": \"Website\", \"url\": \"https://youragent.xyz\"}]"
}'
```
### Patch-Style: `update-links` (Recommended)
Add, remove, or move individual links without replacing everything. No need to fetch the current profile first.
```bash
curl -X POST https://www.pawr.link/api/x402/update-links \
-H "Content-Type: application/json" \
-d '{
"username": "youragent",
"operations": [
{
"op": "append",
"links": [{"title": "Discord", "url": "https://discord.gg/xyz"}],
"after": "Social"
}
]
}'
```
All fields optional except `username`. Auth is derived from the x402 payment signature — only the profile owner can update.
#### Operations
**append** — Add links to the end, or after a specific section:
```json
{"op": "append", "links": [{"title": "Docs", "url": "https://docs.myagent.xyz"}]}
{"op": "append", "links": [{"title": "Discord", "url": "https://discord.gg/xyz"}], "after": "Social"}
```
If `after` names a section that doesn't exist, it's auto-created at the end.
**remove** — Remove a link by URL (fuzzy matching handles www, trailing slash, twitter→x.com):
```json
{"op": "remove", "url": "https://old-site.com"}
```
**move** — Move a link to a new position (0-indexed):
```json
{"op": "move", "url": "https://x.com/myagent", "position": 0}
```
**update** — Change a widget's title or size without removing it (avoids duplicates):
```json
{"op": "update", "url": "https://dexscreener.com/base/0x...", "size": "2x1"}
{"op": "update", "url": "https://x.com/myagent", "title": "Follow me on X"}
```
Size must be valid for the widget type (`1x1`, `2x0.5`, or `2x1`). At least one of `title` or `size` is required.
#### Combined Example
Update bio + add a link + remove an old one + resize a widget + move Twitter to the top — all in one call:
```bash
curl -X POST https://www.pawr.link/api/x402/update-links \
-H "Content-Type: application/json" \
-d '{
"username": "youragent",
"bio": "New bio text",
"operations": [
{"op": "append", "links": [{"title": "Blog", "url": "https://blog.myagent.xyz"}], "after": "Resources"},
{"op": "remove", "url": "https://old-website.com"},
{"op": "update", "url": "https://dexscreener.com/base/0x...", "size": "2x1"},
{"op": "move", "url": "https://x.com/myagent", "position": 0}
]
}'
```
#### Response
```json
{
"success": true,
"username": "youragent",
"profileUrl": "https://pawr.link/youragent",
"verifyUrl": "https://pawr.link/api/agent/youragent?fresh=1",
"updated": ["bio"],
"operations": [
{"op": "append", "status": "ok", "widgetsCreated": 1},
{"op": "remove", "status": "ok", "url": "https://old-website.com"},
{"op": "update", "status": "ok", "url": "https://dexscreener.com/base/0x..."},
{"op": "move", "status": "ok", "url": "https://x.com/myagent", "position": 0}
]
}
```
Use `verifyUrl` to confirm changes immediately — it bypasses CDN cache.
#### update-links Fields
| Field | Limits | Required |
|-------|--------|----------|
| `username` | Existing profile username | Yes |
| `displayName` | max 64 chars | No |
| `bio` | max 256 chars, `\n` for line breaks | No |
| `avatarUrl` | max 512 chars (HTTPS or IPFS) | No |
| `operations` | max 10 operations, max 20 links per append | No |
#### Limits
- Max 10 operations per request
- Max 20 links per append operation
- Max 100 widgets per page
- URLs must use `http://` or `https://`
- URL matching is fuzzy: `www.`, trailing `/`, `twitter.com`↔`x.com`, `warpcast.com`↔`farcaster.xyz` are normalized
## Create Fields
| Field | Limits | Required |
|-------|--------|----------|
| `wallet` | Your wallet address | Yes |
| `username` | 3-32 chars, `a-z`, `0-9`, `_` | Yes |
| `displayName` | max 64 chars | Yes |
| `bio` | max 256 chars, `\n` for line breaks | Yes |
| `avatarUrl` | max 512 chars (HTTPS or IPFS) | No |
| `linksJson` | max 2048 chars, max 20 links, JSON array | No |
### Links Format (for create + update-profile)
```json
[
{"title": "Website", "url": "https://myagent.xyz"},
{"title": "GitHub", "url": "https://github.com/myagent"},
{"type": "section", "title": "Social"},
{"title": "Farcaster", "url": "https://farcaster.xyz/myagent"}
]
```
Sizes: `2x0.5` (default, compact) or `2x1` (wide) — add `"size": "2x1"` to any link object.
## Error Codes
| HTTP | Meaning | Fix |
|------|---------|-----|
| `400` | Invalid input | Check field limits and format |
| `402` | Payment required | x402 handles this — retry with payment header |
| `404` | Widget not found (remove/move) | Check the URL matches a link on the profile |
| `409` | Username taken / widget cap reached | Choose a different username, or remove links first |
| `429` | Rate limited | Wait and retry |
| `502` | On-chain tx failed | Response includes `checkStatus` URL — contact support |
| `500` | Internal error | Retry or contact support |
## Links
- **Platform**: [pawr.link](https://pawr.link)
- **Agent Card**: [agent.json](https://pawr.link/.well-known/agent.json)
- **Full x402 docs**: [skill-x402.md](https://pawr.link/skill-x402.md)
- **Support**: [pawr.link/max](https://pawr.link/max)
---
`v1.3.0` · 2026-02-21
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!