Build on Proofly
Free public REST API. No API key required for the verification endpoint. Integrate 3D model authorship verification into your platform in minutes.
Base URL
https://api.proofly.store
All endpoints return JSON. Responses include X-Proofly-API-Version and X-Cache: HIT | MISS headers.
/api/hiddenmark/public/verify/{mark_code}Verify HiddenMark Code
Check whether a HiddenMark code belongs to a model published on Proofly. Returns creator identity and model metadata. No authentication required.
Path Parameters
mark_coderequiredORVIONIS_HM: prefix, up to the first null byte)Request
curl -X GET "https://api.proofly.store/api/hiddenmark/public/verify/PF-42-7-a3f9c1b2" \ -H "Accept: application/json"
Response — 200 verified
{
"ok": true,
"verified": true,
"mark_code": "PF-42-7-a3f9c1b2",
"platform": "proofly",
"api_version": 1,
"creator": {
"id": 7,
"username": "mikrotopia",
"display_name": "MikroTopia Designs",
"profile_url": "https://proofly.store/profile/mikrotopia"
},
"model": {
"id": 42,
"title": "Articulated Dragon — Print-in-Place",
"url": "https://proofly.store/item/42/articulated-dragon-print-in-place",
"published_at": "2025-11-14T09:32:00Z"
}
}Response — 200 not verified
{
"ok": true,
"verified": false,
"mark_code": "PF-0-0-unknown",
"platform": "proofly",
"api_version": 1
}Response Fields
okbooleanAlways true when the request was processed (even if not verified)verifiedbooleantrue if the mark_code is registered in Proofly's databasemark_codestringThe mark code that was queriedplatformstringAlways "proofly"api_versionnumberAPI version integer — increment when breaking changes shipcreatorobject | nullPresent when verified=true. Contains id, username, display_name, profile_urlmodelobject | nullPresent when verified=true. Contains id, title, url, published_atHTTP Status Codes
Code Examples
JavaScript / TypeScript
async function verifyMark(markCode) {
const res = await fetch(
`https://api.proofly.store/api/hiddenmark/public/verify/${markCode}`,
{ headers: { Accept: "application/json" } }
)
if (!res.ok) throw new Error(`HTTP ${res.status}`)
const data = await res.json()
if (data.verified) {
console.log(`Verified: ${data.creator.display_name} — ${data.model.title}`)
} else {
console.log("Mark not found in Proofly database")
}
}Python
import requests
def verify_mark(mark_code: str) -> dict:
url = f"https://api.proofly.store/api/hiddenmark/public/verify/{mark_code}"
r = requests.get(url, headers={"Accept": "application/json"}, timeout=10)
r.raise_for_status()
return r.json()
result = verify_mark("PF-42-7-a3f9c1b2")
if result["verified"]:
print(f"Author: {result['creator']['display_name']}")
print(f"Model: {result['model']['title']}")
print(f"URL: {result['model']['url']}")Where do HiddenMark codes come from?
Every STL file published on Proofly has a unique HiddenMark code written into the 80-byte binary header at upload time (example header: ORVIONIS_HM:PF-42-7-a3f9c1b2). The code survives:
- Re-slicing in Cura / PrusaSlicer / Bambu Studio
- Downloading and re-sharing the file
- Minor geometry edits that don't touch the file header
To extract the code from a file, read bytes 0–79 of the binary STL and look for the substring ORVIONIS_HM:. Everything after the colon until the next null byte or whitespace is the mark code.
Claude connector (MCP)
Use Proofly from Claude Code. Claude can search the marketplace, publish your models (same checks, previews and HiddenMark as the upload page), edit or hide your listings, give you download links for models you bought, and add a HiddenMark to your STL files.
Claude.ai and Claude Desktop
- Settings → Connectors → Add custom connector.
- Name: Proofly. URL:
https://api.proofly.store/api/mcp - Press Connect, log in to Proofly and choose what Claude may do: Buyer, Creator or both. Disconnect any time at /settings/api.
Claude Code
claude mcp add --transport http proofly https://api.proofly.store/api/mcp # then run /mcp inside Claude Code and log in to Proofly
Prefer an API key (CI, scripts)? Create one at /settings/api and add --header "X-API-Key: pfly_YOUR_KEY". Read-only access without any login: https://api.proofly.store/api/mcp/public.
Then just ask, e.g. "Find a free articulated dragon STL on Proofly" or "Publish ./dragon.stl on Proofly for $4 with ./cover.png as the cover".
| Access | Tools |
|---|---|
| Everyone | search_models, get_model, find_similar, list_categories, get_creator, list_challenges, verify_file |
| Buyer | my_purchases, get_download_link, favorites |
| Creator | publish_model, update_listing, unpublish_model, write_listing, my_listings, my_sales, demand_ideas, import_listing, protect_file, my_marks |
| Connected | create_upload_link (files go up with curl, then publish_model / protect_file use the file_id) |
- publish_model puts the model live right away and needs a cover image; max 10 new models a day through Claude.
- Claude can't buy, pay out, delete models, read your messages or change account settings.
- Login uses OAuth 2.1 with PKCE; Claude never sees your password, and access tokens expire after an hour.
- HiddenMark makes a file traceable to you; it is not an unbreakable lock.
Blender Add-on & Publish API
Publish a 3D model draft directly from Blender (or any tool) using your API key — no browser needed. The listing is created as a private draft; go to your dashboard to add images and publish it.
Blender Add-onv1.4.2
Supports Blender 3.6+. Install via Edit → Preferences → Add-ons → Install. A Proofly tab appears in the N-panel of the 3D Viewport.
- Generate an API key at /settings/api
- Select the mesh objects you want to publish
- Fill in title, category, license, and click Publish Draft
- Open your dashboard to add cover images and go live
POST /api/enterprise/publish
Creates a draft listing. Requires an X-API-Key header from a key with the Creator permission. Returns the item ID and a dashboard URL to complete the listing.
curl -X POST https://api.proofly.store/api/enterprise/publish \ -H "X-API-Key: pfly_YOUR_KEY" \ -F "file=@my_model.stl" \ -F "title=Dragon Miniature" \ -F "category=miniatures" \ -F "license_code=commercial" \ -F "is_free=false" \ -F "price_usd=4.99" \ -F "tags=dragon,fantasy,3d-print"
| Field | Required | Description |
|---|---|---|
| file | yes | .stl .glb .gltf .obj .fbx .3mf .zip — max 200 MB |
| title | yes | Listing title, max 128 chars |
| description | no | Listing description, max 10 000 chars |
| category | no | Category slug (default: characters) |
| license_code | no | personal | commercial | extended (default: personal) |
| is_free | no | true | false (default: true) |
| price_usd | no | Float in USD, ignored when is_free=true |
| tags | no | Comma-separated tags, max 20 |
| intended_use | no | game_engine | 3d_print | vr_ar | archviz | animation | vtuber — adds +15 to listing score |
{
"ok": true,
"item": {
"id": 123,
"slug": "dragon-miniature",
"url": "https://proofly.store/item/123/dragon-miniature",
"dashboard_url": "https://proofly.store/dashboard/models/123",
"is_draft": true,
"mark_code": "PF-123-7-a3f9c1"
}
}Unity Editor Plugin
Publish GameObjects from any Unity project as draft listings on Proofly — no browser tab required. The plugin exports your selection as OBJ (built-in, no extra packages) or FBX (requires com.unity.formats.fbx), then uploads via the same enterprise API the Blender add-on uses.
Unity Pluginv1.1.1 · Unity 2021.3+
Works with Unity 2021.3 LTS and newer. OBJ export requires no additional packages. FBX export requires the optional com.unity.formats.fbx package.
- Generate an API key at /settings/api
- Install via Package Manager:
Window → Package Manager → + → Add package from disk → unity-plugin/package.jsonor copy theEditor/folder into yourAssets/tree - Open
Window → Proofly → Publish to Marketplace - Select GameObjects in the Hierarchy, fill in details, click Publish Draft
- Open your dashboard to add cover images and go live
Coming Soon
The following endpoints are planned for future API versions. Contact us if you need early access.
GET /api/marketplace/itemsBrowse public marketplace listings with filters (category, price, format, sort)
GET /api/marketplace/creatorsPublic creator profiles — rank, stats, top models
GET /api/categoriesFull category tree with item counts
Webhook: new_saleCreator-scoped webhooks for real-time sale notifications
Questions or integration help?
Open a thread in our community or reach out directly.