Discover services on the Fast Marketplace, choose the right endpoint, follow Community/direct or Verified/escrow payment flows, use fixed-price x402, variable top-up, or prepaid-credit routes with a funded local wallet, handle async job retrieval, onboard providers, manage draft services, rotate provider runtime keys, review marketplace demand intake, and submit or review marketplace supply. Use this when a user wants to browse or call APIs exposed through marketplace.fast.xyz or fastapi.8o.vc, or manage marketplace supply from the provider/admin surfaces. Route direct FAST SDK, AllSet bridge, hosted ramp, or generic x402 package work outside the marketplace to the main FAST skill instead.
Resources
6Install
npx skillscat add seichris/ai-agent-marketplace Install via the SkillsCat registry.
Fast Marketplace
Use this skill when a user wants to work with APIs listed on the Fast Marketplace.
Relationship to the main FAST skill
- this skill is the marketplace-specific layer on top of the FAST SDK and x402 packages
- keep this skill scoped to marketplace-hosted routes, provider workflows, and admin workflows
- if the task is direct wallet work, bridge/ramp work, or generic x402 package integration outside marketplace routes, use the main FAST skill at
https://skill.fast.xyz/skill.md - marketplace v1 is Fast-only; do not broaden this skill into generic EVM or non-marketplace API monetization guidance
- the canonical public hosts are
https://marketplace.fast.xyzfor the web app andhttps://fastapi.8o.vcfor the API; non-production deployments may rewrite these URLs when serving/skill.md
Use this skill when
- the user wants to find a service or endpoint on
https://marketplace.fast.xyz - the user needs the exact request body, proxy URL, or response shape for a marketplace endpoint
- the user wants to sign into
https://marketplace.fast.xyzwith a Fast browser wallet - the user wants to pay and execute a marketplace route directly from the website with the Fast browser extension
- the user needs to call a fixed-price x402 route, a variable top-up route, or a prepaid-credit route with a local Fast wallet
- the user needs to retrieve an async result from a previously accepted job
- the user wants to suggest a missing endpoint or a new source/webservice for providers to build
- the user wants to create or update a provider profile and manage service drafts
- the user wants to create or rotate a provider runtime key for an async, prepaid-credit, or community-direct service
- the user wants to claim provider-visible request intake and route it into a draft service
- the user wants to verify provider website ownership and submit a service for review
- the user wants to review, publish, or suspend provider supply from the admin surface
Do not use this skill when
- the user wants direct
@fastxyz/sdkwallet, balance, send, signature, or token-info work outside the marketplace - the user wants Fast <-> EVM bridge flows, hosted ramp flows, or
@fastxyz/allset-sdkguidance - the user wants generic
@fastxyz/x402-client,@fastxyz/x402-server, or@fastxyz/x402-facilitatorintegration outside marketplace routes - the user wants a direct provider integration outside the marketplace
- the task is generic web research rather than using marketplace routes
Inputs to gather
Before acting, identify:
- whether the user is acting as a buyer, provider, or marketplace operator
- the service or domain the user wants
- the endpoint or outcome they need
- whether the route is free,
fixed_x402,topup_x402_variable, orprepaid_credit - whether the service settlement tier is
community_directorverified_escrow - whether the route is sync or async
- whether they want browser login only, browser execution, or a CLI/agent-wallet flow
- whether they already have a funded Fast wallet
- which Fast network the deployment is using: mainnet or testnet
- which settlement token the published marketplace route expects for that deployment; marketplace uses
USDCon mainnet andtestUSDCon testnet - which x402
accepts[*].assetid the route returned; treat that asset id as authoritative over any human nickname - whether they need website session auth, API-scoped wallet session auth, job retrieval auth, or admin token auth
- for provider flows: service metadata, payout wallet, website URL, endpoint schemas/examples, and upstream execution details
Workflow
- Identify the role and flow first: buyer, provider, or admin/operator.
- If the flow is website-based, connect the Fast browser wallet from the site header and sign the website challenge.
- Use the role-specific flow below.
CLI setup
Before using CLI commands from this skill:
- Run
npm installat the repo root. - Use
npm run cli -- ...from this workspace as the default invocation path. - Treat
fast-marketplace ...as the command name exposed by the CLI itself; if the package is installed globally or linked into$PATH, the same subcommands can be run directly asfast-marketplace ....
Examples:
npm run cli -- wallet initnpm run cli -- auth api-session <provider> <operation>npm run cli -- provider sync --spec ./provider-spec.json
Concrete buyer call patterns
Use the marketplace contract directly instead of inferring missing details.
x402 package and wallet shape
- the current workspace dependency is
@fastxyz/x402-client@^0.1.2 - import
x402Payfrom@fastxyz/x402-client - the wallet object passed to
x402Payis a Fast wallet config with this shape:
{
type: "fast",
privateKey: "<hex private key>",
publicKey: "<hex public key>",
address: "fast1...",
rpcUrl: "https://api.fast.xyz/proxy"
}Fixed-price x402 example
import { x402Pay } from "@fastxyz/x402-client";
const result = await x402Pay({
url: "https://fastapi.8o.vc/api/orders/place-order",
method: "POST",
body: JSON.stringify({ sku: "abc", quantity: 1 }),
headers: {
"content-type": "application/json",
"PAYMENT-IDENTIFIER": "payment_123"
},
wallet: {
type: "fast",
privateKey: process.env.FAST_PRIVATE_KEY!,
publicKey: process.env.FAST_PUBLIC_KEY!,
address: process.env.FAST_ADDRESS!,
rpcUrl: "https://api.fast.xyz/proxy"
}
});Notes:
- send the first request without payment proof;
x402Payhandles the402quote and retry - keep
PAYMENT-IDENTIFIERstable when retrying the same normalized request - for fixed-price or top-up routes, read
accepts[*].network,accepts[*].maxAmountRequired, andaccepts[*].assetfrom the402response before approving payment
API-scoped wallet session example
Use route-scoped bearer auth for prepaid_credit and async free routes.
const challenge = await fetch("https://fastapi.8o.vc/auth/challenge", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
wallet: "fast1...",
resourceType: "api",
resourceId: "orders.place-order.v1"
})
}).then((response) => response.json());
const signed = await connector.sign({ message: challenge.message });
const session = await fetch("https://fastapi.8o.vc/auth/session", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
wallet: "fast1...",
resourceType: "api",
resourceId: "orders.place-order.v1",
nonce: challenge.nonce,
expiresAt: challenge.expiresAt,
signature: signed.signature
})
}).then((response) => response.json());
const apiResponse = await fetch("https://fastapi.8o.vc/api/orders/place-order", {
method: "POST",
headers: {
"content-type": "application/json",
authorization: `Bearer ${session.accessToken}`
},
body: JSON.stringify({ sku: "abc", quantity: 1 })
});The challenge response shape is:
{
"wallet": "fast1...",
"resourceType": "api",
"resourceId": "orders.place-order.v1",
"nonce": "uuid",
"expiresAt": "2026-03-25T12:00:00.000Z",
"message": "Fast Marketplace Access\nWallet: fast1...\nResource: api/orders.place-order.v1\nNonce: uuid\nExpires: 2026-03-25T12:00:00.000Z"
}Async job polling example
If a trigger returns 202, save the jobToken, mint a job-scoped bearer token, then poll the job endpoint.
const challenge = await fetch("https://fastapi.8o.vc/auth/challenge", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
wallet: "fast1...",
resourceType: "job",
resourceId: "job_123"
})
}).then((response) => response.json());
const signed = await connector.sign({ message: challenge.message });
const session = await fetch("https://fastapi.8o.vc/auth/session", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
wallet: "fast1...",
resourceType: "job",
resourceId: "job_123",
nonce: challenge.nonce,
expiresAt: challenge.expiresAt,
signature: signed.signature
})
}).then((response) => response.json());
const job = await fetch("https://fastapi.8o.vc/api/jobs/job_123", {
headers: {
authorization: `Bearer ${session.accessToken}`
}
}).then((response) => response.json());The job response shape is:
{
"jobToken": "job_123",
"status": "pending",
"updatedAt": "2026-03-25T12:00:05.000Z"
}Completed or failed jobs may also include:
{
"jobToken": "job_123",
"status": "failed",
"error": "Provider timeout",
"refund": {
"status": "sent",
"txHash": "0x..."
},
"updatedAt": "2026-03-25T12:00:35.000Z"
}Polling guidance:
- use the same wallet that paid for or authorized the original trigger
- poll
GET /api/jobs/{jobToken}about every5000ms by default; that matches the marketplaceDEFAULT_JOB_POLL_INTERVAL_MS - stop polling when
statusbecomescompletedorfailed
Buyer workflow
- Open the marketplace UI at
https://marketplace.fast.xyzand locate the relevant service. - Open the service page and identify the route billing type from the published endpoint docs, labels, pricing, and examples.
- If the user wants browser execution, use the endpoint's browser execution panel. Fixed-price and top-up routes pay through x402; prepaid-credit routes and async free routes use the wallet session after the user is signed in.
- If the user is delegating the task to another agent, copy the service page's "Use this service" block or the canonical skill URL.
- For
fixed_x402routes outside the browser panel, send the first request without payment proof, read the402 Payment Requiredresponse, pay from the funded wallet, and retry the same request with the payment proof headers. - For
topup_x402_variableroutes, include the requested amount in the request body, expect a402quote for that exact amount, pay it, and persist the credited response details. - For
prepaid_creditroutes, create an API-scoped wallet session through/auth/challengeand/auth/sessionor usenpm run cli -- auth api-session <provider> <operation>; then invoke the route with the bearer token instead of x402 proof. - If the route returns
202 Accepted, store thejobTokenand switch to wallet-bound retrieval. - If the marketplace does not have the needed capability, submit a suggestion for an endpoint or source.
Settlement implications:
community_direct: the x402 payment goes directly to the provider wallet; refunds and reimbursements are provider-ownedverified_escrow: the x402 payment goes to marketplace treasury; the marketplace can refund failures, reconcile stale payments, and settle provider payouts later
Billing flows
The marketplace is Fast-native and wallet-first.
Fixed x402
- Use a persistent local Fast wallet funded with the settlement token shown by the published marketplace route. Mainnet routes use
USDC; testnet routes usetestUSDC. - Send the first request without payment proof.
- Read the
402response and payment requirements. - Authorize payment from the wallet.
- Retry the same request with the payment proof.
Interpret the 402 body as follows:
accepts[*].networkis the Fast payment network, such asfast-mainnetorfast-testnetaccepts[*].maxAmountRequiredis the decimal amount to authorizeaccepts[*].assetis the asset id the signer must pay; do not substitute a nickname likefastUSDC- current marketplace asset ids are:
USDCmainnet:0xc655a12330da6af361d281b197996d2bc135aaed3b66278e729c2222291e9130testUSDCtestnet:0xd73a0679a2be46981e2a8aedecd951c8b6690e7d5f8502b34ed3ff4cc2163b46
Variable top-up
- Send the top-up route with the requested amount in the JSON body.
- Read the
402response and verify it quotes the same intended amount. - Authorize payment from the wallet.
- Retry the same request with the payment proof.
- Persist the top-up response because it confirms the credited service balance.
Prepaid credit
- Fund service credit first through the service's
topup_x402_variableroute. - Create an API-scoped wallet session through
/auth/challengeand/auth/session, or usenpm run cli -- auth api-session <provider> <operation>. - Invoke the
prepaid_creditroute with the bearer token. - If using the CLI,
fast-marketplace invokewill automatically switch to wallet-session auth when the route requires it.
Async free
- Create an API-scoped wallet session through
/auth/challengeand/auth/session. - Invoke the async free route with the bearer token.
- If the route returns
202, persist thejobToken. - Create the job-scoped wallet auth session and poll
GET /api/jobs/{jobToken}until the job completes or fails.
Important constraints:
- paid routes do not use long-lived API keys
- website login uses a signed wallet challenge for the site session
- the website can also pay and execute routes directly through the Fast extension
- wallet identity is the payer identity
- this skill is for trusted marketplace hosts, not arbitrary third-party
402origins - use the same request body when retrying a payable route
- for safe retries, keep the same payment identifier for the same normalized request only
- prepaid-credit routes require funded service credit and wallet-session bearer auth instead of per-call x402
- Community/direct services still use verified provider onboarding and domain verification; the difference is money flow, not trust requirements
- marketplace v1 is Fast-only; do not invent AllSet bridge, hosted ramp, or generic EVM payment steps from this skill
- if the user needs direct SDK or package-level guidance instead of marketplace route execution, hand off to the main FAST skill
Website auth flow
- For website sessions, use the signed wallet challenge flow served by
/auth/wallet/challengeand/auth/wallet/session. - The website session unlocks provider surfaces and browser-connected marketplace actions.
- Website session auth is separate from API-scoped route sessions and job retrieval auth.
API session flow
- Create an API-scoped wallet challenge through
/auth/challengewithresourceType: "api"and the route id asresourceId.
The route id is the published route identifier, for exampleorders.place-order.v1. - Sign the challenge with the same Fast wallet that owns the prepaid credit.
- Exchange it at
/auth/sessionfor a bearer token. - Use that bearer token on
prepaid_creditroutes.
Async retrieval flow
- If a trigger returns
202, persist thejobToken. - Create the job-scoped wallet auth session through
/auth/challengeand/auth/session. - Poll
GET /api/jobs/{jobToken}withAuthorization: Bearer <accessToken>every5000ms until the job completes or fails. - Use the same wallet that authorized the original trigger.
Refund flow
- If the service is
verified_escrow, a sync paid trigger can refund immediately after payment verification failure. - If the service is
verified_escrowand an async job permanently fails after acceptance, the worker issues a treasury refund. - If the service is
community_direct, reimbursement is provider-owned because the buyer paid the provider wallet directly. - Read the job retrieval payload or sync error payload for refund status, transaction hash, and any refund error details.
Provider workflow
- Prefer the CLI path for agent-driven provider onboarding: create a spec JSON and run
npm run cli -- provider sync --spec <path>. - The provider commands default to
AGENT_WALLET_KEYfrom repo-root.env; use--keyfileonly when you need to override that wallet. provider syncupserts the provider profile, creates or updates the owned service draft by slug, reconciles endpoint drafts, and creates a runtime key only when amarketplace_proxyservice does not already have one.- New provider services default to
community_direct; providers cannot self-assignverified_escrowin v1. - For
community_direct, publish only sync HTTPfixed_x402routes and keep the provider runtime key available so the marketplace can forward signed buyer identity headers. - For
verified_escrow,fixed_x402,topup_x402_variable,prepaid_credit, and async routes are allowed only after review promotes the service. - For
topup_x402_variableendpoints, setminAmountandmaxAmount; the marketplace owns the top-up crediting flow. - For async HTTP endpoints, require a provider runtime key and implement the marketplace async contract: execute returns
202withproviderJobId, poll routes exposepollPath, and webhook routes complete through the marketplace callback endpoint. - For
prepaid_creditendpoints, verify marketplace identity headers upstream and use the provider runtime credit APIs to reserve, capture, release, and when needed extend buyer credit reservations. - Run
npm run cli -- provider verify --service <slug-or-id>to mint a fresh verification challenge and show the exact URL and token the website must serve. - If verification requires touching deploy, DNS, or cloud env outside this repo, ask the user before taking that action. For arbitrary external sites, the agent should hand off the token and wait for confirmation rather than mutating infrastructure on its own.
- After the user confirms the verification token is live, continue the same
provider verifyflow so the marketplace performs the ownership check. - Run
npm run cli -- provider submit --service <slug-or-id>only after verification succeeds; this flow stops atpending_review, not admin publish. - If building from marketplace demand, review provider-visible request intake and claim the request you want to build before syncing the draft.
- After admin publish, use the public service page and paid proxy routes as the canonical execution surface.
Important provider constraints:
- provider drafts are scoped to the wallet that owns the provider profile
- payout wallet validation happens at draft/update time
- community-direct services need a provider runtime key before publish
- async
marketplace_proxyservices need a provider runtime key before publish - top-up and prepaid-credit routes are Verified/escrow only
- prepaid-credit services need a provider runtime key before they can debit marketplace-held credit
- webhook async routes require an HTTPS marketplace base URL so the marketplace can inject a callback URL
- prepaid-credit upstreams should verify the signed marketplace identity headers before reserving or capturing credit
- async providers should trust the signed marketplace identity headers and
X-MARKETPLACE-JOB-TOKENwhen correlating work - changing the service website host requires re-verification before submission
- request intake claiming is exclusive once another provider has claimed it
Admin and review workflow
- Sign into
/admin/loginwith the marketplace admin token. - Open the internal review surfaces for suggestions and submitted provider services.
- Review suggestion intake, update statuses, and add operator notes as needed.
- Review submitted provider services for correctness, pricing, ownership verification, and marketplace fit.
- Assign the settlement tier during publish:
community_directfor direct provider payment and provider-owned refundsverified_escrowfor marketplace escrow, refunds, prepaid credit, and provider payout settlement - Publish approved services so they appear in the public catalog and route registry.
- Suspend services when they should no longer be publicly executable.
Troubleshooting
402 Payment Required: the route is payable; submit payment and retry the same request401 Unauthorizedon a prepaid-credit route: create an API-scoped wallet session for that route and retry with bearer auth400on a paid trigger: the request body or payment identifier is invalid401 Unauthorizedon job retrieval: create a wallet-bound session from the same paying wallet409 Conflict: the payment identifier was reused with a different request body- insufficient prepaid credit: buy more service credit through the top-up route before retrying
- permanent async failure after acceptance: escrow services use the marketplace refund policy; community/direct services require provider support
- provider submission blocked: complete website verification or fix draft validation errors
- provider community route blocked from publish: create a runtime key or switch the service to Verified during review
- provider prepaid route failing upstream: confirm the runtime key, signed identity header verification, and reserve/capture/release flow
- service website host changed: generate a new verification challenge and verify again
- provider request claim conflict: another provider already claimed the request
- admin review unavailable: confirm the correct admin token is present
- missing service or endpoint: submit a suggestion from the marketplace UI
Discovery and reference URLs
- Marketplace UI:
https://marketplace.fast.xyz - Canonical skill:
https://marketplace.fast.xyz/skill.md - Main FAST skill:
https://skill.fast.xyz/skill.md - Suggest an endpoint:
https://marketplace.fast.xyz/suggest?type=endpoint - Suggest a source:
https://marketplace.fast.xyz/suggest?type=source - Provider dashboard:
https://marketplace.fast.xyz/providers - Provider onboarding:
https://marketplace.fast.xyz/providers/onboard - Provider services:
https://marketplace.fast.xyz/providers/services - Admin login:
https://marketplace.fast.xyz/admin/login - Admin provider services:
https://marketplace.fast.xyz/admin/services - Admin suggestions:
https://marketplace.fast.xyz/admin/suggestions - Website wallet login: use the
Connect Walletcontrol in the site header - OpenAPI:
https://fastapi.8o.vc/openapi.json - LLM summary:
https://fastapi.8o.vc/llms.txt - Marketplace catalog JSON:
https://fastapi.8o.vc/.well-known/marketplace.json
Example requests that should trigger this skill
- "Find me a paid Fast API for research signals."
- "Show me the exact curl body for a marketplace endpoint."
- "Call this Fast marketplace route and handle the 402 payment."
- "Top up credit for this marketplace service and then call the prepaid route."
- "Create an API session for this prepaid marketplace endpoint."
- "Retrieve the result for a previously paid async marketplace job."
- "Suggest a new source or endpoint for the marketplace."
- "Set up my provider profile and publish a new service."
- "Rotate the runtime key for my prepaid-credit provider service."
- "Claim this request intake item and turn it into a provider draft."
- "Review the admin queue and publish the submitted service."