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 binary header (everything after the ORVIONIS_HM: prefix, up to the first null byte)
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 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.

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.

  1. Generate an API key at /settings/api
  2. Select the mesh objects you want to publish
  3. Fill in title, category, license, and click Publish Draft
  4. Open your dashboard to add cover images and go live

POST /api/enterprise/publish

Creates a draft listing. Requires an X-API-Key header. Returns the item ID and a dashboard URL to complete the listing.

bash
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"
FieldRequiredDescription
fileyes.stl .glb .gltf .obj .fbx .3mf .zip — max 200 MB
titleyesListing title, max 128 chars
descriptionnoListing description, max 10 000 chars
categorynoCategory slug (default: characters)
license_codenopersonal | commercial | extended (default: personal)
is_freenotrue | false (default: true)
price_usdnoFloat in USD, ignored when is_free=true
tagsnoComma-separated tags, max 20
intended_usenogame_engine | 3d_print | vr_ar | archviz | animation | vtuber — adds +15 to listing score
json
{
  "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.

  1. Generate an API key at /settings/api
  2. Install via Package Manager: Window → Package Manager → + → Add package from disk → unity-plugin/package.json or copy the Editor/ folder into your Assets/ tree
  3. Open Window → Proofly → Publish to Marketplace
  4. Select GameObjects in the Hierarchy, fill in details, click Publish Draft
  5. Open your dashboard to add cover images and go live
Download ProoflyPublishWindow.cs

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.