{
	"version": "1",
	"phase": "13.5",
	"title": "AgentLink Freemium Endpoints",
	"description": "Machine-readable index of AgentLink partner freemium endpoints for agents.",
	"human_prerequisites": [
		{
			"id": "biomap",
			"label": "Get Biomapper",
			"url": "https://mainnet.biomapper.hmnd.app/biomap",
			"instruction_for_agent": "Tell the human to open Biomapper and complete biomapping."
		},
		{
			"id": "bridge_to_base",
			"label": "Bridge biomapping to Base",
			"instruction_for_agent": "Tell the human to bridge their biomapping to Base before using Base mainnet freemium endpoints."
		},
		{
			"id": "link_agent",
			"label": "Link agent through AgentLink",
			"instruction_for_agent": "Tell the human to link their agent through AgentLink before calling partner freemium endpoints."
		}
	],
	"auth_patterns": [
		{
			"id": "agentlink_signed_payload",
			"type": "agentlink_signed_payload",
			"header": "agentlink",
			"encoding": "base64",
			"signature_type": "eip191",
			"chain_id": "eip155:8453",
			"description": "Send a base64-encoded signed AgentLink payload in the agentlink header. The signed uri and domain must match the full request URL including its query string."
		}
	],
	"sdk": {
		"package": "@techdigger/humanode-agentlink",
		"network": "base",
		"build_header": "buildAgentLinkHeader(url, options)",
		"client": "createAgentLinkClient(options)",
		"client_methods": ["buildHeader(url)", "fetch(input, init)"],
		"default_statement": "Agentlink access request",
		"notes": "createAgentLinkClient(...).fetch attaches the agentlink header automatically and is sufficient for providers like XONA that accept a client-built header. Server-challenged providers like WURK require signing a server-issued challenge payload, so the client must first fetch the challenge (see that provider's signing block) and sign those exact values rather than using a generic prebuilt header."
	},
	"providers": [
		{
			"id": "xona",
			"name": "XONA",
			"base_url": "https://api.xona-agent.com",
			"network": {
				"name": "Base Mainnet",
				"chain_id": "eip155:8453"
			},
			"auth": {
				"type": "agentlink_signed_payload",
				"header": "agentlink",
				"encoding": "base64",
				"signature_type": "eip191"
			},
			"signing": {
				"mode": "standard_sdk",
				"description": "Use createAgentLinkClient({ network: 'base', privateKey }).fetch(url, init); the default AgentLink header is accepted."
			},
			"endpoints": [
				{
					"id": "xona.video.short_generation",
					"name": "Short Video Generation",
					"method": "POST",
					"path": "/base-main/video/short-generation",
					"url": "https://api.xona-agent.com/base-main/video/short-generation",
					"freemium": true,
					"description": "Generate a short video from a text prompt.",
					"headers": {
						"Content-Type": "application/json",
						"agentlink": "<base64-encoded signed AgentLink payload>"
					},
					"request_body": {
						"type": "object",
						"required": ["prompt", "aspect_ratio"],
						"properties": {
							"prompt": {
								"type": "string",
								"description": "Text prompt describing the video to generate."
							},
							"aspect_ratio": {
								"type": "string",
								"description": "Desired video aspect ratio.",
								"examples": ["16:9"]
							}
						}
					},
					"example_request": {
						"prompt": "<text prompt describing the video>",
						"aspect_ratio": "16:9"
					},
					"agentlink_payload_template": {
						"domain": "api.xona-agent.com",
						"address": "<agent wallet address>",
						"statement": "Agentlink access request",
						"uri": "https://api.xona-agent.com/base-main/video/short-generation",
						"version": "1",
						"chainId": "eip155:8453",
						"type": "eip191",
						"nonce": "<random nonce>",
						"issuedAt": "<ISO timestamp>",
						"expirationTime": "<ISO timestamp if expiresInSeconds is set>",
						"signature": "<eip191 signature>"
					}
				},
				{
					"id": "xona.image.nano_banana",
					"name": "Nano Banana Image Generation",
					"method": "POST",
					"path": "/base-main/image/nano-banana",
					"url": "https://api.xona-agent.com/base-main/image/nano-banana",
					"freemium": true,
					"description": "Generate an image from a text prompt.",
					"headers": {
						"Content-Type": "application/json",
						"agentlink": "<base64-encoded signed AgentLink payload>"
					},
					"request_body": {
						"type": "object",
						"required": ["prompt", "aspect_ratio", "referenceImage"],
						"properties": {
							"prompt": {
								"type": "string",
								"description": "Text prompt describing the image to generate."
							},
							"aspect_ratio": {
								"type": "string",
								"description": "Desired image aspect ratio.",
								"examples": ["1:1"]
							},
							"referenceImage": {
								"type": "array",
								"description": "Reference image list. Send an empty array when no reference images are provided.",
								"items": {
									"type": "string"
								}
							}
						}
					},
					"example_request": {
						"prompt": "<text prompt describing the image>",
						"aspect_ratio": "1:1",
						"referenceImage": []
					},
					"agentlink_payload_template": {
						"domain": "api.xona-agent.com",
						"address": "<agent wallet address>",
						"statement": "Agentlink access request",
						"uri": "https://api.xona-agent.com/base-main/image/nano-banana",
						"version": "1",
						"chainId": "eip155:8453",
						"type": "eip191",
						"nonce": "<random nonce>",
						"issuedAt": "<ISO timestamp>",
						"expirationTime": "<ISO timestamp if expiresInSeconds is set>",
						"signature": "<eip191 signature>"
					}
				}
			]
		},
		{
			"id": "wurk",
			"name": "WURK",
			"base_url": "https://wurkapi.fun",
			"network": {
				"name": "Base Mainnet",
				"chain_id": "eip155:8453"
			},
			"freemium_policy": {
				"scope": "provider",
				"limit": 1,
				"unit": "successful freemium claim",
				"description": "WURK allows one freemium use total across both AgentLink endpoints."
			},
			"auth": {
				"type": "agentlink_signed_payload",
				"header": "agentlink",
				"encoding": "base64",
				"signature_type": "eip191"
			},
			"signing": {
				"mode": "server_challenge",
				"challenge_transport": "unauthenticated_response",
				"challenge_location": "extensions.agentlink.info",
				"challenge_fields": [
					"nonce",
					"issuedAt",
					"expirationTime",
					"uri",
					"statement",
					"domain",
					"version",
					"resources"
				],
				"description": "WURK requires signing a server-issued challenge payload, so a generic prebuilt agentlink header is not sufficient. 1) Send the request without the agentlink header. 2) WURK replies 402 (or error) with an extensions.agentlink.info object carrying the challenge fields. 3) Construct the payload from those exact server-provided values plus your agent address, sign it (eip191), base64-encode it, and resend with the agentlink header. No separate /challenge endpoint was observed; the challenge is embedded in the initial response."
			},
			"endpoints": [
				{
					"id": "wurk.xraid.xverified.small",
					"name": "Small X Verified Raid",
					"method": "GET",
					"path": "/base/agentlink/xraid/xverified/small",
					"url": "https://wurkapi.fun/base/agentlink/xraid/xverified/small",
					"freemium": true,
					"description": "Create or claim a small xRaid job for an X/Twitter post.",
					"query_parameters": [
						{
							"name": "url",
							"required": true,
							"type": "uri",
							"description": "X/Twitter post URL to target."
						}
					],
					"headers": {
						"agentlink": "<base64-encoded signed AgentLink payload>"
					},
					"agentlink_payload_template": {
						"_note": "domain, version, statement, nonce, issuedAt, expirationTime, uri, and resources are taken from the server challenge in extensions.agentlink.info; do not invent them. Only address and signature are produced by the agent.",
						"domain": "<from challenge>",
						"address": "<agent wallet address>",
						"uri": "<from challenge: the request URL>",
						"version": "<from challenge>",
						"chainId": "eip155:8453",
						"type": "eip191",
						"resources": ["<from challenge>"],
						"nonce": "<from challenge>",
						"issuedAt": "<from challenge>",
						"expirationTime": "<from challenge>",
						"statement": "<from challenge, e.g. 'Sign in to claim a free WURK Agentlink xRaid job'>",
						"signature": "<eip191 signature of the reconstructed message>"
					}
				},
				{
					"id": "wurk.agent_to_human",
					"name": "Agent-to-Human Job",
					"method": "GET",
					"path": "/base/agentlink/agenttohuman",
					"url": "https://wurkapi.fun/base/agentlink/agenttohuman",
					"freemium": true,
					"description": "Create or claim a WURK agent-to-human job from a natural-language task description.",
					"query_parameters": [
						{
							"name": "description",
							"required": true,
							"type": "string",
							"description": "Human-readable description of the job the agent wants WURK to perform."
						}
					],
					"headers": {
						"agentlink": "<base64-encoded signed AgentLink payload>"
					},
					"agentlink_payload_template": {
						"_note": "domain, version, statement, nonce, issuedAt, expirationTime, uri, and resources are taken from the server challenge in extensions.agentlink.info; do not invent them. Only address and signature are produced by the agent.",
						"domain": "<from challenge>",
						"address": "<agent wallet address>",
						"uri": "<from challenge: the request URL>",
						"version": "<from challenge>",
						"chainId": "eip155:8453",
						"type": "eip191",
						"resources": ["<from challenge>"],
						"nonce": "<from challenge>",
						"issuedAt": "<from challenge>",
						"expirationTime": "<from challenge>",
						"statement": "<from challenge, e.g. 'Sign in to claim a free WURK Agentlink agent-to-human job'>",
						"signature": "<eip191 signature of the reconstructed message>"
					}
				}
			]
		}
	]
}
