{"openapi":"3.1.0","info":{"title":"ArtAI \u2014 Art Value Index API","version":"1.1.0","description":"A transparent, data-driven index of the credibility, visibility and potential value of both ARTISTS and individual ARTWORKS \u2014 across every discipline (painting, photography, sculpture, ceramics, music, video, literature\u2026) \u2014 plus a full artwork certification pipeline (steganography, C2PA, IPFS, NFT, certificate of authenticity). ArtAI does not set a price. The API is entirely free: no credits, no quota, no subscription \u2014 the Bearer token only identifies who writes."},"servers":[{"url":"https:\/\/www.artai.fr"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT or personal token (sk_...)"}}},"tags":[{"name":"Auth"},{"name":"Artists"},{"name":"Scoring"},{"name":"Cote"},{"name":"Artworks"},{"name":"Editions"},{"name":"Engagement"},{"name":"Trust"},{"name":"Provenance"},{"name":"Partners"},{"name":"Meta"}],"paths":{"\/api\/health":{"get":{"tags":["Meta"],"summary":"Service health \u0026 capabilities","responses":{"200":{"description":"Success"}}}},"\/api\/brand":{"get":{"tags":["Meta"],"summary":"Brand kit: official ArtAI assets (logos, favicon, OG card), colours and typography. Each asset has a direct download URL and, once pinned, an IPFS\/Pinata URL.","responses":{"200":{"description":"Success"}}}},"\/api\/brand\/{id}":{"get":{"tags":["Meta"],"summary":"Download a brand asset (logo | logo-clean | favicon). Add ?download=1 to force a file download.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/brand\/pin":{"post":{"tags":["Meta"],"summary":"Pin the brand assets to IPFS\/Pinata (populates the ipfsUrl in \/api\/brand). ROLE_ADMIN.","responses":{"200":{"description":"Success"}},"security":[{"bearerAuth":[]}]}},"\/api\/auth\/register":{"post":{"tags":["Auth"],"summary":"Register a new account and receive a JWT","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"string"},"password":{"type":"string","description":"string"},"displayName":{"type":"string","description":"string?"},"walletAddress":{"type":"string","description":"string?"}}}}}}}},"\/api\/auth\/token":{"post":{"tags":["Auth"],"summary":"Log in and obtain a JWT access token","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"email":{"type":"string","description":"string"},"password":{"type":"string","description":"string"}}}}}}}},"\/api\/auth\/me":{"get":{"tags":["Auth"],"summary":"Current authenticated user","responses":{"200":{"description":"Success"}},"security":[{"bearerAuth":[]}]}},"\/api\/auth\/api-tokens":{"get":{"tags":["Auth"],"summary":"List personal API tokens","responses":{"200":{"description":"Success"}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Auth"],"summary":"Create a personal API token","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"string?"},"scopes":{"type":"string","description":"string[]?"},"expiresInDays":{"type":"string","description":"int?"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/artists":{"get":{"tags":["Artists"],"summary":"Search artists. Filters combine; `data` + `total` keep their historical shape and `limit` still works as an alias of perPage.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"nature","in":"query","required":false,"schema":{"type":"string"}},{"name":"country","in":"query","required":false,"schema":{"type":"string"}},{"name":"category","in":"query","required":false,"schema":{"type":"string"}},{"name":"minScore","in":"query","required":false,"schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer"}},{"name":"perPage","in":"query","required":false,"schema":{"type":"integer"}}]},"post":{"tags":["Artists"],"summary":"Create an artist. A bare domain is accepted for website (\u0022marinareyes.art\u0022 \u2192 https:\/\/marinareyes.art); socials is a { platform: handle } map.","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"string"},"bio":{"type":"string","description":"string?"},"nature":{"type":"string","description":"human|ai|hybrid"},"country":{"type":"string","description":"string?"},"website":{"type":"string","description":"string? (bare domain accepted)"},"socials":{"type":"string","description":"object? { platform: handle }"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/artist\/{ref}":{"get":{"tags":["Artists"],"summary":"Get an artist by id, uuid or slug","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"tags":["Artists"],"summary":"Update an artist\u0027s profile (owner or curator\/admin only). PATCH semantics: only the fields you send change. The slug\/URL is immutable. A bare website domain is accepted.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"string?"},"nature":{"type":"string","description":"human|ai|hybrid?"},"country":{"type":"string","description":"string?"},"website":{"type":"string","description":"string? (bare domain accepted)"},"bio":{"type":"string","description":"string?"},"socials":{"type":"string","description":"object? { platform: handle }"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/artist\/{ref}\/photo":{"post":{"tags":["Artists"],"summary":"Set the artist\u0027s reference photo (multipart \u0022photo\u0022 file). Owner or curator\/admin only.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"photo":{"type":"string","description":"file (multipart)"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/artist\/{ref}\/score":{"get":{"tags":["Scoring"],"summary":"Get the ArtScore index (add ?fresh=1 to recompute)","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}},{"name":"fresh","in":"query","required":false,"schema":{"type":"boolean"}}]}},"\/api\/artist\/{ref}\/score\/history":{"get":{"tags":["Scoring"],"summary":"The ArtScore over time \u2014 the data behind \u0022Progression de la cote\u0022. Real daily snapshots, one point per day (the day\u0027s last computation). Demo artists carry simulated:true on the series and on every point: a fabricated curve is never presented as a track record.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}},{"name":"granularity","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}]}},"\/api\/artist\/{ref}\/score\/refresh":{"post":{"tags":["Scoring"],"summary":"Recompute and persist the ArtScore. Also records today\u0027s point in the artist\u0027s history.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"bearerAuth":[]}]}},"\/api\/artist\/{ref}\/market-index":{"get":{"tags":["Scoring"],"summary":"Market signals summary (sales, peak, timeline)","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/artist\/{ref}\/exhibition-impact":{"get":{"tags":["Engagement"],"summary":"Authenticated attendance \u0026 conversion funnel","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/formats":{"get":{"tags":["Cote"],"summary":"Reference table of traditional French canvas formats (N\u00b0 0-120, F\/P\/M) and the \u0022cote au point\u0022 rules.","responses":{"200":{"description":"Success"}}}},"\/api\/formats\/match":{"post":{"tags":["Cote"],"summary":"Match free dimensions (cm) to the nearest standard format. Square\/double-square canvases are assimilated; n\u00b00 counts 0.8 point.","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"width":{"type":"string","description":"number (cm)"},"height":{"type":"string","description":"number (cm)"}}}}}}}},"\/api\/artist\/{ref}\/cote":{"get":{"tags":["Cote"],"summary":"Artist \u0022cote au point\u0022: price-per-point derived from the ArtScore, with an example grid. Indicative potential value, never a fixed price.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/artwork\/{ref}\/estimate":{"get":{"tags":["Cote"],"summary":"Indicative estimate for a specific artwork = price-per-point \u00d7 points \u00d7 physical multiplier (materials, time, extent) + frame value. The point count follows the discipline\u0027s own method: the French format table for flat works, the developed surface (6\u00d7V^\u2154) for volumes, a per-piece base for jewelry\/fashion\/digital, points-per-minute for time-based works, points-per-1000-words for literature.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/artist\/rating":{"post":{"tags":["Scoring"],"summary":"Submit a weighted rating for an artist (public). Pass \u0022voterKey\u0022 (a stable anonymous visitor fingerprint) to make a VISITOR vote idempotent per artist: a re-vote updates the visitor\u0027s rating instead of stacking a new one (response \u0022created\u0022:false). Used by partner exhibition QR flows (e.g. montmartre-nft) \u2014 set \u0022source\u0022 to the partner name.","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"artist":{"type":"string","description":"string"},"raterType":{"type":"string","description":"visitor|collector|gallerist|critic|curator|buyer"},"stars":{"type":"string","description":"int(1-5)?"},"criteria":{"type":"string","description":"object?"},"comment":{"type":"string","description":"string?"},"voterKey":{"type":"string","description":"string(\u003C=64)? \u2014 idempotency key for visitor votes"},"source":{"type":"string","description":"string? \u2014 partner emitter (alias of raterIdentity)"}}}}}}}},"\/api\/artist\/{ref}\/market-record":{"post":{"tags":["Scoring"],"summary":"Record a sale \/ market signal","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"auction|gallery|nft|edition|private"},"price":{"type":"string","description":"number"},"currency":{"type":"string","description":"string?"},"source":{"type":"string","description":"string?"},"soldAt":{"type":"string","description":"date?"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/artist\/{ref}\/recognition":{"post":{"tags":["Scoring"],"summary":"Submit a recognition. Always created as \u0022pending\u0022 \u2014 the \u0022verified\u0022 flag is ignored and must be granted by a trusted actor.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"exhibition|residency|prize|press|gallery|museum|curator"},"title":{"type":"string","description":"string"},"institution":{"type":"string","description":"string?"},"url":{"type":"string","description":"string? (required for press)"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/signals\/pending":{"get":{"tags":["Trust"],"summary":"List ALL signals awaiting verification (market, recognition, rating). ROLE_CURATOR or scope signal:verify.","responses":{"200":{"description":"Success"}},"security":[{"bearerAuth":[]}]}},"\/api\/signal\/{kind}\/{id}\/verify":{"post":{"tags":["Trust"],"summary":"Verify\/reject any signal (kind = market|recognition|rating). The source (any website presenting the work) is checked: category allow-list, reachability, artist-name, AI credibility. Requires ROLE_CURATOR or a token scoped signal:verify.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"decision":{"type":"string","description":"verify|reject"},"proofUrl":{"type":"string","description":"string?"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/recognition\/{id}\/verify":{"post":{"tags":["Trust"],"summary":"Legacy alias for verifying a recognition.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"decision":{"type":"string","description":"verify|reject"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/artworks":{"get":{"tags":["Artworks"],"summary":"List artworks, newest first. Filter by discipline with ?category=.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"category","in":"query","required":false,"schema":{"type":"string"}}]},"post":{"tags":["Artworks"],"summary":"Upload an artwork and run the full certification pipeline. Enforces edition limits \u0026 uniqueness \u2014 returns 409 on a full edition\/duplicate, or 409 needs_review when a same-object check cannot be decided. multipart or base64.","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"string"},"artist":{"type":"string","description":"string?"},"artistName":{"type":"string","description":"string?"},"category":{"type":"string","description":"string? (discipline \u2014 see \/api\/categories; default: painting)"},"mediaRole":{"type":"string","description":"original|documentation|representation? (what the image IS relative to the work; default: the category\u0027s own)"},"creationType":{"type":"string","description":"ai|human|digital"},"medium":{"type":"string","description":"string?"},"year":{"type":"string","description":"string?"},"dimensions":{"type":"string","description":"string?"},"depthCm":{"type":"string","description":"number? (volume for 3D)"},"materials":{"type":"string","description":"string? (physical family)"},"materialQuality":{"type":"string","description":"int 0-100? (declared, else derived)"},"creationHours":{"type":"string","description":"number? (time to create)"},"framed":{"type":"string","description":"bool? (flat works only)"},"frameType":{"type":"string","description":"string? (e.g. bois dor\u00e9, aluminium)"},"frameValue":{"type":"string","description":"number? (frame value \u20ac, else derived)"},"editionSize":{"type":"string","description":"int?"},"editionId":{"type":"string","description":"string? (add a piece to an edition)"},"price":{"type":"string","description":"number?"},"aiModel":{"type":"string","description":"string?"},"image":{"type":"string","description":"file|base64? (optional when a sourceFile is given \u2014 the representation is derived from it)"},"sourceFile":{"type":"string","description":"file? (THE work, for a non-visual discipline: audio\/video\/text. Required for music, literature\u2026 \u2014 see \/api\/categories)"},"durationSeconds":{"type":"string","description":"int? (else probed from the source file)"},"wordCount":{"type":"string","description":"int? (else counted from the source text)"},"steps":{"type":"string","description":"object?"},"force":{"type":"string","description":"bool? (ROLE_CURATOR only)"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/categories":{"get":{"tags":["Artworks"],"summary":"The discipline reference: every category with its group, default media role, allowed roles, cote method, and the source-file types it expects. Drives the deposit form.","responses":{"200":{"description":"Success"}}}},"\/api\/artworks\/check":{"post":{"tags":["Editions"],"summary":"Pre-check an image for duplicate \/ edition status WITHOUT depositing. The question asked depends on mediaRole: same image (original), same physical object (documentation), same source file (representation).","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"artist":{"type":"string","description":"string"},"image":{"type":"string","description":"file|base64"},"editionSize":{"type":"string","description":"int?"},"editionId":{"type":"string","description":"string?"},"category":{"type":"string","description":"string?"},"mediaRole":{"type":"string","description":"string?"},"sourceHash":{"type":"string","description":"string? (SHA-256 of the source file, for a representation)"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/edition\/{ref}":{"get":{"tags":["Editions"],"summary":"Public edition ledger: size, issued, remaining, and the numbered pieces.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/artwork\/{ref}":{"get":{"tags":["Artworks"],"summary":"Get an artwork with full provenance (includes its own artScore).","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/artwork\/{ref}\/score":{"get":{"tags":["Scoring"],"summary":"The ARTWORK\u0027s own ArtScore (0-100): the same seven weighted families as the artist index (physique, market, recognition, engagement, reviews, traceability, rarity) scored against this single piece, whatever its discipline. Lazily computed and cached; add ?fresh=1 to recompute. A work\u0027s score, not the artist\u0027s.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}},{"name":"fresh","in":"query","required":false,"schema":{"type":"boolean"}}]}},"\/api\/artwork\/{ref}\/process":{"post":{"tags":["Provenance"],"summary":"Re-run \/ resume the certification pipeline","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"steps":{"type":"string","description":"object?"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/artwork\/{ref}\/scan":{"post":{"tags":["Engagement"],"summary":"Register a QR interaction \u2014 the act of presence. Public. Presence is deduplicated per visitor per day (a re-flash returns 200 with newPresence:false, not a second attendance). Sets a first-party visitor cookie on the first scan and returns a short-lived `voteToken` that authorises exactly one visitor rating of this work. This is what makes attendance authenticated: without the dedup, any phone could inflate engagement on every request.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"action":{"type":"string","description":"scan|view|favorite|share|comment|contact|purchase"},"country":{"type":"string","description":"string?"},"city":{"type":"string","description":"string?"},"durationSeconds":{"type":"string","description":"int?"}}}}}}}},"\/api\/artwork\/{ref}\/visitor-rating":{"post":{"tags":["Engagement"],"summary":"A visitor rates the work they just scanned \u2014 one rating per visitor, ever. Public, but requires the `voteToken` from \/scan (send it in the body or the X-Vote-Token header): no scan, no vote. A replayed vote returns 409 already_rated instead of a second row. Weight is fixed at visitor level and cannot overweight the ArtScore. Note: a browser gives no stable hardware id, so the anchor is a cookie \u2014 clearing it or private browsing yields a new visitor; the guarantee is that a normal visitor votes once and gaming it takes deliberate effort.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"voteToken":{"type":"string","description":"string (from POST \/scan)"},"stars":{"type":"string","description":"int (1-5, required)"},"comment":{"type":"string","description":"string? (max 1000)"}}}}}}}},"\/api\/artwork\/{ref}\/review":{"post":{"tags":["Engagement"],"summary":"Attach a QUALIFIED (professional) review to an artwork. Requires an authenticated account \u2014 this is the gallerist\/critic\/buyer path, not the anonymous visitor one (see \/visitor-rating). Not deduplicated by device: a pro may legitimately review many works.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"raterType":{"type":"string","description":"visitor|collector|gallerist|critic|curator|buyer"},"stars":{"type":"string","description":"int(1-5)?"},"criteria":{"type":"string","description":"object?"},"comment":{"type":"string","description":"string?"},"proofUrl":{"type":"string","description":"string?"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/certificate\/generate":{"post":{"tags":["Provenance"],"summary":"Generate the PDF certificate of authenticity","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"artwork":{"type":"string","description":"string"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/certificate\/{serial}":{"get":{"tags":["Provenance"],"summary":"Fetch a certificate by serial","responses":{"200":{"description":"Success"}},"parameters":[{"name":"serial","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/partners\/apply":{"post":{"tags":["Partners"],"summary":"Apply as a reseller partner (gallery, cultural platform\u2026). Creates a pending application and returns a DNS TXT challenge to prove domain ownership. Public.","responses":{"200":{"description":"Success"}},"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"string"},"domain":{"type":"string","description":"string (e.g. antenne-culture.fr)"},"contactEmail":{"type":"string","description":"string"},"expectedVolume":{"type":"string","description":"int?"}}}}}}}},"\/api\/partners\/{ref}\/verify-domain":{"post":{"tags":["Partners"],"summary":"Re-check the DNS TXT challenge for a pending partner. Once proven, an admin can validate. Public.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/partners\/{ref}":{"get":{"tags":["Partners"],"summary":"Public application status for a partner (id, uuid or domain).","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/partners\/{ref}\/approve":{"post":{"tags":["Partners"],"summary":"Validate a partner: provisions a service account and a scoped API token (free, unlimited usage). Returns the token once. ROLE_ADMIN.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"force":{"type":"string","description":"bool? (skip domain proof)"}}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/partners\/{ref}\/suspend":{"post":{"tags":["Partners"],"summary":"Suspend a partner; its API token is immediately rejected. ROLE_ADMIN.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"bearerAuth":[]}]}},"\/api\/partners\/me":{"get":{"tags":["Partners"],"summary":"Current partner: profile and blockchain settings. Authenticated with the partner sk_ token.","responses":{"200":{"description":"Success"}},"security":[{"bearerAuth":[]}]}},"\/api\/qrcode\/{token}\/verify":{"get":{"tags":["Provenance"],"summary":"Verify an artwork authenticity from its QR token. Re-extracts the hidden signature and re-validates C2PA live (c2patool).","responses":{"200":{"description":"Success"}},"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}]}},"\/api\/artwork\/{ref}\/c2pa":{"get":{"tags":["Provenance"],"summary":"C2PA provenance: the recorded manifest (assertions signed at deposit) + a live re-verification with c2patool --detailed.","responses":{"200":{"description":"Success"}},"parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string"}}]}}}}