The JSON-LD Template Library: Copy-Paste Schema for 12 Pages

Access a battle-tested JSON-LD template library with copy-paste schema for 12 essential page types to achieve instant rich snippets and flawless SERP indexing.

BugViso

14 min read

Structured data implementation frequently stalls because engineering teams lack standardized, production-validated templates. Developers waste hours navigating the sprawling specifications on Schema.org, reconciling contradictory search engine documentation, or debugging malformed JSON syntax.

When structured data is implemented with missing required fields, non-standard date formats, or disconnected entity nodes, search crawlers silently reject the markup. The result is lost rich snippets, diminished click-through rates, and reduced visibility in generative search answer modules.

This production library provides battle-tested, copy-pasteable JSON-LD templates for the 12 most critical web page types. Each template conforms to Schema.org standards and Google Search Central requirements, incorporating explicit @id URI linking to construct a unified knowledge graph. For an introduction to foundational structured data concepts, review our schema markup beginner's guide.


1. Homepage: WebSite and Organization Graph

The homepage functions as the semantic anchor for your entire domain. Rather than emitting isolated blocks, wrap your WebSite and Organization entities within a single @graph array. This structure establishes brand ownership and configures your sitelinks search box in a single script.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://example.com/#organization",
      "name": "Apex Cloud Systems",
      "url": "https://example.com",
      "logo": {
        "@type": "ImageObject",
        "@id": "https://example.com/#logo",
        "url": "https://example.com/assets/logo.png",
        "caption": "Apex Cloud Systems Logo",
        "width": "512",
        "height": "512"
      },
      "sameAs": [
        "https://twitter.com/apexcloud",
        "https://linkedin.com/company/apexcloud",
        "https://github.com/apexcloud"
      ],
      "contactPoint": {
        "@type": "ContactPoint",
        "telephone": "+1-800-555-0199",
        "contactType": "customer service",
        "availableLanguage": ["English", "Spanish"]
      }
    },
    {
      "@type": "WebSite",
      "@id": "https://example.com/#website",
      "url": "https://example.com",
      "name": "Apex Cloud",
      "publisher": {
        "@id": "https://example.com/#organization"
      },
      "potentialAction": {
        "@type": "SearchAction",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://example.com/search?q={search_term_string}"
        },
        "query-input": "required name=search_term_string"
      }
    }
  ]
}
</script>

2. Technical Blog Post and Article

A robust BlogPosting or TechArticle schema must clearly attribute authorship to a verifiable Person entity and link back to the parent publisher. For detailed information on author credentials and trust signals, read our guide on Article and BlogPosting author Person schema for EEAT.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "@id": "https://example.com/blog/zero-trust-kubernetes#article",
  "isPartOf": {
    "@type": "WebPage",
    "@id": "https://example.com/blog/zero-trust-kubernetes"
  },
  "headline": "Implementing Zero-Trust Architecture in Kubernetes Clusters",
  "description": "A comprehensive engineering guide on mutual TLS, service mesh identity, and fine-grained RBAC policies.",
  "inLanguage": "en-US",
  "mainEntityOfPage": "https://example.com/blog/zero-trust-kubernetes",
  "datePublished": "2026-08-14T09:00:00Z",
  "dateModified": "2026-09-21T16:45:00Z",
  "image": {
    "@type": "ImageObject",
    "url": "https://example.com/images/zero-trust-k8s-cover.jpg",
    "width": 1200,
    "height": 630
  },
  "author": {
    "@type": "Person",
    "@id": "https://example.com/authors/marcus-vance#person",
    "name": "Marcus Vance",
    "jobTitle": "Principal Infrastructure Architect",
    "url": "https://example.com/authors/marcus-vance"
  },
  "publisher": {
    "@type": "Organization",
    "@id": "https://example.com/#organization",
    "name": "Apex Cloud Systems",
    "url": "https://example.com"
  },
  "dependencies": "Kubernetes 1.30+, Istio 1.22+"
}
</script>

3. Product Page: E-Commerce and SaaS Tiers

The Product schema unlocks star ratings, price tags, and inventory availability badges in Google Search. Ensure that offers includes a nested seller reference and uses valid ISO 4217 currency codes.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "@id": "https://example.com/products/devops-accelerator#product",
  "name": "DevOps Pipeline Accelerator",
  "image": [
    "https://example.com/images/products/accelerator-1x1.jpg",
    "https://example.com/images/products/accelerator-16x9.jpg"
  ],
  "description": "High-throughput build runner and container cache caching engine designed for enterprise CI pipelines.",
  "sku": "DPA-2026-ENT",
  "mpn": "928374-A",
  "brand": {
    "@type": "Brand",
    "name": "Apex Cloud Systems"
  },
  "offers": {
    "@type": "AggregateOffer",
    "priceCurrency": "USD",
    "lowPrice": "49.00",
    "highPrice": "499.00",
    "offerCount": "3",
    "availability": "https://schema.org/InStock",
    "seller": {
      "@type": "Organization",
      "@id": "https://example.com/#organization"
    }
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.8",
    "reviewCount": "87",
    "bestRating": "5",
    "worstRating": "1"
  }
}
</script>

4. FAQ Page: Structured Accordions and Q&A

The FAQPage schema informs search engines and retrieval-augmented LLM search engines about direct question-and-answer pairs. To explore how FAQ schema impacts generative engine visibility, consult our breakdown on FAQPage schema for SERP accordions and AI citations.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Does the pipeline accelerator support self-hosted runners?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes, our agent can be deployed to bare-metal Kubernetes, AWS EKS, or Google GKE clusters using a single Helm chart command."
      }
    },
    {
      "@type": "Question",
      "name": "What encryption standards are enforced for cached build artifacts?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "All intermediate build artifacts and cached layers are encrypted in transit via TLS 1.3 and at rest using AES-256-GCM encryption."
      }
    }
  ]
}
</script>

5. Local Business: Branch Office or Headquarters

For multi-location brick-and-mortar operations or regional consulting offices, explicit geo-coordinates and structured opening hours prevent directory discrepancies.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "@id": "https://example.com/locations/seattle#business",
  "name": "Apex Cloud Systems - Seattle Technical Center",
  "image": "https://example.com/images/seattle-office.jpg",
  "url": "https://example.com/locations/seattle",
  "telephone": "+1-206-555-0144",
  "priceRange": "$$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "1201 3rd Ave, Suite 2200",
    "addressLocality": "Seattle",
    "addressRegion": "WA",
    "postalCode": "98101",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 47.6074,
    "longitude": -122.3365
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "08:30",
      "closes": "17:30"
    }
  ]
}
</script>

6. Event: In-Person, Virtual, or Hybrid Gatherings

Whether conducting a technical conference or a remote engineering webinar, provide clear start dates, end dates, and virtual streaming endpoints.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Event",
  "@id": "https://example.com/events/2026-edge-summit#event",
  "name": "Next-Gen Edge Computing Architecture 2026",
  "startDate": "2026-10-18T10:00:00-07:00",
  "endDate": "2026-10-18T16:00:00-07:00",
  "eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
  "eventStatus": "https://schema.org/EventScheduled",
  "location": {
    "@type": "VirtualLocation",
    "url": "https://example.com/live/edge-summit-2026"
  },
  "image": "https://example.com/images/events/edge-summit-card.jpg",
  "description": "Deep-dive engineering summit covering WASM execution at edge points of presence, latency reduction, and distributed databases.",
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/events/2026-edge-summit/register",
    "price": "0",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "validFrom": "2026-07-01T00:00:00Z"
  },
  "organizer": {
    "@type": "Organization",
    "@id": "https://example.com/#organization"
  }
}
</script>

7. Course: Technical Curriculums and Certifications

Educational platforms and SaaS academies can structure training materials using Course and CourseInstance schema to capture interactive course carousels.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Course",
  "@id": "https://example.com/academy/ebpf-networking#course",
  "name": "Mastering eBPF for Linux Network Performance",
  "description": "Advanced kernel tracing, packet filtering, and runtime security monitoring using modern eBPF toolchains.",
  "provider": {
    "@type": "Organization",
    "@id": "https://example.com/#organization"
  },
  "hasCourseInstance": {
    "@type": "CourseInstance",
    "courseMode": "online",
    "courseWorkload": "PT8H",
    "instructor": {
      "@type": "Person",
      "name": "Dr. Aris Thorne",
      "jobTitle": "Linux Kernel Engineer"
    }
  },
  "offers": {
    "@type": "Offer",
    "price": "199.00",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock"
  }
}
</script>

8. Recipe: Cooking, Formulations, and Culinary Procedures

Food blogs and lifestyle platforms require detailed nutritional attributes, cooking times, and structured step sequences to qualify for Google Recipe rich cards.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Recipe",
  "@id": "https://example.com/recipes/sourdough-boule#recipe",
  "name": "Slow-Fermented Artisan Sourdough Boule",
  "image": [
    "https://example.com/images/recipes/sourdough-16x9.jpg",
    "https://example.com/images/recipes/sourdough-1x1.jpg"
  ],
  "author": {
    "@type": "Person",
    "name": "Claire Dupont"
  },
  "datePublished": "2026-05-10",
  "prepTime": "PT30M",
  "cookTime": "PT45M",
  "totalTime": "PT24H",
  "recipeYield": "1 loaf (800g)",
  "recipeCategory": "Bread",
  "recipeCuisine": "French",
  "nutrition": {
    "@type": "NutritionInformation",
    "calories": "210 calories",
    "carbohydrateContent": "42 grams"
  },
  "recipeIngredient": [
    "500g unbleached bread flour",
    "375g filtered water (75% hydration)",
    "100g active sourdough starter",
    "10g fine sea salt"
  ],
  "recipeInstructions": [
    {
      "@type": "HowToStep",
      "name": "Autolyse",
      "text": "Combine flour and water; rest covered for 60 minutes.",
      "url": "https://example.com/recipes/sourdough-boule#step1"
    },
    {
      "@type": "HowToStep",
      "name": "Bulk Fermentation",
      "text": "Incorporate levain and salt. Perform 4 sets of stretch-and-folds spaced 30 minutes apart.",
      "url": "https://example.com/recipes/sourdough-boule#step2"
    }
  ]
}
</script>

9. VideoObject: Video Hosting, Streams, and Key Moments

Embedding VideoObject enables search engines to display video thumbnails and interactive timeline timestamps directly within search snippets.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "VideoObject",
  "@id": "https://example.com/videos/database-sharding#video",
  "name": "Database Sharding Patterns Explained in 10 Minutes",
  "description": "Visualizing range-based vs hash-based horizontal partitioning strategies for PostgreSQL clusters.",
  "thumbnailUrl": [
    "https://example.com/thumbnails/sharding-16x9.jpg",
    "https://example.com/thumbnails/sharding-4x3.jpg"
  ],
  "uploadDate": "2026-07-22T14:00:00Z",
  "duration": "PT10M25S",
  "contentUrl": "https://example.com/media/sharding-explained.mp4",
  "embedUrl": "https://example.com/embed/sharding-explained",
  "hasPart": [
    {
      "@type": "Clip",
      "name": "Range Partitioning Bottlenecks",
      "startOffset": 120,
      "endOffset": 270,
      "url": "https://example.com/videos/database-sharding?t=120"
    },
    {
      "@type": "Clip",
      "name": "Consistent Hashing Ring Architecture",
      "startOffset": 271,
      "endOffset": 580,
      "url": "https://example.com/videos/database-sharding?t=271"
    }
  ]
}
</script>

10. Person: Executive, Engineer, and Author Entity Profile

Individual profile pages, author archives, and speaker dossiers should clearly express subject-matter authority using knowsAbout, alumniOf, and external verification links (sameAs).

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Person",
  "@id": "https://example.com/team/elena-rostova#person",
  "name": "Elena Rostova",
  "jobTitle": "Chief Technology Officer",
  "worksFor": {
    "@type": "Organization",
    "@id": "https://example.com/#organization"
  },
  "url": "https://example.com/team/elena-rostova",
  "image": "https://example.com/images/team/elena-rostova-headshot.jpg",
  "sameAs": [
    "https://www.wikidata.org/wiki/Q115892341",
    "https://github.com/erostova",
    "https://scholar.google.com/citations?user=erostova"
  ],
  "knowsAbout": [
    "Distributed Consensus",
    "Raft Protocol",
    "High-Performance Computing",
    "Kernel Network Virtualization"
  ],
  "alumniOf": {
    "@type": "CollegeOrUniversity",
    "name": "University of Washington",
    "sameAs": "https://en.wikipedia.org/wiki/University_of_Washington"
  }
}
</script>

11. Organization: Corporate Identity and Trust Signals

Standalone /about or /company pages should provide unambiguous business registration data, tax identifiers (DUNS, LEI), and social entity graphs.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Corporation",
  "@id": "https://example.com/#organization",
  "name": "Apex Cloud Systems, Inc.",
  "legalName": "Apex Cloud Systems Incorporated",
  "url": "https://example.com",
  "logo": "https://example.com/assets/brand-mark.png",
  "foundingDate": "2021-04-15",
  "founders": [
    {
      "@type": "Person",
      "name": "Marcus Vance"
    }
  ],
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "1201 3rd Ave, Suite 2200",
    "addressLocality": "Seattle",
    "addressRegion": "WA",
    "postalCode": "98101",
    "addressCountry": "US"
  },
  "duns": "081293847",
  "taxID": "XX-XXXXXXX",
  "sameAs": [
    "https://www.crunchbase.com/organization/apex-cloud-systems",
    "https://en.wikipedia.org/wiki/Apex_Cloud_Systems",
    "https://twitter.com/apexcloud"
  ]
}
</script>

12. HowTo: Step-by-Step Technical Guides and Manuals

When documenting configuration sequences, physical assembly, or step-by-step procedures, use HowTo schema to surface structured stages in search snippets.

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "@id": "https://example.com/guides/rotate-tls-certs#howto",
  "name": "How to Zero-Downtime Rotate Kubernetes Ingress TLS Certificates",
  "description": "Step-by-step procedure for rotating cluster wildcard TLS certificates with zero connection drops using Cert-Manager and Envoy dynamic reload.",
  "totalTime": "PT15M",
  "supply": [
    {
      "@type": "HowToSupply",
      "name": "Valid TLS Private Key and Fullchain Certificate"
    }
  ],
  "tool": [
    {
      "@type": "HowToTool",
      "name": "kubectl CLI tool v1.28+"
    }
  ],
  "step": [
    {
      "@type": "HowToStep",
      "name": "Prepare Secret Manifest",
      "text": "Encode the newly issued certificate and key into a staging Kubernetes Secret manifest.",
      "url": "https://example.com/guides/rotate-tls-certs#step1"
    },
    {
      "@type": "HowToStep",
      "name": "Apply Patch via Kubectl",
      "text": "Execute 'kubectl apply -f ingress-tls-secret.yaml' to update the active secret in the production namespace.",
      "url": "https://example.com/guides/rotate-tls-certs#step2"
    },
    {
      "@type": "HowToStep",
      "name": "Verify Ingress Reload",
      "text": "Inspect ingress controller access logs to verify that Envoy has dynamically reloaded the TLS context without terminating active TCP sessions.",
      "url": "https://example.com/guides/rotate-tls-certs#step3"
    }
  ]
}
</script>

For guidelines on breadcrumb structures to accompany these page types, see our guide on BreadcrumbList schema JSON-LD implementation.


Validation and Hygiene Matrix

Review this checklist to ensure your JSON-LD payloads comply with search engine specifications:

Page TypeRequired FieldsCommon Syntax & Semantic Gotchas
Homepagename, urlDeclaring SearchAction across every internal sub-page rather than exclusively on root homepage
TechArticleheadline, image, datePublishedMissing author person entity or passing empty strings for dateModified
Productname, offers or aggregateRatingSupplying formatted currency symbols in price (use "49.00", not "$49")
FAQPagemainEntity (Question array)Injecting promotional marketing text rather than authentic question-and-answer pairs
LocalBusinessname, addressOmitting postalCode or supplying invalid geocoordinates
Eventname, startDate, locationFailing to provide timezone offsets in ISO 8601 timestamps (causes UTC default shifts)
Coursename, description, providerApplying markup to single unstructured blog posts lacking educational milestones
Recipename, image, ingredientsOmitting ISO 8601 formatting on durations (e.g., writing "45 mins" instead of "PT45M")
VideoObjectname, thumbnailUrl, uploadDateThumbnail image resolutions below 160x90 pixels
PersonnameFailing to link known social entities or academic profiles in sameAs
Organizationname, urlBroken logo URL links returning 404 status codes
HowToname, stepSteps missing textual instructions or providing incomplete URLs

Automated Validation: CI/CD Quality Assurance Script

To prevent broken schema deployments, incorporate automated validation into your build pipeline. The following Python script scans static build directories, parses every embedded JSON-LD script, and verifies conformance against expected properties:

python
#!/usr/bin/env python3
"""
validate_schema_library.py - Automated CI audit verifying JSON-LD templates.
Traverses static HTML output directories and enforces strict Schema.org standards.
"""

import os
import sys
import json
from pathlib import Path
from bs4 import BeautifulSoup

def validate_node(node: dict, path_str: str) -> list:
    errors = []
    node_type = node.get("@type")
    
    if not node_type:
        return [f"[{path_str}] Schema node missing '@type' declaration."]
        
    # Check Price formatting in Product Offers
    if node_type in ["Offer", "AggregateOffer"]:
        price = node.get("price")
        if price and any(char in str(price) for char in ["$", "€", "£"]):
            errors.append(f"[{path_str}] Offer price contains forbidden currency symbol: '{price}'")
            
    # Check ISO 8601 durations in Recipe and Course
    if node_type == "Recipe":
        for dur in ["prepTime", "cookTime", "totalTime"]:
            val = node.get(dur)
            if val and not val.startswith("P"):
                errors.append(f"[{path_str}] Recipe {dur} ('{val}') must follow ISO 8601 duration format (e.g. PT30M)")
                
    # Check Event dates
    if node_type == "Event":
        start = node.get("startDate", "")
        if "T" in start and not ("+" in start or "-" in start[10:] or start.endswith("Z")):
            errors.append(f"[{path_str}] Event startDate ('{start}') lacks explicit UTC offset or 'Z' timezone.")
            
    # Recurse children
    for k, v in node.items():
        if isinstance(v, dict):
            errors.extend(validate_node(v, path_str))
        elif isinstance(v, list):
            for item in v:
                if isinstance(item, dict):
                    errors.extend(validate_node(item, path_str))
                    
    return errors

def audit_directory(build_dir: str) -> bool:
    html_files = list(Path(build_dir).rglob("*.html"))
    if not html_files:
        print(f"Warning: No HTML files found under '{build_dir}'")
        return True
        
    total_errors = []
    for html_file in html_files:
        try:
            with open(html_file, "r", encoding="utf-8") as f:
                soup = BeautifulSoup(f.read(), "html.parser")
                
            scripts = soup.find_all("script", type="application/ld+json")
            for script in scripts:
                if not script.string:
                    continue
                try:
                    payload = json.loads(script.string)
                    if isinstance(payload, dict):
                        if "@graph" in payload:
                            for item in payload["@graph"]:
                                total_errors.extend(validate_node(item, str(html_file)))
                        else:
                            total_errors.extend(validate_node(payload, str(html_file)))
                    elif isinstance(payload, list):
                        for item in payload:
                            total_errors.extend(validate_node(item, str(html_file)))
                except json.JSONDecodeError as err:
                    total_errors.append(f"[{html_file}] Invalid JSON syntax: {err}")
        except Exception as e:
            total_errors.append(f"[{html_file}] File read error: {e}")
            
    if total_errors:
        print(f"\nSCHEMA AUDIT FAILED: {len(total_errors)} issue(s) detected:")
        for err in total_errors:
            print(f"  ✗ {err}")
        return False
        
    print(f"\nSCHEMA AUDIT PASSED: Audited {len(html_files)} files cleanly.")
    return True

if __name__ == "__main__":
    target = sys.argv[1] if len(sys.argv) > 1 else "./dist"
    success = audit_directory(target)
    sys.exit(0 if success else 1)

Run this check within your continuous integration workflow to guarantee error-free schema deployments:

bash
# Execute within CI container prior to release
chmod +x scripts/validate_schema_library.py
python3 scripts/validate_schema_library.py ./dist

For practical steps on securing rich results, review our blueprint on how to earn rich snippets with our schema implementation guide.


Automated Enterprise Auditing with BugViso

Manual schema testing with browser extensions or one-off web inspectors fails to maintain data integrity at scale. Changes to component templates, headless CMS schemas, or product databases can introduce subtle syntax defects across thousands of production pages.

The BugViso auditing platform provides automated, continuous monitoring of your entire structured data ecosystem. Powered by a dual-engine headless architecture combining Lightpanda and Playwright with high-speed Redis queue workers, BugViso:

  1. Extracts Dynamic JSON-LD: Crawls client-hydrated single-page applications and server-rendered HTML alike, executing full JavaScript rendering pipelines.
  2. Evaluates Schema Syntax: Validates all 12 page types against official Schema.org standards, identifying missing required properties, invalid date serializations, and malformed currency entries.
  3. Inspects Entity Graph Continuity: Maps @id cross-references across entities to verify that authors, products, and articles correctly anchor back to the parent organization.
  4. Calculates Impact Scores: Correlates structured data validity with crawl depth and search performance to help your engineering team prioritize high-impact schema fixes.

Deploying standardized, syntax-validated structured data across your primary page templates ensures your digital assets are interpreted with complete accuracy by both traditional search algorithms and generative AI agents.

Audit your production templates for structured data defects and ensure complete Schema.org compliance across all page types by initiating a comprehensive website crawl with BugViso.

Found this useful? Share it.

See where your site stands

Run a free BugViso audit for SEO, speed, accessibility and AI search readiness — with fixes you can ship today.