SchemaCheck/ DocsDashboard

API Reference

Parameters & Response

Complete reference for the /api/v1/validate and /api/v1/validate/batch endpoints — every request parameter and every response field.

Base URL
https://schemacheck.dev/api/v1

GET /validate

Validate all schemas on a public URL. Pass parameters as query strings — no request body needed.

bash
curl "https://schemacheck.dev/api/v1/validate?url=https://apple.com&access_key=YOUR_KEY"

Query parameters

FieldTypeDescription
urlrequiredstringThe URL to fetch and validate. Must start with http:// or https://. The page must be publicly accessible.
access_keyrequiredstringYour API key. Alternative to the x-api-key header — use whichever is more convenient for GET requests.

POST /validate

Accepts either a URL or raw JSON-LD in the request body. Use the x-api-key header for server-side calls.

Request body — URL input

bash
curl -X POST https://schemacheck.dev/api/v1/validate \
  -H "x-api-key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}'

Request body — JSON-LD input

bash
curl -X POST https://schemacheck.dev/api/v1/validate \
  -H "x-api-key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonld": {
      "@context": "https://schema.org",
      "@type": "Article",
      "headline": "My Article",
      "author": { "@type": "Person", "name": "Jane Doe" },
      "datePublished": "2026-03-18",
      "image": "https://example.com/photo.jpg"
    }
  }'

Body fields

FieldTypeDescription
urlstringThe URL to fetch and validate. Mutually exclusive with jsonld. Cached for 1 hour.
jsonldobject | arrayA JSON-LD object or array of objects. Mutually exclusive with url. Supports @graph arrays. Never cached.

Headers

FieldTypeDescription
x-api-keystringYour API key. Recommended for server-side calls. Takes precedence over access_key query param.
Content-TyperequiredstringMust be application/json.

Success response (200)

All successful responses share this shape. Fields marked optional are only present when applicable.

Top-level

FieldTypeDescription
successtrueAlways true on a 200 response.
urloptionalstringEchoed back when the request was URL-based.
schemas_foundnumberCount of JSON-LD schemas found (after @graph flattening).
schemasSchema[]Validation results — one object per schema. Empty array when none found.
summarySummaryAggregate stats across all schemas.
parse_errorsoptionalstring[]JSON parse errors from malformed <script type='application/ld+json'> blocks. Present only when at least one block failed to parse.
messageoptionalstringHuman-readable note when schemas_found is 0, explaining how to add structured data.
metaMetaRequest metadata — timing, credits, cache status.

Schema object

FieldTypeDescription
typestringThe @type value from the JSON-LD (e.g. Article, Product, Organization).
validation_depthstringDepth used to validate this type: "full" (Tier 1 — required + recommended + format checks), "standard" (Tier 2 — required + recommended), or "basic" (Tiers 3–4 — required properties only).
validbooleantrue if all required properties are present and correctly typed.
rich_result_eligiblebooleantrue if this schema meets Google's current rich result requirements.
deprecatedbooleantrue for schema types Google has retired or restricted.
deprecation_notestring|nullReason for deprecation (e.g. 'Google retired HowTo rich results in 2024.').
errorsIssue[]Validation errors — missing required properties, wrong types, etc.
warningsIssue[]Validation warnings — missing recommended properties, minor issues.
properties_foundstring[]List of property names present in the schema.
properties_missing_requiredstring[]Required properties that are absent. Non-empty means valid=false.
properties_missing_recommendedstring[]Recommended properties that are absent. Does not affect valid.
raw_jsonldobjectThe original JSON-LD object as parsed from the page.
rich_resultoptionalRichResultRich result status object. Present on all schemas.

Issue object (errors and warnings)

FieldTypeDescription
severitystringOne of "error", "warning", or "info".
propertystringThe property name that triggered this issue (e.g. datePublished, author).
messagestringHuman-readable description of the issue.
fixstringSpecific, copy-paste fix suggestion.
google_docs_urloptionalstringDirect link to the relevant Google structured data documentation.

RichResult object

FieldTypeDescription
eligiblebooleanWhether this schema qualifies for Google Rich Results.
reasonstringExplanation — what makes it eligible or why it's not.
google_docs_urlstringLink to the Google docs for this schema type's rich result requirements.

Summary object

FieldTypeDescription
total_schemasnumberTotal schema objects found and validated.
valid_schemasnumberCount with valid=true.
invalid_schemasnumberCount with valid=false.
total_errorsnumberSum of errors across all schemas.
total_warningsnumberSum of warnings across all schemas.
rich_result_eligiblenumberCount of schemas with rich_result_eligible=true.
scorenumber0–100 health score. Starts at 100, deducted for errors (÷schemas ×40) and warnings (÷schemas ×10).

Meta object

FieldTypeDescription
api_versionstringAlways "1.0".
validated_atstringISO 8601 timestamp of when validation ran.
cachedbooleantrue if the result was served from cache. Cached results cost 0 credits.
credits_usednumber0 (cached) or 1 (fresh validation).
credits_remainingnumberRemaining credits this billing period after this request.
response_time_msnumberTotal server-side time in milliseconds.

POST /validate/batch

Validate up to 50 URLs in a single API call. All URLs are processed concurrently and partial failures are tolerated — results for successful URLs are always returned even if some URLs time out or are unreachable. The entire batch counts as one API request against your rate limit; credits are charged only for URLs that validate successfully (1 credit per successful URL, 0 for cached or failed URLs).

bash
curl -X POST https://schemacheck.dev/api/v1/validate/batch \
  -H "x-api-key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "urls": [
      "https://example.com/page1",
      "https://example.com/page2",
      "https://example.com/page3"
    ]
  }'

Request body

FieldTypeDescription
urlsrequiredstring[]Array of URLs to validate. Maximum 50 per request. Each URL must start with http:// or https://. Invalid URLs are returned as failed results rather than rejecting the whole batch.

Headers

FieldTypeDescription
x-api-keyrequiredstringYour API key.
Content-TyperequiredstringMust be application/json.

Batch response (200)

The response always has HTTP 200 as long as the request itself was valid (auth passed, body was parseable, URL count was within limit). Per-URL failures are reported inside results, not as HTTP error codes.

json
{
  "success": true,
  "results": [
    {
      "url": "https://example.com/page1",
      "success": true,
      "schemas_found": 2,
      "schemas": [ /* ... Schema objects ... */ ],
      "summary": {
        "score": 87,
        "total_schemas": 2,
        "valid_schemas": 2,
        "invalid_schemas": 0,
        "total_errors": 0,
        "total_warnings": 3,
        "rich_result_eligible": 1
      }
    },
    {
      "url": "https://example.com/bad-page",
      "success": false,
      "error": "Timeout after 10s"
    }
  ],
  "meta": {
    "total_urls": 2,
    "successful": 1,
    "failed": 1,
    "credits_used": 1,
    "credits_remaining": 248,
    "total_response_time_ms": 4200
  }
}

Result item — success

FieldTypeDescription
urlstringThe URL that was validated.
successtrueAlways true for this shape.
schemas_foundnumberCount of JSON-LD schemas found on the page.
schemasSchema[]Full validation results — same Schema objects as the single /validate endpoint.
summarySummaryAggregate stats — same Summary object as the single /validate endpoint.
parse_errorsoptionalstring[]JSON parse errors from malformed script blocks. Present only when at least one block failed to parse.
messageoptionalstringHuman-readable note when schemas_found is 0.

Result item — failure

FieldTypeDescription
urlstringThe URL that failed.
successfalseAlways false for this shape.
errorstringHuman-readable failure reason. Common values: "Timeout after 10s", "URL must use http:// or https://", "Skipped — batch time budget exhausted."

Batch meta object

FieldTypeDescription
total_urlsnumberTotal number of URLs submitted in the request.
successfulnumberCount of URLs that validated without error.
failednumberCount of URLs that failed (invalid format, timeout, fetch error).
credits_usednumberTotal credits charged. One credit per successful, non-cached validation.
credits_remainingnumberRemaining credits after this batch.
total_response_time_msnumberTotal wall-clock time for the entire batch in milliseconds.
truncatedoptionalbooleantrue if the 22-second batch budget was reached before all URLs could be processed. Remaining URLs will have a 'Skipped' error.
truncated_reasonoptionalstringExplanation of why the batch was truncated. Present only when truncated is true.

Batch limits and behaviour

Max URLs50 per request. Submitting more than 50 returns HTTP 400.
Per-URL timeout10 seconds. URLs that don't respond within 10s are returned as failed results.
Batch timeout22 seconds total. If the batch budget is reached, remaining unprocessed URLs are returned as skipped. This protects against Vercel's 25s function limit.
Rate limitThe entire batch counts as 1 request against your per-minute rate limit, regardless of how many URLs are in it.
Credits1 credit per successfully validated URL. Cached results cost 0 credits. Failed and invalid URLs cost 0 credits.
CachingEach URL is checked against the cache individually (1-hour TTL). Cache hits within a batch cost 0 credits and are served instantly.
Partial failureThe batch never fails wholesale. If 3 out of 10 URLs time out, you still receive results for the 7 that succeeded.

Supported schema types

35 schema types validated against Google's current structured data requirements. Types are organised into tiers that determine validation depth.

Tier 1 — Full: Required + recommended properties, type validation, nested object checks, format validation (dates, URLs).

Tier 2 — Standard: Required + recommended properties, basic type checks.

Tiers 3–4 — Basic: Required properties only.

TypeTierRich ResultsNotes
Article1 — FullYesIncludes NewsArticle, BlogPosting subtypes
Product1 — FullYesChecks offers.price + offers.availability
LocalBusiness1 — FullYesAll subtypes (Restaurant, Store, Hotel…)
Organization1 — FullYesLogo, sameAs, contactPoint
BreadcrumbList1 — FullYesValidates itemListElement array structure
WebSite1 — FullYesSitelinks Searchbox via potentialAction
FAQPage1 — FullRestrictedGovernment/health authority sites only (2024)
Review2 — StandardYes
Recipe2 — StandardYes
Event2 — StandardYes
VideoObject2 — StandardYes
SoftwareApplication2 — StandardYes
JobPosting2 — StandardYes
Course2 — StandardYes
ItemList2 — StandardYes
QAPage2 — StandardYes
ProductGroup2 — StandardYes
Book3 — BasicYes
Dataset3 — BasicYes
DiscussionForumPosting3 — BasicYes
EmployerAggregateRating3 — BasicYes
Movie3 — BasicYes
ImageObject3 — BasicYes
ProfilePage3 — BasicYes
MerchantReturnPolicy3 — BasicYes
OfferShippingDetails3 — BasicYes
ClaimReview3 — BasicYes
MathSolver4 — BasicYes
Quiz4 — BasicYes
LoyaltyProgram4 — BasicYes
VacationRental4 — BasicYes
CreativeWork4 — BasicYes
HowToDeprecatedRetiredGoogle retired Aug 2024
SpecialAnnouncementDeprecatedRetiredRetired 2025
VehicleDeprecatedRetiredRetired 2025

Caching

TTL1 hour per URL
KeySHA-256 of lowercase, trailing-slash-stripped URL
ScopeURL requests only — jsonld inputs are never cached
CreditsCache hits cost 0 credits (credits_used: 0 in meta)
BypassNot supported — call again after TTL expiry

Rate limits

Limits are per API key, per minute (sliding window). Exceeded requests return rate_limit_exceeded (HTTP 429). Note that the batch endpoint counts as one request against this limit regardless of how many URLs are in the batch.

PlanReq / minReq / monthOverage
Free10100Hard stop — upgrade required
Basic303,000$0.008 / request
Growth6015,000$0.005 / request
Scale12075,000$0.003 / request