Profile schema

Pull-based Profile schema


{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
      "metaData": {
        "type": "object",
        "properties": {
          "feedCategory": {
            "type": "string",
            "enum": [
              "SNAPSHOT",
              "UPDATE"
            ],
            "description": "Category of the current feed"
          },
          "feedTimestampMicros": {
            "type": "integer",
            "description": "Timestamp in microseconds, representing age of current feed"
         },
         "apiVersion": {
            "type": "string",
            "description": "Represents the desired version of the service API in a feed."
         },
         "pagination": {
            "type": "object",
            "description": "Pagination info used to retrieve the subsequent page of current feed, will be used to fill nextToken param in endpoint url. See below pagination section for explanation. ",
             "properties": {
                "nextTokenParam": {
                    "type": "string"
                }
             }
         },
         "totalCount": {
            "type": "number",
            "description": "Total number of serviceProviders in the full feed (across all pages), used to verify feed completeness."
         },
         "partnerFeedId": {
            "type": "string",
            "description": "Partner specific identifier for this feed, if any. This field will be logged in reports exported (eg. feed validation/status reports). Partners may use this field for easier lookup of processing result/errors given a specific feed. This field optional."
         },
         "language": {
            "type": "string",
            "description": "The language which is used to describe service provider data in ISO 639-1 language code. (lowercase, 2-letter). Defaults to ‘en’."
         }
       },
       "required": [
         "feedCategory",
         "feedTimestampMicros",
         "apiVersion",
         "pagination",
         "totalCount"
       ]
    },
    "serviceProviders": {
      "type": "array",
      "description": "An array of providers from a given partner",
      "items": {
        "type": "object",
        "properties": {
          "serviceProviderId": {
            "type": "number",
            "description": "Unique identifier of a listing (a service provider). This will be converted into an int64."
          },
          "serviceProviderName": {
            "type": "string",
            "description": "Name of the business (service provider)"
          },
          "serviceProviderWebsiteUrl": {
            "type": "string",
            "description": "URL of the individual business website. Must start with http or https. This should be the URL owned by the business, not the profile URL owned by aggregator"
          },
          "address": {
            "type": "object",
            "description": "street address of individual business, if there is one",
            "properties": {
              "addressLine1": {
                "type": "string",
                "description": "The street address. For example, 1600 Amphitheatre Pkwy"
              },
              "city": {
                "type": "string",
                "description": "City of business address, must be use formatted names in Google Ads geographical targets list with TargetType “City”"
              },
              "region": {
                "type": "string",
                "description": "State of business address"
              },
              "postalCode": {
                "type": "string",
                "description": "Postal code of business address"
              },
              "country": {
                "type": "string",
                "description": "ISO 3166 country code (upper case, 2-letter) of the business. Cannot be changed after initial business set up."
              }
            },
            "required": [
              "city",
              "region",
              "postalCode",
              "country"
            ]
          },
          "aggregatorProfileUrl": {
            "type": "string",
            "description": "Link to the profile page on partner's website. Must start with http or https."
          },
          "yearBusinessStarted": {
            "type": "integer",
            "description": "Year this business began"
          },
          "businessHours": {
            "type": "array",
            "description": "Hours during which business is open. Each element in the array is an interval (startTime and endTime). StartTime and endTime must belong to the same day as specified by field dayOfWeek. As an example, pros who works from 8pm monday to 3am tuesday will have two intervals:{dayOfWeek:MONDAY,startTime:{hour: 20, minute:0}, endTime:{hour: 20, minute:59}} and {dayOfWeek:TUESDAY,startTime:{hour: 0, minute:0}, endTime:{hour: 3, minute:00}}",
            "items": {
              "type": "object",
              "properties": {
                "dayOfWeek": {
                    "type": "string",
                     "enum": [
                            "MONDAY",
                            "TUESDAY",
                            "WEDNESDAY",
                            "THURSDAY",
                            "FRIDAY",
                            "SATURDAY",
                            "SUNDAY"
                     ]
                },
                "startTime": {
                   "type": "object",
                   "description": "Start time of the specified day",
                   "properties": {
                      "hour": {
                         "type": "integer",
                         "description": "Start time hour (24 hours a day) should be in the range of [0, 23]"
                      },
                      "minute": {
                         "type": "integer",
                         "description": "Start time minute (60 minutes an hour), should be in the range of [0, 59]"
                     }
                   },
                   "required": [
                       "hour",
                       "minute"
                   ]
                },
                "endTime": {
                   "type": "object",
                   "description": "End time of the specified day",
                   "properties": {
                      "hour": {
                          "type": "integer",
                          "description": "End time hour (24 hours a day)",
                            "minimum": 0,
                            "maximum": 23
                      },
                      "minute": {
                         "type": "integer",
                         "description": "End time minutes (60 minutes an hour)",
                         "minimum": 0,
                         "maximum": 59
                     }
                  },
                  "required": [
                       "hour",
                       "minute"
                  ]
               }
              },
              "required": [
                "startTime",
                "endTime",
                "dayOfWeek"
              ]
            }
          },
          "businessPhoneNumber": {
            "type": "string",
            "description": "Individual business phone number, should either be empty or be owned by the business. The phone number should be in e164 format."
          },
          "contact": {
            "type": "array",
            "description": "Information used for various contact methods.Type may consist of “PHONE” or “MESSAGE”. For type “PHONE”, address must contain an E.164 formatted phone number. For “MESSAGE” address must not populated. Element with PHONE type is required, but element with MESSAGE type is optional.",
            "items": {
               "type": "object",
                "properties": {
                   "type": {
                       "type": "string",
                       "description": "Type of contact method",
                       "enum": [
                          "PHONE",
                          "MESSAGE"
                       ]
                   },
                   "address": {
                       "type": "string",
                       "description": "address by which to use this contact type. Eg should be phone number in e164 format if type is PHONE, should be empty if type if MESSAGE"
                   }
                },
                "required": [
                   "type"
                ]
             }
          },
          "targetingLanguages": {
            "type": "array",
           "description": "A list of languages your ad will be served in. Languages defined in ISO 639-1 language code. (lowercase, 2-letter).",
             "items": {
                "type": "string"
             }
           },
           "geoCovered":{
              "type": "object",
              "description": "Geo covered for the business, supports region, county, city and postal code level.",
              "items": {
                "type": "object",
                "properties": {
                  "criteriaIds": {
                      "type": "array",
                      "description": "Geo criterion id of a list of locations (region, country, city, postal code) served, criterion id must be valid in Google Ads geographical targets list: https://developers.google.com/adwords/api/docs/appendix/geotargeting.",
                      "items": {
                        "type": "integer"
                      }
                  }
                }
              }
            },
          "categories": {
            "type": "array",
            "description": "A list of categories served by the business. This list should contain exactly one category.",
            "items": {
              "type": "object",
              "properties": {
                  "categoryId": {
                     "type": "string",
                     "description": "Category Id in LSA taxonomy. Must be selected from LSA provided list."
                  },
                  "tasks": {
                      "type": "array",
                      "description": "A list of tasks served for the category",
                      "items": {
                          "type": "object",
                           "properties": {
                              "taskIds": {
                                  "type": "array",
                                  "description": "A list of task Ids in LSA taxonomy served by given corresponding geoCovered. Must be selected from LSA provided list.",
                                  "items": {
                                     "type": "string"
                                  }
                              },
                              "geoCovered": {
                                 "type": "object",
                                 "description": "Geo covered for the task, support both city level and postalCode level. If a particular postalCode and its parent city are both specified, system will honor city (lower granular one)",
                                 "properties": {
                                    "postalCodeCriteriaIds": {
                                       "type": "array",
                                       "description": "Geo criterion id of a list of postal codes served, criterion id must be valid in Google Ads geographical targets list: https://developers.google.com/adwords/api/docs/appendix/geotargeting with target Type Postal Code",

                                       "items": {
                                         "type": "integer"
                                       }
                                    },
                                    "cityCriteriaIds": {
                                       "type": "array",
                                       "description": "Geo criterion id of a list of city served, criterion id must be valid in Google Ads geographical targets list: https://developers.google.com/adwords/api/docs/appendix/geotargeting with target Type City",

                                        "items": {
                                           "type": "integer"
                                        }
                                     }
                                 }
                              }
                          }
                      }
                   }
                }
             }
          },
          "completedJobs": {
            "type": "integer",
            "description": "Number of completed Jobs if available"
          },
          "callouts": {
            "type":"array",
          "description":"A list of callOuts associated with each category used to highlight the business",
            "items": {
                "type":"object",
                "properties":{
                    "categoryId":{
                       "type":"string",
                       "description":"Category Id in LSA taxonomy. Must be selected from LSA provided list."
                    },
                    "callOutList":{
                       "type":"object",
                       "description":"A list of callOuts under given categoryId in LSA taxonomy, must be selected from LSA provided list. Must have at least two callouts per category Id",
                       "callOutIds":{
                          "type": "array",
                          "description": "A list of callout ids. Note that callOutId with prefix ‘years_in_business_’ also needs yearBusinessStarted field to be populated",
                          "items": {
                              "type": "string"
                          }
                       }
                   }
               },
               "required":[
                  "categoryId",
                  "callOutList"
               ]
           }
          },
          "active": {
            "type": "boolean",
            "description": "Flag indicating if this business is active or not"
          },
          "monthlyBudget": {
            "type": "integer",
            "description": "Monthly budget of this provider"
          },
          "monthlyBudgetCurrency": {
            "type": "string",
            "description": "Currency of Monthly budget per https://developers.google.com/adwords/api/docs/appendix/currencycodes. Cannot be changed after initial business set up."
          },
          "biddingStrategy": {
             "type": "string",
           "description": "Bidding strategy for each business. Must be selected from LSA provided list."
           },
           "biddingConfiguration": {
              "type": "array",
              "description": "A list of bidding configurations to control bidding strategy at finer grain level.",
              "items": {
                 "type": "object",
                   "properties": {
                      "categoryId": {
                         "type": "string",
                         "description": "Category Id in LSA taxonomy. Must be selected from LSA provided list."
                       },
                       "manualCostPerLead": {
                          "type": "object",
                          "description": "Manual cost per lead configuration.",
                          "properties": {
                             "bid": {
                                "type": "number",
                                "description": "Manual cost per lead bid in monthlyBudgetCurrency. The lead price will never exceed the value of this bid."
                             }
                          }
                        }
                    }
                }
            }
        }
      },
      "required": [
          "serviceProviderId",
          "address",
          "serviceProviderName",
          "businessHours",
          "businessPhoneNumber",
          "contact",
          "categories",
          "active",
          "monthlyBudget",
          "monthlyBudgetCurrency",
          "callOuts"
     ]
    }
  },
  "required": [
    "serviceProviders",
    "metaData"
  ]
}

Push-based Profile feed schema

The push-based version is a combined page. It is delivered in one file, with an outer wrapper responses array. Elements in the responses array use the same schema as the pull based review schema (paginated/single page).


{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "responses" : {
      "type": "array",
      "description": "An array of paginated responses from a given partner",
      "items": {
          … // Element in array shares the same schema as above pull feed schema
      }
    }
  },
  "required": [
    "responses"
  ]
}