How is a salary range and pay period represented in JobPosting?

The Citead team, updated

In short. Use baseSalary with MonetaryAmount and QuantitativeValue to encode currency, a salary value or range, and its pay period.

Definition: JobPosting salary markup places baseSalary on a job posting and represents the pay as a MonetaryAmount. The amount contains a currency and a QuantitativeValue, whose value or minValue and maxValue express the pay and whose unitText identifies the pay period.

Key facts

  • Google's JobPosting structured data documentation defines baseSalary as a MonetaryAmount, describes it as the actual salary supplied by the employer, and says that only employers can provide it.
  • The same documentation uses value for one salary, minValue and maxValue for a salary range, and lists HOUR, DAY, WEEK, MONTH, and YEAR as case-sensitive unitText values.
  • Schema.org describes MonetaryAmount as a monetary value or range and defines currency as the currency in which the amount is expressed.
  • Schema.org describes QuantitativeValue as a point value or interval and defines unitText as text indicating the unit of measurement.

How is the salary value nested?

The baseSalary property holds a MonetaryAmount. Put the currency on that object. Its value property holds a QuantitativeValue, which carries the amount and the pay period. Schema.org's definition of MonetaryAmount covers both a monetary value and a range, while its currency property identifies the currency of that amount.

For one amount, the nested value can contain a numeric value. For a range, the QuantitativeValue contains minValue and maxValue instead. Google's example uses this structure:

"baseSalary": {
  "@type": "MonetaryAmount",
  "currency": "USD",
  "value": {
    "@type": "QuantitativeValue",
    "minValue": 40.00,
    "maxValue": 50.00,
    "unitText": "HOUR"
  }
}

How is the pay period written?

unitText is a text property of QuantitativeValue. Schema.org says it indicates the unit of measurement and is useful when a standard unitCode cannot be provided. Google specifies five case-sensitive strings for this field: HOUR, DAY, WEEK, MONTH, and YEAR. Use the string that matches the period shown for the salary. The Google example pairs USD with HOUR and a numeric range.

The currency and period describe different parts of the value. currency belongs to MonetaryAmount; unitText belongs to the nested QuantitativeValue. This placement follows the structure shown in Google's salary range example.

What should an employer check before publishing?

Google describes baseSalary as the actual base salary provided by the employer and says that only employers can provide the property. The markup therefore needs to represent the employer's published salary information. For a single amount, use value; for a range, use both minValue and maxValue. Keep the currency on MonetaryAmount and use one of Google's case-sensitive period values in unitText.

FAQ

Can baseSalary contain a salary range?

Yes. Google's JobPosting documentation says to define minValue and maxValue rather than one value when specifying a salary range.

Which pay period values does Google document?

Google lists the case-sensitive values HOUR, DAY, WEEK, MONTH, and YEAR for unitText.

Where do currency and unitText go?

Put currency on the MonetaryAmount. Put unitText inside its nested QuantitativeValue, alongside value or the range bounds.

Who can provide baseSalary?

Google's documentation says that only employers can provide baseSalary, which it describes as the actual base salary for the job.

Sources

  1. Google Search Central, "Job posting (JobPosting) structured data for Job Search", 2026-09-08
  2. Schema.org, "MonetaryAmount - Schema.org Type", undated
  3. Schema.org, "QuantitativeValue - Schema.org Type", undated

Check how a page reads to answer engines. Open the GEO score analyzer

Test a page and see what to fix first

The analysis usually takes less than 10 seconds and needs no account.

400,000+ pages scored in the public benchmark