File Market
Menu
Sign in

Docs

Getting started

How to buy, sell, and connect an agent. No SDK.

Buying

  1. Browse Explore or type in the search box. Results rank by title first. Prefix @handle to stay in one shop. Cards show price, type, rating, and version. Free packs carry a Free badge; filter them with the Free chip.
  2. Paid packs: press Buy with Stripe. Checkout uses automatic payment methods: cards, Link, Apple Pay, and Google Pay when those are on in the Stripe Dashboard. ACH (US bank) if you enable it there. Apple Pay on Stripe hosted Checkout uses checkout.stripe.com. Register filemarket.app in Stripe if you later serve Apple Pay on the shop host itself. No PayPal. You can add a promo code or send the pack as a gift.
  3. Or fund Agentic Pay once. An agent with your fmb_ token spends that balance. Sleep buys need a funded wallet. Nobody can withdraw.
  4. Free packs: press Get free. No Stripe. Sign in so the claim writes a $0 receipt and library entitlement, the same record as a paid purchase.
  5. The success page gives you a signed download link (one hour, re-mintable from your library forever). Every future version is included.

Prices are in USD. $0 is Free. A local estimate is shown when your region is not USD; paid charges are always USD. Monthly packs say /mo and bill through Stripe until you cancel. Official first-party packs live at @filemarket and are free.

Library, seats, subscriptions

Your library lists every purchase with versions, changelogs, and an entitlement key (FM-XXXX-XXXX-XXXX) anyone can verify at /api/v1/entitlements/verify without learning who you are.

  • Seats. Share any purchase with up to three people. Invite an email, send them the link, and the pack appears in their library when they sign in with that email. Revoke any time. No extra charge.
  • Subscriptions. Monthly packs show their status in the library. Manage or cancel opens the Stripe Customer Portal; access lasts until the paid period ends.
  • Exports. Download your library as CSV from the library page.
  • Notifications. New versions, saved-search matches, seller updates, and seat acceptances land in Notifications.

Selling

Sixty seconds, one paste, one Stripe tap:

1
Create shop + agent prompt
Create the shop

Sign in. Sell. Create shop + agent prompt.

2
fmk_•••• included
Copy setup for my agent
Paste the prompt

Base URL, MCP, fmk_ token, steps. Paste into your bot.

3
stripe.com/setup/…
Connect Stripe to get paid
Tap Stripe

Needed for paid packs. Free listings skip this.

4
✓ scan clean
✓ checklist ready
Published · /s/you/pack
Bot publishes

Upload, scan, price, live URL. Then versions and sales.

Free & open-source welcome. Price $0 lists without Stripe. Claimers still get a library entitlement and a $0 receipt. No platform fee on free. License presets include MIT, Apache 2.0, GPL-3.0, BSD, and CC0; a license is optional. Official File Market packs live at @filemarket.

  1. Open Sell and connect Stripe Express for paid payouts. Free listings do not need a charge.
  2. Publish a pack: zip, PDF, or a single file, up to 100MB. Screenshots are PNG, JPEG, WebP, or GIF (4MB each). Inside a zip, source trees, scripts, configs, markdown, JSON, and small binaries shipped with source are fine; we do not need a special handler per extension. Packs over a few megabytes upload in parts to R2. Automated safety checks run first (zip structure, blocked file types, zip-slip and zip-bomb, shell and exfiltration patterns, optional VirusTotal). Quarantined uploads never go live. Oversized packs return HTTP 413 with a clear size message.
  3. Software and app listings must include readable source (in the zip, or a dedicated source upload). A pack that is only .exe / .dmg / .msi / bare .app stays quarantined. Agent, document, and media packs are exempt. Listings that pass show a Source included badge. The same source rule applies to free software.
  4. Ship versions with changelogs; buyers get them free. Add screenshots, tags, an optional license note, a demo video, coupons, shelves and bundles, and storefront updates.
  5. Mark a listing Coming soon to collect a notify-me list, or Monthly to bill through Stripe Billing (monthly cannot be $0).

Duplicate a listing to start a draft from an existing one, and hide or show many listings at once from the bulk bar. Sales export to CSV from the dashboard.

Embed a buy button

Every live listing has two copy-paste snippets under Sell → your listing → Embed a buy button. Neither contains a key, token, or price you have to keep in sync; both read the live listing.

Plain HTML. Works in READMEs, newsletters, and any site. The badge is an SVG we render with the current title and price, cached for five minutes.

<a href="https://filemarket.app/s/your-handle/your-pack?utm_source=embed&utm_medium=card" target="_blank" rel="noopener"> <img src="https://filemarket.app/embed/card/your-handle/your-pack.svg" alt="Buy on File Market" height="22" /> </a>

Script button

One external script draws a button and, when a buyer clicks it, opens Stripe Checkout through the public checkout API. If payments are off or the request fails, it opens the listing page instead. The buyer pays on Stripe; your site never sees card data.

<script async src="https://filemarket.app/embed/button.js" data-listing="your-handle/your-pack"></script>
  • CSP. Allow script-src https://filemarket.app and connect-src https://filemarket.app for the script button; the link card only needs img-src https://filemarket.app.
  • Themes. Add data-theme="light" to the script tag for light backgrounds.
  • Referrals. A ?ref=handle on your page is passed through to checkout so referral credit still applies.
  • Tracking. Links carry utm_source=embed; nothing else is tracked and no cookies are set on your site.

Agents: REST

Browse and open Stripe Checkout with no key. Filter bot packs with ?type=bots (alias: agent). Sleep buys need a funded Agentic Pay wallet and a buyer token. Underfunded returns 402. Card data never touches an agent. Free packs return payment: "free" immediately when you send buyer_email or a buyer token.

curl -s https://filemarket.app/api/v1/catalog
curl -s -X POST https://filemarket.app/api/v1/checkout -H 'content-type: application/json' -d '{"slug":"inbox-triage","buyer_email":"you@example.com","agent_id":"my-agent"}'
curl -s https://filemarket.app/api/v1/checkout/SESSION_ID -H 'x-agent-id: my-agent'

Invite a human

If the human does not have an account yet, POST /api/v1/accounts/invite with their email and an optional handle. Never send a password. That creates a pending account the agent can attach checkouts to. Unauthenticated callers always get the same generic confirmation and never receive claim_url. When mail is on, the human gets the link in their inbox. When mail is off, a seller token or a signed-in seller/admin can receive claim_url once to hand over. The human opens /claim-account, sets a password or signs in with X, and then mints their own fmb_ / fmk_ tokens. Until they claim, the agent has no session and no seller powers.

curl -s -X POST https://filemarket.app/api/v1/accounts/invite -H 'content-type: application/json' -d '{"email":"you@example.com","handle":"yourname"}'

Tickets and wallet

With a buyer token: GET /api/v1/tickets lists the human's tickets. POST /api/v1/tickets opens one (kind, message, optional order or sku). POST /api/v1/tickets/{id}/reply adds a reply. POST /api/v1/wallet/topup with {"amount_cents":2500} returns a Stripe Checkout URL for the human. Cards stay in Stripe.

Reference: OpenAPI · agent.json · llms.txt · Atom feed of new versions · status.json

Prompt to paste into any assistant
Shop File Market for me. It is a marketplace for agent packs, software, and files (https://filemarket.app). Checkout is held on Stripe; downloads unlock after payment. No API key needed. You never see or enter card numbers.

Buy for me:
1. GET https://filemarket.app/api/v1/catalog (filter: ?type=bots|agent|software|file). Details: GET https://filemarket.app/api/v1/products/<slug>.
2. Compare and pick the best fit for my use case. Ask me one question if unclear.
3. If I funded Agentic Pay, GET https://filemarket.app/api/v1/wallet with my buyer token, then POST https://filemarket.app/api/v1/checkout with that token and {"slug":"<slug>","agent_id":"<your name>"}. payment "wallet" returns download_url. A 402 underfunded means I need to top up. Sleep buys need that wallet.
4. If the wallet is empty and I am here, POST https://filemarket.app/api/v1/checkout with JSON {"slug":"<slug>","buyer_email":"<my email>","agent_id":"<your name>"} and give me checkout_url. I pay on Stripe. Optional: gift_email, notify_url, coupon.
5. After a human Checkout, GET https://filemarket.app/api/v1/checkout/<session_id> (header x-agent-id) until status is "paid" or "expired". While open, give me checkout_url or human_url /checkout/waiting to resume. If expired, create a new checkout. Then give me download_url when paid.

Sell for me:
6. I will give you a seller token from https://filemarket.app/sell. Use "Authorization: Bearer <token>". POST https://filemarket.app/api/v1/uploads (raw file, headers x-filename and content-type) then POST https://filemarket.app/api/v1/listings with title, slug, type, description, price_cents (50 to 149900), file_key. New versions: POST https://filemarket.app/api/v1/listings/<id>/versions with file_key and changelog. Steps: https://filemarket.app/llms.txt

Rules: only recommend products present in the catalog response. Never invent slugs, prices, or features. Quote price_display exactly. If you cannot make HTTP requests, give me the curl commands or open https://filemarket.app and stop at the Stripe page.

Agents: MCP

Remote Model Context Protocol server at POST https://filemarket.app/mcp (JSON-RPC 2.0: initialize, tools/list, tools/call). Add it to Claude, Cursor, ChatGPT, or any MCP client:

{ "mcpServers": { "file-market": { "url": "https://filemarket.app/mcp" } } }

Tools cover search, product detail, checkout, status, versions, collections and bundles, buyer collections, compare, report, library, seats, tickets, and wallet top-up (buyer token), plus listing, uploads, versions, announcements, and sales (seller token). Full list on /mcp.

Account webhooks

Signed HMAC posts to the HTTPS URL on Account. Header x-fm-signature is t=<unix>,v1=HMAC-SHA256(secret, t + '.' + body). Reject timestamps older than 300 seconds. Failed posts retry with backoff; the delivery id stays stable. Payloads never include card data or tokens.

  • purchase.completed / purchase.paid (buyer grant, or seller with role seller)
  • sale.paid (seller handle only)
  • refund.issued
  • payout.paid / payout.failed / payout.canceled / payout.in_transit
  • version.published
  • version.available when a saved or waitlisted pack ships a version (handle and slug only)
  • version.quarantined when a new version fails the safety scan (never becomes current)
  • listing.featured / listing.feature_expired when a paid feature starts or ends (or an admin pick)
  • ad.started / ad.ended when a labeled Sponsored slot starts or ends
  • listing.unfeatured when File Market takes a pack off the homepage rail
  • listing.published when a pack goes live (handle and slug only)
  • listing.hidden / listing.restored / listing.trashed when a pack leaves browse (handle and slug only)
  • listing.updated when you save metadata on a live pack (handle and slug only)
  • dispute.opened / dispute.closed when Stripe opens or closes a card-network dispute (handle and amount only)
  • ticket.opened / ticket.replied / ticket.evidence / ticket.resolved
  • review.posted / review.updated / review.deleted / review.replied / review.helpful (handle or count only)
  • helper.invited / helper.accepted / helper.left when a shop helper is invited, accepts, or leaves (handle or count only, never an email)
  • announcement.posted when a shop posts a storefront update
  • follow.gained when someone follows the shop (follower handle only)
  • follow.shop when you follow a shop (seller handle only)
  • follow.lost when you unfollow a shop (seller handle only)
  • collection.shared when you turn on a collection share link (title and count only)
  • collection.unshared when you turn that link off (title and count only)
  • collection.item_added / collection.item_removed when a pack lands in or leaves a named collection (title, count, and slug only)
  • wishlist.shared when you turn on a wishlist share link (count only)
  • wishlist.unshared when you turn that link off (count only)
  • wishlist.item_added / wishlist.item_removed when you save or remove a pack from your wishlist (slug and count only)
  • notification.digest when you send unread counts from Notifications (counts by kind only)
  • saved.search.matched when a live pack hits a saved Explore query (slug and query only)
  • refund.requested when a buyer opens a File Market dispute (sku and amount only)
  • refund.withdrawn when that buyer withdraws the dispute before a staff refund (sku only)
  • waitlist.joined / waitlist.already_waiting / waitlist.left / waitlist.fulfilled when someone joins, joins again, leaves, or a notify list is told (count only; already-waiting goes to the buyer)
  • wishlist.item_available when a saved pack goes live or restocks (handle and slug only)
  • seat.invited / seat.accepted / seat.revoked when a buyer shares, someone accepts, or a household seat is removed (handle or counts only, never an email)
  • subscription.renewed / subscription.canceled / subscription.payment_failed for monthly packs (handle only)
  • tip.received when someone tips the shop (amount only)
  • tip.sent when you tip a shop (amount and seller handle only)
  • credit.received when store credit lands (amount only)
  • wallet.funded when Agentic Pay is topped up (amount only)
  • gift.sent / gift.received / gift.delivered when a pack is bought for a friend or a claim link attaches it (handles only, never an email; human_url is /library?view=gifts)
  • ping from the test button

After create_checkout returns a Stripe URL, human_url is /checkout/waiting?session_id=… so they can resume, cancel, or see expire copy. Wallet, free, and paid-without-grant checkouts use /purchases/{session_id} as the confirmation page (same surface as /success?session_id=). Tickets and disputes use /support/tickets/{id}. refund.requested buyer human_url is /support/tickets/{id}#evidence. Library stays /library. Gifts land on /library?view=gifts.

Tokens and scopes

TokenWhereCanCannot
fmb_… buyerAccountList the library, mint download links, debit Agentic Pay, open a wallet top-up Checkout for the human, read checkout status, verify keys, manage seats, open and reply to ticketsWithdraw, sell, change the account
fmk_… sellerSellUpload, create and edit listings, publish versions, post updates, read salesMove money, change payouts, act on other sellers
fmc_… helperInvited from Sell → Helper access, minted on AccountUpload, create and edit listings, publish versions, trash and restore, read the shop profileSales, payouts, Stripe, storefront updates, tickets, tokens (403)
noneBrowse, search, invite a human (POST /api/v1/accounts/invite, generic confirmation only), open a checkout, poll status with the same agent_idAnything account-scoped. Invite never returns claim_url, never sets a password, and never opens a session as the human.

Send tokens as Authorization: Bearer …. They are shown once, stored hashed, and revocable.

Safety and refunds

  • Every upload is scanned before it can be downloaded; results show as a badge on the listing. Checks are automated and not a guarantee, so read the file list and reviews. Packs may be up to 100MB; screenshots stay 4MB.
  • Source for software. Application listings must include readable source (dedicated upload or a zip with source, README, or package manifests). A pack that is only .exe, .dmg, .msi, or a bare .app stays quarantined. Common dev contents inside a zip (source trees, scripts, configs, markdown, JSON, small binaries with source) are fine. Bot packs, documents, and media are exempt.
  • Zip checks cover path traversal (zip slip), extreme compression (zip bombs), blocked types, and text heuristics for shell pipes and credential exfil. VirusTotal is optional when a key is configured.
  • Downloads are short-lived signed links through the Worker; packs are never public objects.
  • Refunds and problems: open a ticket from Support or from the order in your library. Sellers see tickets on their dashboard; File Market can step in.
  • Report a listing or shop from its page with a reason. Reports go to the File Market abuse queue. The seller is not told who reported. Hiding a listing leaves paid library downloads in place.

Security notes and the audit log live in the repository's SECURITY_AUDIT.md. Live health: /status.

Search and sharing

  • Every public page has a unique title, meta description, canonical URL, Open Graph and Twitter card, and crawlable HTML (not an empty JS shell).
  • Listings emit Product or SoftwareApplication, Offer, BreadcrumbList, and FAQ JSON-LD when those fields exist. Shops and collections emit ItemList. Home emits Organization and WebSite with SearchAction.
  • /sitemap.xml lists home, explore facets, docs, leaders, /updates, live listings, shops, collections, and /media with lastmod and priority. /robots.txt allows those pages and disallows account, login, checkout, saved lists, claim links, and download internals.
  • Share cards for listings, shops, and collections are generated at /og/s/{handle}/{sku}.png, /og/@{handle}.png, and /og/c/{slug}.png. Site-wide cards stay at /media/og/v1/card.png. The File Market mark is the same icon as /media/brand/icon.svg and /media/brand/icon-4096.png on the nav, favicon, OG, campaign stills, and embeds.
  • Agent discovery stays at /llms.txt and /.well-known/agent.json.

Press and ads

The brand kit lives at /media: SVG and PNG marks, wordmarks, OG, square, X header, and a downloadable zip. Use those files for advertising. Video storyboards and scripts are in the repo at docs/ads.md; Market Ads produces final spots outside this Worker.

  • Keep the 2×2 mark (cream / copper / faint / cream) on the ink field.
  • Do not recolour, stretch, or nest the mark inside another logo.
  • Official shop is @filemarket. All of its packs are free and still write a real $0 purchase.