Skip to content

Service builder

Creates a Service with provider, coverage, offer, and review metadata. The Service builder injects @type, validates synchronously, and rejects unknown properties.

// Astro — shown first when Astro is selected
import { Service } from '@unschema-graph/astro';
// Svelte 5
import { Service } from '@unschema-graph/svelte';
// Core / Node.js
import { Service } from '@unschema-graph/core';
import { ServiceSchema } from '@unschema-graph/core';

The ServiceSchema Zod schema is also exported for composition and advanced validation.

import {
ServiceSchema,
type SchemaInput,
type SchemaOutput,
} from '@unschema-graph/core';
type ServiceInput = SchemaInput<typeof ServiceSchema>;
type ServiceOutput = SchemaOutput<typeof ServiceSchema, 'Service'>;
Property Input type Required Default / constraints
@id string No non-empty
name string Yes non-empty
provider string | Person | Organization | LocalBusiness | EntityReference No non-empty
serviceType string No —
description string No —
areaServed string | Array | object No —
offers Offer | AggregateOffer | Array<Offer | AggregateOffer> No —
aggregateRating AggregateRating No —
review Review | Array<Review> No —
termsOfService string No —

The aliases above remain the exact authority for nested object types. The builder also accepts a validation configuration as its second argument and always returns @type: 'Service'.

import { Service } from '@unschema-graph/core';
const entity = Service({
"name": "Astro consulting",
"provider": "Acme"
});
{
"@type": "Service",
"name": "Astro consulting",
"provider": {
"@type": "Organization",
"name": "Acme"
}
}
  • Passing an unknown property to the strict builder.
  • Using source data that is missing a required property.
  • Assuming valid Schema.org guarantees a search appearance.

Use Service.safeParse(input) for external data. If Schema.org supports a property that is not modeled yet, validate the entity first and then use withAdditionalProperties(). Never pass invented properties to the strict builder.