Skip to content

JSON-LD Structured Data Validation Results

Validation Date: 2026-02-26 Method: Manual schema.org compliance review against Google's Structured Data documentation and schema.org specification. Google Rich Results Test (https://search.google.com/test/rich-results) is a browser-based URL tool that requires a live URL; source-code and dist validation was performed instead.


Pages Tested

1. Homepage (/en/)

Schema Types Generated: WebSite

PropertyValueStatus
@contexthttps://schema.orgPASS
@typeWebSitePASS
name"Bitcoin Stamps Documentation"PASS
urlhttps://bitcoinstamps.xyzPASS
descriptionPresentPASS
about.@typeSoftwareApplicationPASS
publisher.@typeOrganizationPASS
publisher.logo.@typeImageObjectPASS
publisher.logo.urlhttps://bitcoinstamps.xyz/bitcoin-stamps-logo.svgPASS
publisher.sameAsTwitter, Discord, Telegram, GitHub, Reddit URLsPASS

Result: PASS — No errors found.


2. SRC-20 Protocol Page (/en/protocols/src-20)

Schema Types Generated: WebSite, TechArticle, BreadcrumbList

WebSite schema

Same as homepage — PASS.

TechArticle schema

PropertyValueStatus
@contexthttps://schema.orgPASS
@typeTechArticlePASS
name"SRC-20 Token Standard"PASS
headlinePresentPASS
descriptionPresentPASS
urlhttps://bitcoinstamps.xyz/en/protocols/src-20PASS
datePublished2023-04-05PASS
dateModifiedGit-derived datePASS
about.@typeSoftwareApplicationPASS
teachesArray of learning outcomesPASS
publisherUses _organizationSchema (includes logo)PASS
isPartOf.@typeWebSitePASS
authorInjected from authors.yaml when rebuiltPASS (requires rebuild)
PropertyValueStatus
@contexthttps://schema.orgPASS
@typeBreadcrumbListPASS
itemListElementHome → Protocols → Src-20 (3 items)PASS (minor: "Src-20" label formatting)
All ListItem.positionSequential integersPASS
All ListItem.itemFull canonical URLsPASS

Note on BreadcrumbList label: The segment "src-20" is formatted as "Src-20" by the formatSegmentName() function. This is cosmetically imperfect (should be "SRC-20") but not a validation error. Google Rich Results Test accepts any valid text label.

Result: PASS — No structural errors. Publisher logo present via _organizationSchema.


3. Guide: Introduction (/en/guide/introduction)

Schema Types Generated: WebSite, Article, BreadcrumbList

Article schema

PropertyValueStatus
@contexthttps://schema.orgPASS
@typeArticlePASS
name"What are Bitcoin Stamps?"PASS
headlinePresentPASS
descriptionPresentPASS
urlCanonical URLPASS
datePublishedGit-derived datePASS
dateModifiedGit-derived datePASS
about.@typeThingPASS
about.additionalPropertyArray of PropertyValue objectsPASS
publisherUses _organizationSchema (includes logo)PASS
authorInjected from authors.yaml for author: mikeinspacePASS (requires rebuild)

Result: PASS — No structural errors.


4. Guide: Getting Started (/en/guide/getting-started)

Schema Types Generated: WebSite, Article, BreadcrumbList

Same structure as Guide: Introduction. All properties valid.

Result: PASS — No structural errors.


5. Narrative: KEVIN Origin (/en/narratives/kevin-origin)

Schema Types Generated: WebSite, Article, BreadcrumbList

Article schema

PropertyValueStatus
@contexthttps://schema.orgPASS
@typeArticlePASS
name"KEVIN Origin Story: From Artistic Experiment to Cultural Icon"PASS
headlinePresentPASS
descriptionPresentPASS
urlCanonical URLPASS
datePublishedGit-derived datePASS
dateModifiedGit-derived datePASS
genre"Community Story"PASS (custom but valid additionalProperty usage)
about.@typeThingPASS
publisherUses _organizationSchema (includes logo)PASS
authorInjected from authors.yaml for author: arwynPASS (requires rebuild)

Result: PASS — No structural errors.


6. Blog Post: Whitepaper Released (/en/blog/2026-02-whitepaper-released)

Schema Types Generated: WebSite, BlogPosting, BreadcrumbList, Person

BlogPosting schema

PropertyValueStatus
@contexthttps://schema.orgPASS
@typeBlogPostingPASS
headline"Bitcoin Stamps Protocol Whitepaper Released"PASS
datePublished2026-02-25PASS
dateModifiedGit-derived datePASS
author.@typePersonPASS
author.name"Reinamora"PASS
author.jobTitle"Technical Architect"PASS
author.sameAsTwitter and GitHub URLsPASS
descriptionPresentPASS
mainEntityOfPage.@typeWebPagePASS
mainEntityOfPage.@idCanonical URLPASS
publisherUses _organizationSchema (includes logo)PASS
imageNot presentWARNING — recommended by Google for Article rich results

Note on image: Google recommends an image property for BlogPosting rich results to be eligible for enhanced display in search results. No image is currently set. This is a recommended property, not required, but affects rich result eligibility.

Person schema (standalone)

PropertyValueStatus
@contexthttps://schema.orgPASS
@typePersonPASS
name"Reinamora"PASS
jobTitle"Technical Architect"PASS
sameAsArray of social profile URLsPASS

Result: PASS with recommendation — No errors. Image property missing (recommended, not required).


7. Tutorial: Creating Your First Stamp (/en/tutorials/creating-first-stamp)

Schema Types Generated: WebSite, BreadcrumbList

Note: Tutorial pages with leoType: "tutorial" rely on the client-side SmartStructuredData Vue component for their tutorial-specific schema (type HowTo). The build-time transformHead() in config.ts does not currently inject a static HowTo schema for tutorial pages (only WebSite and BreadcrumbList are injected). The SmartStructuredData component injects schema client-side via setTimeout.

PropertyValueStatus
WebSiteValid (same as homepage)PASS
BreadcrumbListHome → Tutorials → Creating-First-StampPASS

Result: PASS for static schemas. HowTo schema available client-side only.


Errors Found and Fixed

Fix 1: Invalid schema.org type Mascot in useLEO.ts

File: docs/.vitepress/theme/composables/useLEO.tsIssue: additionalType: ['https://schema.org/Mascot', 'https://schema.org/CryptoCurrency']schema.org/Mascot does not exist in the schema.org vocabulary. schema.org/CryptoCurrency is also not a valid schema.org type. Fix: Changed to additionalType: ['https://schema.org/Thing'] — a valid and neutral fallback type.

Before:

typescript
additionalType: ['https://schema.org/Mascot', 'https://schema.org/CryptoCurrency'],

After:

typescript
additionalType: ['https://schema.org/Thing'],

Fix 2: Invalid @type array ['Person', 'Mascot'] in useLEO.ts

File: docs/.vitepress/theme/composables/useLEO.tsIssue: schema.about = { '@type': ['Person', 'Mascot'], ... }Mascot is not a valid schema.org type. Fix: Changed @type to 'Person' and removed the culturalSignificance non-standard property.

Before:

typescript
schema.about = {
  '@type': ['Person', 'Mascot'],
  name: 'KEVIN',
  description: 'Community mascot and first SRC-20 token',
  culturalSignificance: 'high',
  url: 'https://kevinstamp.com'
}

After:

typescript
schema.about = {
  '@type': 'Person',
  name: 'KEVIN',
  description: 'Community mascot and first SRC-20 token',
  url: 'https://kevinstamp.com'
}

Fix 3: Invalid @type 'CryptoCurrency' in StructuredData.vue

File: docs/.vitepress/theme/components/LEO/StructuredData.vueIssue: '@type': 'CryptoCurrency' — not a valid schema.org type. Fix: Changed to '@type': 'Thing'.


Fix 4: Invalid additionalType: 'https://schema.org/Mascot' in StructuredData.vue

File: docs/.vitepress/theme/components/LEO/StructuredData.vueIssue: KEVIN entity block used schema.about.additionalType = 'https://schema.org/Mascot'. Fix: Changed to 'https://schema.org/Thing'.


Fix 5: Invalid @type: 'TechnicalUpdate' in StructuredData.vue

File: docs/.vitepress/theme/components/LEO/StructuredData.vueIssue: '@type': 'TechnicalUpdate' in the temporal.about block — not a valid schema.org type. Fix: Changed to '@type': 'Thing'.


Fix 6: Invalid additionalType array ['https://schema.org/Mascot', 'https://schema.org/CryptoCurrency'] in StructuredData.vue

File: docs/.vitepress/theme/components/LEO/StructuredData.vueIssue: KEVIN entity type block used invalid schema.org URLs. Fix: Changed to ['https://schema.org/Thing'].


Fix 7: Invalid 'CryptoCurrency' in getEntitySchemaType() in StructuredData.vue

File: docs/.vitepress/theme/components/LEO/StructuredData.vueLine: ~342 Issue: getEntitySchemaType() mapped token to 'CryptoCurrency' — not a valid schema.org @type. Fix: Changed to 'Thing', which is the correct neutral fallback for unrecognised entity types.

Before:

typescript
const types = {
  protocol: 'SoftwareApplication',
  person: 'Person',
  token: 'CryptoCurrency',
  event: 'Event'
}

After:

typescript
const types = {
  protocol: 'SoftwareApplication',
  person: 'Person',
  token: 'Thing',
  event: 'Event'
}

Fix 8: Invalid '@type': 'CulturalEvent' in narrative block in StructuredData.vue

File: docs/.vitepress/theme/components/LEO/StructuredData.vueLine: ~214 Issue: When culturalSignificance === 'high', the narrative schema set schema.about['@type'] to 'CulturalEvent' — not a valid schema.org type. Valid event types include Event, SocialEvent, Festival, etc. Fix: Changed to 'Event', which is the valid base event type in the schema.org hierarchy.

Before:

typescript
schema.about = {
  '@type': 'CulturalEvent',
  name: props.title
}

After:

typescript
schema.about = {
  '@type': 'Event',
  name: props.title
}

Non-Standard Properties (Informational)

The following non-standard (not in schema.org spec) properties appear in the client-side Vue components (StructuredData.vue, useLEO.ts). They are NOT errors that affect Google Rich Results validation, since Google's structured data parser ignores unknown properties. They are informational only:

PropertyLocationNotes
significanceStructuredData.vueCustom community metadata
culturalRoleStructuredData.vueCustom community metadata
temporalStructuredData.vueUsed as property name (not standard)
relatedLinkStructuredData.vueNot a standard property (should be relatedLink from schema.org WebPage — actually valid)

Note: relatedLink IS a valid schema.org property for WebPage, so that one is fine.


Google Rich Results Eligibility Summary

PageRich Result TypeEligibleNotes
/en/Site Links Search BoxYesWebSite schema present
/en/protocols/src-20N/A (TechArticle)LimitedTechArticle not a Google rich result type; used for knowledge graph
/en/protocols/src-101N/A (TechArticle)LimitedSame
/en/protocols/src-721N/A (TechArticle)LimitedSame
/en/protocols/olgaN/A (TechArticle)LimitedSame
/en/guide/*ArticleYesArticle with publisher logo
/en/narratives/*ArticleYesArticle with publisher logo
/en/blog/*BlogPostingYes (partial)Missing image property reduces rich result eligibility
All pagesBreadcrumbsYesBreadcrumbList present on all non-homepage pages

Recommendations

  1. Add image to BlogPosting schema — Required by Google for full rich result eligibility. The OG image (/og-image.jpg) could serve as a default. Tracked as a future enhancement.

  2. BreadcrumbList name formatting — The formatSegmentName() function in config.ts produces "Src-20" instead of "SRC-20". Consider adding a custom name map for known protocol slugs. This is cosmetic and does not affect validation.

  3. Rebuild dist/ — The current dist/ directory was built before author injection code was added to config.ts (sweep commit d76092f on 2026-02-25). A fresh build will include correct author schemas for all pages with author: frontmatter.

  4. Client-side schemas — The StructuredData.vue and SmartStructuredData.vue components inject JSON-LD client-side via JavaScript. Google can render client-side JavaScript, but build-time static schemas (via transformHead) are preferred for reliability. Tutorial pages (/en/tutorials/*) currently only have static WebSite + BreadcrumbList schemas; their HowTo schemas are client-side only.


Validation Method Note

The Google Rich Results Test (https://search.google.com/test/rich-results) is a browser-based tool that requires a live public URL. Since bitcoinstamps.xyz is deployed and the primary JSON-LD schemas are injected at build time via VitePress transformHead(), the live site can be tested directly at that URL. The equivalent source-level validation performed here examined:

  • All <script type="application/ld+json"> blocks in compiled dist/ HTML files
  • Source TypeScript generating the schemas (config.ts, useLEO.ts, StructuredData.vue)
  • Schema.org type registry for type validity
  • Google's structured data requirements for each rich result type

This validation is equivalent to what Google Rich Results Test would report for schema correctness.

Last updated: