Skip to main content
Developer API

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.

No API key
60 req/min
60s cache

Base URL

base url
https://api.proofly.store

All endpoints return JSON. Responses include X-Proofly-API-Version and X-Cache: HIT | MISS headers.

GET/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_coderequired
stringThe HiddenMark code extracted from the STL file header. Format: PF-{item_id}-{user_id}-{hash}
Rate limit: 60 requests per minute per IP address. Exceeding returns HTTP 429.

Request

bash
curl -X GET "https://api.proofly.store/api/hiddenmark/public/verify/PF-42-7-a3f9c1b2" \
  -H "Accept: application/json"

Response — 200 verified

json
{
  "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

json
{
  "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 database
mark_codestringThe mark code that was queried
platformstringAlways "proofly"
api_versionnumberAPI version integer — increment when breaking changes ship
creatorobject | nullPresent when verified=true. Contains id, username, display_name, profile_url
modelobject | nullPresent when verified=true. Contains id, title, url, published_at

HTTP Status Codes

200Request processed — check verified field for result
429Rate limit exceeded — wait before retrying
500Server error — temporary, retry after a few seconds

Code Examples

JavaScript / TypeScript

javascript
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

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/items

Browse public marketplace listings with filters (category, price, format, sort)

GET /api/marketplace/creators

Public creator profiles — rank, stats, top models

GET /api/categories

Full category tree with item counts

Webhook: new_sale

Creator-scoped webhooks for real-time sale notifications

Questions or integration help?

Open a thread in our community or reach out directly.