Estimated salary

Occupation structured data allows salary estimate providers to define salary ranges and region-based salary averages for job types, details about the occupation such as typical benefits, qualifications, and educational requirements. OccupationAggregationByEmployer structured data allows salary estimate providers to aggregate occupations by factors such as experience levels or hiring organization.

Estimated salaries can appear in the job experience on Google Search and as a salary estimate rich result for a given occupation.

Estimated salary information in the job experience on Google Search

How to add structured data

Structured data is a standardized format for providing information about a page and classifying the page content. If you’re new to structured data, you can learn more about how structured data works.

Here's an overview of how to build, test, and release structured data. For a step-by-step guide on how to add structured data to a web page, check out the structured data codelab.

  1. Add the required properties. For information about where to put structured data on the page, watch JSON-LD structured data: Where to insert on the page.
  2. Follow the guidelines.
  3. Validate your code using the Rich Results Test.
  4. Deploy a few pages that include your structured data and use the URL Inspection tool to test how Google sees the page. Be sure that your page is accessible to Google and not blocked by a robots.txt file, the noindex tag, or login requirements. If the page looks okay, you can ask Google to recrawl your URLs.
  5. To keep Google informed of future changes, we recommend that you submit a sitemap. You can automate this with the Search Console Sitemap API.

Examples

Occupation example

The following JSON-LD example shows a simple Occupation with salary estimate data:


<html>
  <head>
    <title>Software Developer, Applications</title>
    <script type="application/ld+json">
    {
      "@context": "https://schema.org/",
      "@type": "Occupation",
      "name": "Software Developer, Applications",
      "mainEntityOfPage": {
        "@type": "WebPage",
        "lastReviewed": "2017-07-23T14:20:00-05:00"
      },
      "description": "Develops information systems by designing, developing, and installing software solutions",
      "estimatedSalary": [
        {
          "@type": "MonetaryAmountDistribution",
          "name": "base",
          "currency": "USD",
          "duration": "P1Y",
          "percentile10": "100000.5",
          "percentile25": "115000",
          "median": "120000.28",
          "percentile75": "130000",
          "percentile90": "150000"
        }
      ],
      "occupationLocation": [
        {
          "@type": "City",
          "name": "Mountain View"
        }
      ]
    }
    </script>
  </head>
  <body>
  </body>
</html>

Occupation Aggregation by Employer example

The following JSON-LD example shows a more complex example of OccupationAggregationByEmployer with salary estimate data:

<html>
  <head>
    <title>App/Web App Developer</title>
    <script type="application/ld+json">
    {
      "@context": "http://schema.googleapis.com/",
      "@type": "OccupationAggregationByEmployer",
      "name": "App/Web App Developer",
      "mainEntityOfPage": {
        "@type": "WebPage",
        "lastReviewed": "2017-07-23T14:20:00-05:00"
      },
      "description": "Develops information systems by designing, developing, and installing software solutions.",
      "estimatedSalary": [
        {
          "@type": "MonetaryAmountDistribution",
          "name": "base",
          "currency": "USD",
          "duration": "P1Y",
          "percentile10": "100000.5",
          "percentile25": "115000",
          "median": "120000.28",
          "percentile75": "130000",
          "percentile90": "150000"
        },
        {
          "@type": "MonetaryAmountDistribution",
          "name": "bonus",
          "currency": "USD",
          "duration": "P1Y",
          "percentile10": "10000",
          "percentile25": "20000",
          "median": "25000",
          "percentile75": "27000",
          "percentile90": "60000"
        }
      ],
      "occupationLocation": [
        {
          "@type": "State",
          "name": "Oregon"
        },
        {
          "@type": "State",
          "name": "Washington"
        },
        {
          "@type": "State",
          "name": "California"
        }
      ],
      "hiringOrganization": {
        "@type": "Organization",
        "name": "Google LLC"
      },
      "sampleSize":1000,
      "industry": "Technology",
      "jobBenefits": "6 weeks paid vacation every year",
      "yearsExperienceMin": 3,
      "yearsExperienceMax": 7
    }
    </script>
  </head>
  <body>
  </body>
</html>

Guidelines

You must follow the general structured data quality guidelines and technical guidelines. In addition, the following guidelines apply to Occupation structured data:

Technical guidelines

  • Occupation structured data is standalone data. It does not need to be associated with any other structured data that you provide to Google.
  • Add only a single Occupation or OccupationAggregationByEmployer to a web page. Don't add more than one of these type definitions per page.
  • Make sure your structured data is consistent with what you show on the page. Here are some examples:
    • You only show the median salary on your page to users, and your structured data only includes those values.
    • You round your yearly salary to the nearest five-thousandth on your page, and you provide the same granularity in the structured data.
  • Most properties should occur only once in a definition, unless otherwise specified.
  • For occupations with different characteristics based on location (for example, the salary range in the US Northeast might be different than one for the Mid-West), create separate web page, each with its own Occupation definition that specifies a different occupationLocation.
  • Don't add salary estimate structured data to listing pages (pages that show a list of occupations).
  • When your pages change, update your sitemaps on a daily basis.

Content guidelines

  • Group similar occupation titles when all jobs have similar salary ranges and descriptions. Occupation titles should be specific, but not too specific that it becomes confusing. Here are some examples:
    • Don't be too broad:

      Not recommended: "Clinical, Counseling, and School Psychologists"

      Recommended: "School Counselor", "Clinical Psychologist", "Clinical Therapist", "Doctor of Psychology"

    • Don't be too specific:

      Not recommended: "Home Health Registered Nurse" and "Registered Nurse (RN)" and "RN - Registered Nurse - Home Health - Travel Nurse"

      Recommended: "Registered Nurse"

Structured data type definitions

This section describes the structured data types related to salary estimates.

You must include the required properties for your content to be eligible for display the job experience on Google and rich results. You can also include the recommended properties to add more information about your content, which could provide a better user experience.

Occupation

The Occupation type defines information about a job, such as the estimated salary, skills required, and responsibilities. The full definition of Occupation is available at schema.org/Occupation.

Required properties
estimatedSalary

Array of MonetaryAmountDistribution

The estimated salary for this occupation in the given occupationLocation. You should specify a salary range or salary estimates based on the percentile rank.

To account for base salary, bonuses, and other forms of monetary compensation, define multiple salaries within the estimatedSalary array. You must specify the base salary. Other types of compensation are optional.

estimatedSalary.duration

Duration

The period of time that it takes to earn the estimated salary in ISO 8601 date format. For example, if the estimated salary is earned over the course of one year, use P1Y for duration.

estimatedSalary.name

Text

The type of value. You must specify the base salary. Other types of compensation are optional. For example, "Base", "Bonus", "Commission".

name

Text

The title of the occupation. This property allows free-form text. For example, "Software Engineer".

Best practices:

  • This property should be the title of the occupation only.
  • Don't include job codes, addresses, dates, salaries, or company names in the name property.

    Not recommended: Apply now for IT job -FRENCH speaker in Bucharest

    Recommended: Market Specialist, French speaker

  • Provide concise, readable titles.
  • Don't overuse special characters such as "!" and "*". Abusing special characters might cause your markup to be considered as Spammy Structured Markup. Numbers and characters such as "/" and "-" are acceptable.

    Not recommended: *** WAREHOUSE HIRING NOW!! ON A BUS ROUTE!! ***

    Recommended: Shipping and Receiving Warehouse Associate

occupationLocation

Array of City, State, or Country

The place for which this occupational description applies. Define the location at the city, state, or country level on the one Name property if specifying for a single location.

Best practices:

  • The location should not be any more specific than the city.
  • The State property accepts region names if your country does not specify a state.
  • The value of occupationLocation is the location in which the occupation actually takes place, not the location where the salary estimate listing was created.
  • If a single Occupation type has multiple locations, specify the locations in the occupationLocation array, as the following example shows.
  • Data such as salary ranges, educational requirements, and qualifications for the occupation frequently varies based on location. To represent this, define multiple pages, each with its own Occupation definition and a different occupationLocation.
Recommended properties
description

Text

The description of the occupation.

The description should be a complete representation of the job, including job responsibilities, qualifications, skills, working hours, education requirements, and experience requirements.

Additional guidelines:

  • Include the description on all leaf pages that a user may land on, not just on the top-level page.
  • The description must uniquely identify the occupation and provide a specific description of what the occupation entails.

    Not recommended: “Internship - An internship is a job training for white collar and professional careers.”

    Recommended: “Data Analyst Intern - An internship working with a data analyst. A data analyst extracts insights from data to help make data driven decisions.”

  • The description can't be the same as the name.
  • Don't include the hiring organization in the description. Instead, use hiringOrganization.
estimatedSalary.currency

Text

The ISO 4217 3-letter currency code for the value. For example, "USD" or "CAD".

estimatedSalary.median

Number

The median (or "middle") value. For example, half of the salaries for this occupation are at or below this value.

estimatedSalary.percentile10

Number

The 10th percentile value. For example, 10% of the salaries for this occupation are at or below this value.

estimatedSalary.percentile25

Number

The 25th percentile value. For example, 25% of the salaries for this occupation are at or below this value.

estimatedSalary.percentile75

Number

The 75th percentile value. For example, 75% of the salaries for this occupation are at or below this value.

estimatedSalary.percentile90

Number

The 90th percentile value. For example, 90% of the salaries for this occupation are at or below this value.

mainEntityOfPage

WebPage

The main thing being described on the page.

mainEntityOfPage.lastReviewed

Date

The date when the estimated salary information was produced, in ISO 8601 format. For example:

"mainEntityOfPage": {
  "@type": "WebPage",
  "lastReviewed": "2017-07-23T14:20:00-05:00"
}

OccupationAggregationByEmployer

The OccupationAggregationByEmployer provides job-related data that is grouped by employer. For example, you can specify the industry and hiring organization for a group of occupations when they are aggregated by the employer.

Required properties
estimatedSalary

Array of MonetaryAmountDistribution

The estimated salary for this occupation in the given occupationLocation. You should specify a salary range or salary estimates based on the percentile rank.

To account for base salary, bonuses, and other forms of monetary compensation, define multiple salaries within the estimatedSalary array. You must specify the base salary. Other types of compensation are optional.

estimatedSalary.duration

Duration

The period of time that it takes to earn the estimated salary in ISO 8601 date format. For example, if the estimated salary is earned over the course of one year, use P1Y for duration.

estimatedSalary.name

Text

The type of value. You must specify the base salary. Other types of compensation are optional. For example, "Base", "Bonus", "Commission".

hiringOrganization

Organization

The organization offering a position of this occupation. Set the @context to "https://schema.org/". The hiringOrganization should be the name of the company (for example, “Starbucks, Inc”), and not the specific address of the location that is hiring (for example, “Starbucks on Main Street”). For example:

"hiringOrganization": {
  "@context": "https://schema.org/",
  "@type": "Organization",
  "name": "Google LLC"
}
name

Text

The title of the occupation. This property allows free-form text. For example, "Software Engineer".

Best practices:

  • This property should be the title of the occupation only.
  • Don't include job codes, addresses, dates, salaries, or company names in the name property.

    Not recommended: Apply now for IT job -FRENCH speaker in Bucharest

    Recommended: Market Specialist, French speaker

  • Provide concise, readable titles.
  • Don't overuse special characters such as "!" and "*". Abusing special characters might cause your markup to be considered as Spammy Structured Markup. Numbers and characters such as "/" and "-" are acceptable.

    Not recommended: *** WAREHOUSE HIRING NOW!! ON A BUS ROUTE!! ***

    Recommended: Shipping and Receiving Warehouse Associate

occupationLocation

Array of City, State, or Country

The place for which this occupational description applies. Define the location at the city, state, or country level on the one Name property if specifying for a single location.

Best practices:

  • The location should not be any more specific than the city.
  • The State property accepts region names if your country does not specify a state.
  • The value of occupationLocation is the location in which the occupation actually takes place, not the location where the salary estimate listing was created.
  • If a single Occupation type has multiple locations, specify the locations in the occupationLocation array, as the following example shows.
  • Data such as salary ranges, educational requirements, and qualifications for the occupation frequently varies based on location. To represent this, define multiple pages, each with its own Occupation definition and a different occupationLocation.
Recommended properties
description

Text

The description of the occupation.

The description should be a complete representation of the job, including job responsibilities, qualifications, skills, working hours, education requirements, and experience requirements.

Additional guidelines:

  • Include the description on all leaf pages that a user may land on, not just on the top-level page.
  • The description must uniquely identify the occupation and provide a specific description of what the occupation entails.

    Not recommended: “Internship - An internship is a job training for white collar and professional careers.”

    Recommended: “Data Analyst Intern - An internship working with a data analyst. A data analyst extracts insights from data to help make data driven decisions.”

  • The description can't be the same as the name.
  • Don't include the hiring organization in the description. Instead, use hiringOrganization.
estimatedSalary.currency

Text

The ISO 4217 3-letter currency code for the value. For example, "USD" or "CAD".

estimatedSalary.median

Number

The median (or "middle") value. For example, half of the salaries for this occupation are at or below this value.

estimatedSalary.percentile10

Number

The 10th percentile value. For example, 10% of the salaries for this occupation are at or below this value.

estimatedSalary.percentile25

Number

The 25th percentile value. For example, 25% of the salaries for this occupation are at or below this value.

estimatedSalary.percentile75

Number

The 75th percentile value. For example, 75% of the salaries for this occupation are at or below this value.

estimatedSalary.percentile90

Number

The 90th percentile value. For example, 90% of the salaries for this occupation are at or below this value.

industry

Text

The industry that's associated with the job position.

jobBenefits

Text

The description of benefits that are associated with the job.

mainEntityOfPage

WebPage

The main thing being described on the page.

mainEntityOfPage.lastReviewed

Date

The date when the estimated salary information was produced, in ISO 8601 format. For example:

"mainEntityOfPage": {
  "@type": "WebPage",
  "lastReviewed": "2017-07-23T14:20:00-05:00"
}
sampleSize

Number

The number of data points contributing to the aggregated salary data. For example:

"sampleSize": 42
yearsExperienceMax

Number

The maximum years of experience that are acceptable for this occupation. For example, a junior position might specify a maximum of 5 years of experience, as the following example shows:

"yearsExperienceMax": 5
yearsExperienceMin

Number

The minimum number of years of experience required for this occupation. For example, a senior position might require at least of 10 years of experience, as the following example shows:

"yearsExperienceMin": 10

Troubleshooting

If you're having trouble implementing structured data, here are some resources that may help you.