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_coderequiredPF-{item_id}-{user_id}-{hash}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 (PF-{item}-{user}-{hash}) written into the 80-byte binary header at upload time. 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 PROOFLY_HM:. Everything after the colon until the next null byte or whitespace is the mark code.
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.