Skip to main content

UEFN Marketplace for Developers

Build with the REST API, automate uploads, or let AI assistants manage your account through MCP. One developer token powers both surfaces.

Overview

The UEFN Marketplace developer platform has two surfaces, both authenticated with the same token from Dashboard → Developer. Pick whichever fits your workflow — you don't need both.

Build custom scripts and automations

Batch-upload asset packs from CI/CD pipelines

Integrate with external tools (Make, Zapier, etc.)

Manage listings programmatically

Standard HTTP — works in any language

Let AI assistants (Claude, Cursor, etc.) act on your behalf

Manage Creator Studio: boards, cards, sprints, wiki, Verse

No HTTP requests — AI calls tools via structured protocol

Hosted (always-on) or local process — your choice

Upload assets by describing what you want in chat

Shared token: Generate one token at Dashboard → Developer. It works for both the REST API (Authorization: Bearer smcp_...) and the MCP server (UEFN_API_TOKEN=smcp_...). The two integrations are independent — you don't need to use both.

REST API v1

UEFN Marketplace REST API

A standard HTTP/JSON API for building custom tools, automating asset uploads, and integrating UEFN Marketplace into your own scripts and workflows.

REST API vs MCP — which should I use?

Both are powered by the same developer token. They serve different use cases — see the overview for the at-a-glance comparison, or jump straight to the MCP section.

Quick start

1. Generate a token

Go to Dashboard → Developer and click New Token. Copy it — it starts with smcp_ and is shown once.

2. Verify it works

curl https://uefnmarketplace.com/api/v1/me \
  -H "Authorization: Bearer smcp_..."

3. Start building

All endpoints live under /api/v1. The machine-readable spec is at /api/v1/openapi.json.

Authentication

Authorization header (all requests)

Authorization: Bearer smcp_YOUR_TOKEN_HERE

Generated in Dashboard → Developer. Scoped, revocable at any time.

Full example

curl https://uefnmarketplace.com/api/v1/me \
  -H "Authorization: Bearer smcp_YOUR_TOKEN_HERE"

# → 200 OK
{
  "id": "...",
  "username": "your-username",
  "is_seller": true,
  ...
}

Token scopes

Tokens created in the dashboard get profile:read, assets:read and assets:write. The other scopes are honoured by the API but not yet grantable from the dashboard; sign in and call those endpoints with your session JWT. You can revoke tokens at any time from Dashboard → Developer.

profile:readRead your profile
profile:writeUpdate your profile
assets:readList and read your assets
assets:writeCreate, update, delete, and upload assets
tokens:readList your tokens via the API
tokens:revokeRevoke tokens via the API

Endpoints

Base URL: https://uefnmarketplace.com/api/v1

Platform

GET
https://uefnmarketplace.com/api/v1/health

Public health check — no auth required. Returns platform status.

Profile

GET
https://uefnmarketplace.com/api/v1/me

Read your profile (username, bio, seller status, social links, subscription tier).

profile:read
PATCH
https://uefnmarketplace.com/api/v1/me

Update editable profile fields (display name, bio, website, socials, hire details, country).

profile:write

Assets — listing management

GET
https://uefnmarketplace.com/api/v1/assets

List your asset listings. Filter by status (draft, pending, scheduled, published, rejected, changes_requested, archived), paginate with limit and offset.

assets:read
POST
https://uefnmarketplace.com/api/v1/assets

Create a new draft listing (approved sellers only). Returns the asset id needed for upload steps.

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/batch

Batch-create up to 25 draft assets in one call. Returns per-item success/failure (207).

assets:write
GET
https://uefnmarketplace.com/api/v1/assets/:id

Get full asset details including images, tags, and category.

assets:read
PATCH
https://uefnmarketplace.com/api/v1/assets/:id

Update metadata, pricing, visibility, tags, or schedule.

assets:write
DELETE
https://uefnmarketplace.com/api/v1/assets/:id

Permanently delete a draft asset. Only status=draft can be deleted.

assets:write

Assets — upload lifecycle

Four-step workflow: get signed URL → PUT binary → confirm → submit

POST
https://uefnmarketplace.com/api/v1/assets/:id/upload-url

Generate a short-lived signed URL for uploading the asset file (ZIP, etc.). Not available on a published listing — new files for live listings go through version review in the seller dashboard.

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/:id/confirm-file

Record the uploaded file on the asset, using the storage_path upload-url returned. Required before submit.

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/:id/images/upload-url

Generate a signed URL for uploading a gallery image. Upload WebP — the site serves gallery images as WebP.

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/:id/confirm-image

Register an uploaded image (the public_url upload-url returned) in the gallery. First image becomes the thumbnail.

assets:write
POST
https://uefnmarketplace.com/api/v1/assets/:id/submit

Submit a draft, rejected or changes-requested asset for review. Asset must have an uploaded file. A future scheduled_publish_at makes it scheduled; it enters review at that time.

assets:write

Token management

GET
https://uefnmarketplace.com/api/v1/tokens

List all your developer tokens (names, prefixes, last used at).

tokens:read
DELETE
https://uefnmarketplace.com/api/v1/tokens?id=:uuid

Revoke a specific token by its UUID. The token stops working immediately.

tokens:revoke

Full upload walkthrough

Complete workflow for creating an asset listing and uploading its file and cover image. All four upload steps are required before submitting for review.

Step 1 — Create the draft listing

POST https://uefnmarketplace.com/api/v1/assets
Authorization: Bearer smcp_YOUR_TOKEN

{
  "title": "Epic Forest Pack",
  "slug": "epic-forest-pack",
  "description": "Modular forest pack — trees, rocks, and foliage for UEFN maps.",
  "pricing_type": "fixed",
  "price": 9.99,
  "visibility": "public",
  "tags": ["nature", "forest", "UEFN"]
}

# → 201 Created
{ "id": "asset-uuid", "slug": "epic-forest-pack", "status": "draft", "tags": [...], ... }

Step 2 — Upload the asset file

Get a signed URL, PUT the file, then confirm

# 2a. Get a signed upload URL (valid for 2 hours)
POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/upload-url
{ "filename": "epic-forest-pack-v1.zip" }
# Response: { "signed_url": "https://...", "storage_path": "..." }

# 2b. PUT the file binary directly to storage (no Authorization header)
curl -X PUT "<signed_url>" \
  --upload-file epic-forest-pack-v1.zip \
  -H "Content-Type: application/zip"

# 2c. Record the file on the asset
POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/confirm-file
{ "storage_path": "...", "file_size": 4294967 }
# → { "success": true }

Step 3 — Upload gallery images (optional but recommended)

Repeat for each image. The first image becomes the primary thumbnail.

# 3a. Get a signed URL for the image
POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/images/upload-url
{ "filename": "preview.webp" }
# Response: { "signed_url": "...", "storage_path": "...", "public_url": "https://..." }

# 3b. PUT the image binary
curl -X PUT "<signed_url>" \
  --upload-file preview.webp \
  -H "Content-Type: image/webp"

# 3c. Register the image in the gallery
POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/confirm-image
{ "public_url": "https://..." }
# → 201 { "success": true, "image_id": "img-uuid", "is_primary": true, ... }

Step 4 — Submit for review

POST https://uefnmarketplace.com/api/v1/assets/asset-uuid/submit

# → 200 OK
{ "success": true, "id": "asset-uuid", "status": "pending" }
# Asset is now in the moderation queue.

Error codes

401 UNAUTHORIZEDMissing, invalid, expired, or revoked token.
400 INVALID_INPUTA field failed validation — the message names it.
403 FORBIDDENToken lacks the required scope, or the account is suspended.
403 NOT_A_SELLER / ACCOUNT_RESTRICTEDOnly approved, unrestricted sellers can create listings.
404 NOT_FOUNDResource does not exist or does not belong to you.
409 CONFLICTSlug already taken.
409 INVALID_STATUS / NOT_DRAFTStatus prevents the action (submit needs draft, rejected or changes_requested; delete needs draft).
409 LISTING_IS_LIVEThe listing is published; upload a new version from the seller dashboard instead.
409 PAYOUTS_REQUIRED / PRECONDITION_FAILEDConnect payouts before a paid listing goes live, or the change needs a plan feature.
422 NO_FILETried to submit an asset that has no uploaded file.
429 RATE_LIMITEDToo many requests — back off and retry.
500 INTERNAL_ERRORInternal error — retry or contact support at uefnmarketplace.com/contact.

Want to use an AI assistant instead of writing HTTP requests?

The MCP server lets Claude, Cursor, VS Code Copilot, and any MCP-compatible AI assistant call tools on your behalf — no HTTP required. It uses the same developer token and supports asset uploads plus the full Creator Studio (boards, Verse snippets, sprints, wiki, and more).

Jump to MCP setup
Model Context Protocol

UEFN Marketplace MCP Server

Let AI assistants — Claude, Cursor, VS Code Copilot — read and write your UEFN Marketplace account through structured tool calls. No HTTP requests, no copy-pasting data. Just describe what you want in chat.

What is MCP?

MCP (Model Context Protocol) is an open standard by Anthropic that lets AI assistants securely call external tools. Instead of you copy-pasting data into chat, the AI calls a tool, gets structured JSON back, and acts on it — all in one conversation.

How it works:

AI assistant (Claude, Cursor, …)
        │  tool calls
        ▼
UEFN Marketplace MCP Server   ← this product
        │  Supabase SDK / REST
        ▼
UEFN Marketplace (your account, projects, assets)

MCP vs REST API: The REST API is for scripts and custom integrations that make direct HTTP calls. The MCP server is for AI assistants that need to reason, decide, and act autonomously. Both use the same developer token. See the REST API section →

Step 1 — Get your developer token

Go to Dashboard → Developer and click New Token.

The token starts with smcp_ and is shown only once. Copy it before closing the dialog.

The same token works for both the MCP server and the REST API. You only ever need one.

Step 2a — Hosted MCP (recommended)

Recommended
Always-on · No install · Part of the site

The MCP server runs permanently at https://uefnmarketplace.com/api/mcp, served by the UEFN Marketplace site itself. Nothing to install, nothing to keep updated.

Claude Desktop — remote HTTP

Settings → Developer → Edit Config (claude_desktop_config.json)

{
  "mcpServers": {
    "uefn-marketplace": {
      "type": "http",
      "url": "https://uefnmarketplace.com/api/mcp",
      "headers": {
        "Authorization": "Bearer smcp_YOUR_TOKEN_HERE"
      }
    }
  }
}

Cursor / VS Code — remote HTTP

.cursor/mcp.json or VS Code settings.json

{
  "mcp": {
    "servers": {
      "uefn-marketplace": {
        "type": "http",
        "url": "https://uefnmarketplace.com/api/mcp",
        "headers": {
          "Authorization": "Bearer smcp_YOUR_TOKEN_HERE"
        }
      }
    }
  }
}

Verify the hosted server

Run this curl to confirm the endpoint is up and your token is accepted:

curl -X POST https://uefnmarketplace.com/api/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer smcp_YOUR_TOKEN" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"health_check"}}'

# → result.content[0].text reports "ok": true and your user id
# A bad token returns HTTP 401. (ping, initialize and tools/list answer without a token.)

Or ask your AI to call the health_check tool. It confirms DB connectivity and your authenticated user ID.

Step 2b — Local MCP (full Creator Studio tools)

The local MCP server gives you the complete Creator Studio suite — Kanban boards, Verse snippets, sprints, milestones, labels, island codes, wiki pages, and more — in addition to asset uploads. Run it as a local process that your AI connects to via stdio.

Install — download and build (Node 18+)

curl -L "https://uefnmarketplace.com/downloads/uefn-studio-mcp-server.zip" -o uefn-studio-mcp-server.zip
unzip uefn-studio-mcp-server.zip
cd uefn-studio-mcp-server
npm ci && npm run build
UEFN_API_TOKEN=smcp_xxxxx node dist/index.js

Claude Desktop — local process

{
  "mcpServers": {
    "uefn-studio": {
      "command": "node",
      "args": ["/path/to/uefn-studio-mcp-server/dist/index.js"],
      "env": {
        "UEFN_API_TOKEN": "smcp_YOUR_TOKEN_HERE"
      }
    }
  }
}

Cursor / VS Code — local process

{
  "mcp": {
    "servers": {
      "uefn-studio": {
        "type": "stdio",
        "command": "node",
        "args": ["/path/to/uefn-studio-mcp-server/dist/index.js"],
        "env": {
          "UEFN_API_TOKEN": "smcp_YOUR_TOKEN_HERE"
        }
      }
    }
  }
}

Hosted vs Local — tool parity

Both servers use the same authentication. The hosted server covers asset management and upload. The local server adds the full Creator Studio suite.

MCP tool availability in hosted versus local servers
ToolHosted MCPLocal MCP
health_check✅✅
get_my_profile✅—
list_categories✅—
list_my_assets✅✅
get_asset✅✅
create_asset✅✅
update_asset✅✅
delete_asset✅✅
get_asset_upload_url✅✅
confirm_asset_file✅✅
get_image_upload_url✅✅
confirm_image✅✅
submit_asset✅✅
get_seller_profile / get_seller_stats / …—✅
list_projects / get_project / …—✅
create_board / list_boards / …—✅
create_card / move_card / …—✅
create_sprint / start_sprint / …—✅
create_wiki_page / …—✅
create_verse_snippet / …—✅
create_island_code / …—✅
create_milestone / …—✅
create_label / add_label_to_card / …—✅
export_project / import_project—✅

The listing tools behave identically on both: the local server calls the same hosted REST API, so every listing passes the same review checks.

Uploading assets via MCP

You can upload assets entirely from your AI assistant. The workflow is identical on both hosted and local MCP — just tell your AI assistant what you want:

Example prompt

“Create a new asset called ‘Epic Forest Pack’, price it at $9.99, upload the file at ./forest-pack.zip, upload the preview image at ./preview.jpg, then submit it for review.”

The AI will call in sequence:

  1. create_asset → creates draft, returns asset UUID
  2. get_asset_upload_url → gets signed URL for the ZIP
  3. HTTP PUT to the signed URL (the AI handles this automatically)
  4. confirm_asset_file → records the file
  5. get_image_upload_url → gets signed URL for the image
  6. HTTP PUT the image to the signed URL
  7. confirm_image → adds the image to the gallery
  8. submit_asset → moves to “pending” review

File access note:The AI assistant needs access to your local file system to PUT the file binary to the signed URL. Claude Desktop and Cursor both support this. If your AI can't access local files, use the REST API instead.

Authentication

Set UEFN_API_TOKEN to your developer token (starts with smcp_). That is the only credential you need.

Authentication environment variables and when to use each
VariableWhen to use
UEFN_API_TOKENRecommended — token from Dashboard → Developer. Auto-refreshes.
SUPABASE_USER_JWTAdvanced; your Supabase JWT. Expires hourly, must be manually refreshed.
SUPABASE_SERVICE_ROLE_KEYAdmin automation only — bypasses row-level security. Use with extreme care.

How it works: Your UEFN_API_TOKEN is exchanged for a short-lived Supabase JWT server-side. All reads/writes go through RLS as your user. Tokens auto-refresh every hour in the background.

Troubleshooting

“Invalid API key” or “Unauthorized”

Your token has expired or was revoked. Generate a new one in Dashboard → Developer and restart your AI assistant.

Local server exits immediately

Make sure UEFN_API_TOKEN is in the env block of your MCP config — not in your shell. Restart your AI assistant after changing the config.

“Invalid OAuth error response” (Cursor / VS Code)

Remote MCP clients probe OAuth discovery URLs before connecting. The site returns JSON 401 for those paths so the client falls back to your Authorization: Bearer smcp_... header. Use the exact URL shown on this page (no www) — www redirects to it, and some clients break OAuth discovery on a redirect.

Hosted server not responding

curl -X POST https://uefnmarketplace.com/api/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"ping"}'
# Should return: {"jsonrpc":"2.0","id":1,"result":{}}

The hosted server is an API route of the site and is always available as long as uefnmarketplace.com is up. ping needs no token; if a tool call returns 401, your token is invalid or revoked. If you get a 404, double-check the URL.

AI can't find the tools

Ask your AI to call health_check. If tools aren't listed, the MCP server isn't connected. Check that your config JSON is valid and that you've restarted the AI assistant after editing it.

v1

Building a script or automation instead?

The REST API at /api/v1 is the right tool for CI/CD pipelines, custom scripts, Make/Zapier automations, and any integration that makes direct HTTP requests. Same token, no AI required.

Jump to REST API