For artists and their web developers · record format v1
To sign a work, you share the link to its page with the signing app. The app reads the page, shows you a draft record, and after you confirm, freezes it: the tag carries a fingerprint of that exact record. This page says what the app looks for, so your pages produce complete records without retyping.
The app creates your signing key from 12 words that never leave your phone. To show visitors that the key is really yours, put one line on your own website. In the app: Settings → Register as artist shows it:
artfirma-key=9974b7731089acdc5569…
_artfirma.example.com with that line as its value,example.com/pages/artfirma containing it (Shopify: Online Store → Pages → Add page,
title “artfirma”). /.well-known/artfirma.txt and /artfirma.txt work too.Then tap Check & register. Verification pages show “key confirmed by example.com” next to your name. The site is checked once, at registration: after that you can delete the page or the DNS record. The registration, and every tag you sign, stay valid.
…/products/contact-states-xii-film-009-020 → contact-states-xii-film-009-020.
Allowed: lowercase letters, digits and hyphens, up to 64 characters (other characters are converted).VisualArtwork (preferred)Add a JSON-LD block to the page. Search engines read it too, so it is worth having anyway.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "VisualArtwork",
"name": "Night Field",
"creator": { "@type": "Person", "name": "Ana Ruiz" },
"dateCreated": "2025",
"artform": "Painting",
"artMedium": "oil on linen",
"size": "100 × 80 cm",
"image": "https://example.com/images/night-field.jpg"
}
</script>
The block may also sit inside an @graph array. image may be a URL, an
ImageObject with url or contentUrl, or a list (the first is used).
| Record field | Example |
|---|---|
| id required | night-field |
| title required | Night Field |
| artist required | Ana Ruiz |
| photo required | JPEG, PNG or WebP, ≥ 1200 px long side |
| year | 2025 |
| artform | Painting |
| medium | oil on linen |
| size | 100 × 80 cm |
| series | from the 'Fields' series |
| notes | signed and dated verso |
| statement | short text about the work |
| source | for people; never used for checking |
Every field can be corrected in the draft before you confirm. Missing optional fields are simply left out.
Where each field comes from is not hard-coded: the app and our tools read the same file,
sources.json. Sources are tried in this order; a field is taken from the first one
that gives a value. The table below is generated from that file. New sites are added there, and the app picks the
update up within a day, without a new version.
| # | Source | Used when | Fields |
|---|---|---|---|
| 1 | schema.org VisualArtwork (JSON-LD) | JSON-LD VisualArtwork | title ← JSON-LD nameartist ← JSON-LD creator.nameyear ← JSON-LD dateCreatedartform ← JSON-LD artformmedium ← JSON-LD artMediumsize ← JSON-LD sizeimageUrl ← JSON-LD image.url|contentUrl |
| 2 | Artlogic CMS (galleries and artist sites) | meta generator matching ^[Aa]rtlogic\b | artist ← h1.artist without #artist_yearstitle ← .subtitle .titleyear ← .subtitle .year matching ^((?:19|20)[0-9]{2})$medium ← .detail_view_module_artwork_caption .medium or .mediumsize ← .detail_view_module_artwork_caption .dimensions or .dimensionsnotes ← .edition_details + .signed_and_dated + .signedstatement ← left empty |
| 3 | Shopify product (/products/<handle>.json): vendor and short description lines | a Shopify product page | artist ← Shopify product vendor matching ^(.* .*)$description lines (also split at “|”): year ← line matching ^(19|20)[0-9]{2}$size ← line matching ^(?=.{1,60}$).*[0-9]+(?:[.,][0-9]+)? ?(?:cm|mm|inches|in|"|″|”)? ?(?:\([a-z]+\) ?)?[x×] ?[0-9]+(?:[.,][0-9]+)? ?(?:cm|mm|inches|in|"|″|”)(?![a-z]) (any case)medium ← line matching ^(?=.{1,80}$)(?:original[ ,]+)?(?:oil|acrylic|mixed media|watercolou?r|gouache|ink|charcoal|pastel|tempera|encaustic|graphite|pencil|spray paint|enamel|collage)\b.*\b(?:on|over)\b (any case), then ^(?:[Oo]riginal[ ,]+)?(.+)$notes ← line matching ^(?=.{1,60}$)signed\b (any case) |
| 4 | Squarespace (7.0 and 7.1 product pages): title, description, size and medium from the description text | meta og:image matching \bsquarespace(?:-cdn)?\.com/ | title ← h1.product-titleartist ← meta og:site_name matching ^(.+?)(?: [|–—] .*)?$size ← .product-excerpt or .product-description matching ([0-9]+(?:[.,][0-9]+)? ?(?:cm|mm|inches|in|"|″|”)? ?[x×] ?[0-9]+(?:[.,][0-9]+)?(?: ?(?:cm|mm|inches|in|"|″|”)? ?[x×] ?[0-9]+(?:[.,][0-9]+)?)? ?(?:cm|mm|inches|in|"|″|”))(?![a-z])medium ← .product-excerpt or .product-description matching \b((?:[Oo]il|[Aa]crylic|[Mm]ixed media|[Ww]atercolou?r|[Gg]ouache|[Ii]nk|[Cc]harcoal|[Pp]astel|[Tt]empera|[Ee]ncaustic|[Gg]raphite|[Pp]encil|[Ss]pray paint|[Ee]namel|[Cc]ollage)(?: and [a-z]+)? on [A-Za-z ]+?)(?=[.,;]|$)notes ← .product-excerpt or .product-description matching \b([Ss]igned(?: and [a-z]+)?)\bstatement ← .product-excerpt or .product-descriptionimageUrl ← .product-gallery-slides-item-image[data-image] or #productSlideshow img[data-image] |
| 5 | Open Graph | any page | title ← meta og:titleimageUrl ← meta og:imageartist ← meta og:site_namestatement ← meta og:description |
| 6 | Shopify product (when the page itself gives nothing) | a Shopify product page | title ← Shopify product titleartist ← Shopify product vendorimageUrl ← Shopify product images.src |
Open Graph tags are enough for a minimal record (title, artist, photo, statement):
<meta property="og:title" content="Night Field">
<meta property="og:site_name" content="Ana Ruiz">
<meta property="og:image" content="https://example.com/images/night-field.jpg">
<meta property="og:description" content="Oil on linen, 2025.">
Shopify stores need nothing extra: the app also reads the product's public /products/<handle>.json: the vendor (when it is a person's name) and short description lines such as 2026, Oil on canvas, 100 x 80 cm, Signed lower right. One fact per line (or separated by |) is read best; longer text stays in the description you can keep.
Artlogic pages (galleries' and artists' sites built on Artlogic CMS) and Squarespace product pages are recognised automatically; see Supported sources. On Squarespace, put the size and medium in the product description, e.g. 100 x 80 cm, oil on canvas.
What exists today: one product page at a time, shared to the app (or typed in); no collection import, no webhook, no signing from a computer yet. A whole edition can be signed from one record: tap Sign seal again for each seal.
Share the page link with the signing app. The draft shows which fields were found; empty ones mean the page does not provide them in a form listed above.