<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="partners_v2.html">Google Partners API</a> . <a href="partners_v2.companies.html">companies</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="partners_v2.companies.leads.html">leads()</a></code>
</p>
<p class="firstline">Returns the leads Resource.</p>

<p class="toc_element">
  <code><a href="#get">get(companyId, orderBy=None, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, currencyCode=None, address=None, requestMetadata_locale=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None, view=None)</a></code></p>
<p class="firstline">Gets a company.</p>
<p class="toc_element">
  <code><a href="#list">list(orderBy=None, maxMonthlyBudget_units=None, requestMetadata_userOverrides_userId=None, pageSize=None, requestMetadata_userOverrides_ipAddress=None, maxMonthlyBudget_currencyCode=None, minMonthlyBudget_nanos=None, languageCodes=None, x__xgafv=None, industries=None, requestMetadata_locale=None, pageToken=None, minMonthlyBudget_currencyCode=None, companyName=None, maxMonthlyBudget_nanos=None, requestMetadata_trafficSource_trafficSubId=None, address=None, services=None, gpsMotivations=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, specializations=None, websiteUrl=None, requestMetadata_partnersSessionId=None, minMonthlyBudget_units=None, view=None)</a></code></p>
<p class="firstline">Lists companies.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="get">get(companyId, orderBy=None, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, currencyCode=None, address=None, requestMetadata_locale=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None, view=None)</code>
  <pre>Gets a company.

Args:
  companyId: string, The ID of the company to retrieve. (required)
  orderBy: string, How to order addresses within the returned company. Currently, only
`address` and `address desc` is supported which will sorted by closest to
farthest in distance from given address and farthest to closest distance
from given address respectively.
  requestMetadata_userOverrides_ipAddress: string, IP address to use instead of the user's geo-located IP address.
  requestMetadata_trafficSource_trafficSubId: string, Second level identifier to indicate where the traffic comes from.
An identifier has multiple letters created by a team which redirected the
traffic to us.
  requestMetadata_userOverrides_userId: string, Logged-in user ID to impersonate instead of the user's ID.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format
  currencyCode: string, If the company's budget is in a different currency code than this one, then
the converted budget is converted to this currency code.
  address: string, The address to use for sorting the company's addresses by proximity.
If not given, the geo-located address of the request is used.
Used when order_by is set.
  requestMetadata_locale: string, Locale to use for the current request.
  requestMetadata_experimentIds: string, Experiment IDs the current request belongs to. (repeated)
  requestMetadata_trafficSource_trafficSourceId: string, Identifier to indicate where the traffic comes from.
An identifier has multiple letters created by a team which redirected the
traffic to us.
  requestMetadata_partnersSessionId: string, Google Partners session ID.
  view: string, The view of `Company` resource to be returned. This must not be
`COMPANY_VIEW_UNSPECIFIED`.

Returns:
  An object of the form:

    { # Response message for GetCompany.
    "company": { # A company resource in the Google Partners API. Once certified, it qualifies # The company.
        # for being searched by advertisers.
      "companyTypes": [ # Company type labels listed on the company's profile.
        "A String",
      ],
      "originalMinMonthlyBudget": { # Represents an amount of money with its currency type. # The unconverted minimum monthly budget that the company accepts for partner
          # business.
        "nanos": 42, # Number of nano (10^-9) units of the amount.
            # The value must be between -999,999,999 and +999,999,999 inclusive.
            # If `units` is positive, `nanos` must be positive or zero.
            # If `units` is zero, `nanos` can be positive, zero, or negative.
            # If `units` is negative, `nanos` must be negative or zero.
            # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
        "units": "A String", # The whole units of the amount.
            # For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
        "currencyCode": "A String", # The 3-letter currency code defined in ISO 4217.
      },
      "autoApprovalEmailDomains": [ # Email domains that allow users with a matching email address to get
          # auto-approved for associating with this company.
        "A String",
      ],
      "specializationStatus": [ # The list of Google Partners specialization statuses for the company.
        { # Agency specialization status
          "badgeSpecialization": "A String", # The specialization this status is for.
          "badgeSpecializationState": "A String", # State of agency specialization.
        },
      ],
      "ranks": [ # Information related to the ranking of the company within the list of
          # companies.
        { # Information related to ranking of results.
          "type": "A String", # The type of rank.
          "value": 3.14, # The numerical value of the rank.
        },
      ],
      "primaryAdwordsManagerAccountId": "A String", # The Primary AdWords Manager Account id.
      "locations": [ # The list of all company locations.
          # If set, must include the
          # primary_location
          # in the list.
        { # A location with address and geographic coordinates. May optionally contain a
            # detailed (multi-field) version of the address.
          "languageCode": "A String", # Language code of the address. Should be in BCP 47 format.
          "addressLine": [ # The following address lines represent the most specific part of any
              # address.
            "A String",
          ],
          "dependentLocality": "A String", # Dependent locality or sublocality. Used for UK dependent localities, or
              # neighborhoods or boroughs in other locations.
          "sortingCode": "A String", # Use of this code is very country-specific, but will refer to a secondary
              # classification code for sorting mail.
          "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The latitude and longitude of the location, in degrees.
              # of doubles representing degrees latitude and degrees longitude. Unless
              # specified otherwise, this must conform to the
              # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
              # standard</a>. Values must be within normalized ranges.
              #
              # Example of normalization code in Python:
              #
              #     def NormalizeLongitude(longitude):
              #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
              #       q, r = divmod(longitude, 360.0)
              #       if r > 180.0 or (r == 180.0 and q <= -1.0):
              #         return r - 360.0
              #       return r
              #
              #     def NormalizeLatLng(latitude, longitude):
              #       """Wraps decimal degrees latitude and longitude to
              #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
              #       r = latitude % 360.0
              #       if r <= 90.0:
              #         return r, NormalizeLongitude(longitude)
              #       elif r >= 270.0:
              #         return r - 360, NormalizeLongitude(longitude)
              #       else:
              #         return 180 - r, NormalizeLongitude(longitude + 180.0)
              #
              #     assert 180.0 == NormalizeLongitude(180.0)
              #     assert -180.0 == NormalizeLongitude(-180.0)
              #     assert -179.0 == NormalizeLongitude(181.0)
              #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
              #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
              #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
              #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
              #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
              #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
              #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
              #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
              #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
              #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
            "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
            "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
          },
          "locality": "A String", # Generally refers to the city/town portion of an address.
          "regionCode": "A String", # CLDR (Common Locale Data Repository) region code .
          "administrativeArea": "A String", # Top-level administrative subdivision of this country.
          "address": "A String", # The single string version of the address.
          "postalCode": "A String", # Values are frequently alphanumeric.
        },
      ],
      "id": "A String", # The ID of the company.
      "badgeTier": "A String", # Partner badge tier
      "services": [ # Services the company can help with.
        "A String",
      ],
      "additionalWebsites": [ # URL of the company's additional websites used to verify the dynamic badges.
          # These are stored as full URLs as entered by the user, but only the TLD will
          # be used for the actual verification.
        "A String",
      ],
      "profileStatus": "A String", # The public viewability status of the company's profile.
      "industries": [ # Industries the company can help with.
        "A String",
      ],
      "primaryLocation": { # A location with address and geographic coordinates. May optionally contain a # The primary location of the company.
          # detailed (multi-field) version of the address.
        "languageCode": "A String", # Language code of the address. Should be in BCP 47 format.
        "addressLine": [ # The following address lines represent the most specific part of any
            # address.
          "A String",
        ],
        "dependentLocality": "A String", # Dependent locality or sublocality. Used for UK dependent localities, or
            # neighborhoods or boroughs in other locations.
        "sortingCode": "A String", # Use of this code is very country-specific, but will refer to a secondary
            # classification code for sorting mail.
        "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The latitude and longitude of the location, in degrees.
            # of doubles representing degrees latitude and degrees longitude. Unless
            # specified otherwise, this must conform to the
            # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
            # standard</a>. Values must be within normalized ranges.
            #
            # Example of normalization code in Python:
            #
            #     def NormalizeLongitude(longitude):
            #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
            #       q, r = divmod(longitude, 360.0)
            #       if r > 180.0 or (r == 180.0 and q <= -1.0):
            #         return r - 360.0
            #       return r
            #
            #     def NormalizeLatLng(latitude, longitude):
            #       """Wraps decimal degrees latitude and longitude to
            #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
            #       r = latitude % 360.0
            #       if r <= 90.0:
            #         return r, NormalizeLongitude(longitude)
            #       elif r >= 270.0:
            #         return r - 360, NormalizeLongitude(longitude)
            #       else:
            #         return 180 - r, NormalizeLongitude(longitude + 180.0)
            #
            #     assert 180.0 == NormalizeLongitude(180.0)
            #     assert -180.0 == NormalizeLongitude(-180.0)
            #     assert -179.0 == NormalizeLongitude(181.0)
            #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
            #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
            #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
            #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
            #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
            #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
            #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
            #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
            #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
            #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
          "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
          "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
        },
        "locality": "A String", # Generally refers to the city/town portion of an address.
        "regionCode": "A String", # CLDR (Common Locale Data Repository) region code .
        "administrativeArea": "A String", # Top-level administrative subdivision of this country.
        "address": "A String", # The single string version of the address.
        "postalCode": "A String", # Values are frequently alphanumeric.
      },
      "websiteUrl": "A String", # URL of the company's website.
      "certificationStatuses": [ # The list of Google Partners certification statuses for the company.
        { # Google Partners certification status.
          "isCertified": True or False, # Whether certification is passing.
          "userCount": 42, # Number of people who are certified,
          "type": "A String", # The type of the certification.
          "examStatuses": [ # List of certification exam statuses.
            { # Status for a Google Partners certification exam.
              "numberUsersPass": 42, # The number of people who have passed the certification exam.
              "type": "A String", # The type of certification exam.
            },
          ],
        },
      ],
      "publicProfile": { # Basic information from a public profile. # Basic information from the company's public profile.
        "url": "A String", # The URL of the public profile.
        "profileImage": "A String", # The URL to the main profile image of the public profile.
        "displayImageUrl": "A String", # The URL to the main display image of the public profile. Being deprecated.
        "displayName": "A String", # The display name of the public profile.
        "id": "A String", # The ID which can be used to retrieve more details about the public profile.
      },
      "localizedInfos": [ # The list of localized info for the company.
        { # The localized company information.
          "countryCodes": [ # List of country codes for the localized company info.
            "A String",
          ],
          "languageCode": "A String", # Language code of the localized company info, as defined by
              # <a href="https://tools.ietf.org/html/bcp47">BCP 47</a>
              # (IETF BCP 47, "Tags for Identifying Languages").
          "displayName": "A String", # Localized display name.
          "overview": "A String", # Localized brief description that the company uses to advertise themselves.
        },
      ],
      "convertedMinMonthlyBudget": { # Represents an amount of money with its currency type. # The minimum monthly budget that the company accepts for partner business,
          # converted to the requested currency code.
        "nanos": 42, # Number of nano (10^-9) units of the amount.
            # The value must be between -999,999,999 and +999,999,999 inclusive.
            # If `units` is positive, `nanos` must be positive or zero.
            # If `units` is zero, `nanos` can be positive, zero, or negative.
            # If `units` is negative, `nanos` must be negative or zero.
            # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
        "units": "A String", # The whole units of the amount.
            # For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
        "currencyCode": "A String", # The 3-letter currency code defined in ISO 4217.
      },
      "primaryLanguageCode": "A String", # The primary language code of the company, as defined by
          # <a href="https://tools.ietf.org/html/bcp47">BCP 47</a>
          # (IETF BCP 47, "Tags for Identifying Languages").
      "name": "A String", # The name of the company.
    },
    "responseMetadata": { # Common data that is in each API response. # Current response metadata.
      "debugInfo": { # Debug information about this request. # Debug information about this request.
        "serverTraceInfo": "A String", # Server-side debug stack trace.
        "serviceUrl": "A String", # URL of the service that handled this request.
        "serverInfo": "A String", # Info about the server that serviced this request.
      },
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(orderBy=None, maxMonthlyBudget_units=None, requestMetadata_userOverrides_userId=None, pageSize=None, requestMetadata_userOverrides_ipAddress=None, maxMonthlyBudget_currencyCode=None, minMonthlyBudget_nanos=None, languageCodes=None, x__xgafv=None, industries=None, requestMetadata_locale=None, pageToken=None, minMonthlyBudget_currencyCode=None, companyName=None, maxMonthlyBudget_nanos=None, requestMetadata_trafficSource_trafficSubId=None, address=None, services=None, gpsMotivations=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, specializations=None, websiteUrl=None, requestMetadata_partnersSessionId=None, minMonthlyBudget_units=None, view=None)</code>
  <pre>Lists companies.

Args:
  orderBy: string, How to order addresses within the returned companies. Currently, only
`address` and `address desc` is supported which will sorted by closest to
farthest in distance from given address and farthest to closest distance
from given address respectively.
  maxMonthlyBudget_units: string, The whole units of the amount.
For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
  requestMetadata_userOverrides_userId: string, Logged-in user ID to impersonate instead of the user's ID.
  pageSize: integer, Requested page size. Server may return fewer companies than requested.
If unspecified, server picks an appropriate default.
  requestMetadata_userOverrides_ipAddress: string, IP address to use instead of the user's geo-located IP address.
  maxMonthlyBudget_currencyCode: string, The 3-letter currency code defined in ISO 4217.
  minMonthlyBudget_nanos: integer, Number of nano (10^-9) units of the amount.
The value must be between -999,999,999 and +999,999,999 inclusive.
If `units` is positive, `nanos` must be positive or zero.
If `units` is zero, `nanos` can be positive, zero, or negative.
If `units` is negative, `nanos` must be negative or zero.
For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
  languageCodes: string, List of language codes that company can support. Only primary language
subtags are accepted as defined by
<a href="https://tools.ietf.org/html/bcp47">BCP 47</a>
(IETF BCP 47, "Tags for Identifying Languages"). (repeated)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format
  industries: string, List of industries the company can help with. (repeated)
  requestMetadata_locale: string, Locale to use for the current request.
  pageToken: string, A token identifying a page of results that the server returns.
Typically, this is the value of `ListCompaniesResponse.next_page_token`
returned from the previous call to
ListCompanies.
  minMonthlyBudget_currencyCode: string, The 3-letter currency code defined in ISO 4217.
  companyName: string, Company name to search for.
  maxMonthlyBudget_nanos: integer, Number of nano (10^-9) units of the amount.
The value must be between -999,999,999 and +999,999,999 inclusive.
If `units` is positive, `nanos` must be positive or zero.
If `units` is zero, `nanos` can be positive, zero, or negative.
If `units` is negative, `nanos` must be negative or zero.
For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
  requestMetadata_trafficSource_trafficSubId: string, Second level identifier to indicate where the traffic comes from.
An identifier has multiple letters created by a team which redirected the
traffic to us.
  address: string, The address to use when searching for companies.
If not given, the geo-located address of the request is used.
  services: string, List of services that the returned agencies should provide. If this is
not empty, any returned agency must have at least one of these services,
or one of the specializations in the "specializations" field. (repeated)
  gpsMotivations: string, List of reasons for using Google Partner Search to get companies. (repeated)
  requestMetadata_experimentIds: string, Experiment IDs the current request belongs to. (repeated)
  requestMetadata_trafficSource_trafficSourceId: string, Identifier to indicate where the traffic comes from.
An identifier has multiple letters created by a team which redirected the
traffic to us.
  specializations: string, List of specializations that the returned agencies should provide. If this
is not empty, any returned agency must have at least one of these
specializations, or one of the services in the "services" field. (repeated)
  websiteUrl: string, Website URL that will help to find a better matched company.
.
  requestMetadata_partnersSessionId: string, Google Partners session ID.
  minMonthlyBudget_units: string, The whole units of the amount.
For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
  view: string, The view of the `Company` resource to be returned. This must not be
`COMPANY_VIEW_UNSPECIFIED`.

Returns:
  An object of the form:

    { # Response message for
      # ListCompanies.
    "nextPageToken": "A String", # A token to retrieve next page of results.
        # Pass this value in the `ListCompaniesRequest.page_token` field in the
        # subsequent call to
        # ListCompanies to retrieve the
        # next page of results.
    "companies": [ # The list of companies.
      { # A company resource in the Google Partners API. Once certified, it qualifies
          # for being searched by advertisers.
        "companyTypes": [ # Company type labels listed on the company's profile.
          "A String",
        ],
        "originalMinMonthlyBudget": { # Represents an amount of money with its currency type. # The unconverted minimum monthly budget that the company accepts for partner
            # business.
          "nanos": 42, # Number of nano (10^-9) units of the amount.
              # The value must be between -999,999,999 and +999,999,999 inclusive.
              # If `units` is positive, `nanos` must be positive or zero.
              # If `units` is zero, `nanos` can be positive, zero, or negative.
              # If `units` is negative, `nanos` must be negative or zero.
              # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
          "units": "A String", # The whole units of the amount.
              # For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
          "currencyCode": "A String", # The 3-letter currency code defined in ISO 4217.
        },
        "autoApprovalEmailDomains": [ # Email domains that allow users with a matching email address to get
            # auto-approved for associating with this company.
          "A String",
        ],
        "specializationStatus": [ # The list of Google Partners specialization statuses for the company.
          { # Agency specialization status
            "badgeSpecialization": "A String", # The specialization this status is for.
            "badgeSpecializationState": "A String", # State of agency specialization.
          },
        ],
        "ranks": [ # Information related to the ranking of the company within the list of
            # companies.
          { # Information related to ranking of results.
            "type": "A String", # The type of rank.
            "value": 3.14, # The numerical value of the rank.
          },
        ],
        "primaryAdwordsManagerAccountId": "A String", # The Primary AdWords Manager Account id.
        "locations": [ # The list of all company locations.
            # If set, must include the
            # primary_location
            # in the list.
          { # A location with address and geographic coordinates. May optionally contain a
              # detailed (multi-field) version of the address.
            "languageCode": "A String", # Language code of the address. Should be in BCP 47 format.
            "addressLine": [ # The following address lines represent the most specific part of any
                # address.
              "A String",
            ],
            "dependentLocality": "A String", # Dependent locality or sublocality. Used for UK dependent localities, or
                # neighborhoods or boroughs in other locations.
            "sortingCode": "A String", # Use of this code is very country-specific, but will refer to a secondary
                # classification code for sorting mail.
            "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The latitude and longitude of the location, in degrees.
                # of doubles representing degrees latitude and degrees longitude. Unless
                # specified otherwise, this must conform to the
                # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
                # standard</a>. Values must be within normalized ranges.
                #
                # Example of normalization code in Python:
                #
                #     def NormalizeLongitude(longitude):
                #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
                #       q, r = divmod(longitude, 360.0)
                #       if r > 180.0 or (r == 180.0 and q <= -1.0):
                #         return r - 360.0
                #       return r
                #
                #     def NormalizeLatLng(latitude, longitude):
                #       """Wraps decimal degrees latitude and longitude to
                #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
                #       r = latitude % 360.0
                #       if r <= 90.0:
                #         return r, NormalizeLongitude(longitude)
                #       elif r >= 270.0:
                #         return r - 360, NormalizeLongitude(longitude)
                #       else:
                #         return 180 - r, NormalizeLongitude(longitude + 180.0)
                #
                #     assert 180.0 == NormalizeLongitude(180.0)
                #     assert -180.0 == NormalizeLongitude(-180.0)
                #     assert -179.0 == NormalizeLongitude(181.0)
                #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
                #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
                #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
                #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
                #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
                #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
                #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
                #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
                #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
                #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
              "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
              "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
            },
            "locality": "A String", # Generally refers to the city/town portion of an address.
            "regionCode": "A String", # CLDR (Common Locale Data Repository) region code .
            "administrativeArea": "A String", # Top-level administrative subdivision of this country.
            "address": "A String", # The single string version of the address.
            "postalCode": "A String", # Values are frequently alphanumeric.
          },
        ],
        "id": "A String", # The ID of the company.
        "badgeTier": "A String", # Partner badge tier
        "services": [ # Services the company can help with.
          "A String",
        ],
        "additionalWebsites": [ # URL of the company's additional websites used to verify the dynamic badges.
            # These are stored as full URLs as entered by the user, but only the TLD will
            # be used for the actual verification.
          "A String",
        ],
        "profileStatus": "A String", # The public viewability status of the company's profile.
        "industries": [ # Industries the company can help with.
          "A String",
        ],
        "primaryLocation": { # A location with address and geographic coordinates. May optionally contain a # The primary location of the company.
            # detailed (multi-field) version of the address.
          "languageCode": "A String", # Language code of the address. Should be in BCP 47 format.
          "addressLine": [ # The following address lines represent the most specific part of any
              # address.
            "A String",
          ],
          "dependentLocality": "A String", # Dependent locality or sublocality. Used for UK dependent localities, or
              # neighborhoods or boroughs in other locations.
          "sortingCode": "A String", # Use of this code is very country-specific, but will refer to a secondary
              # classification code for sorting mail.
          "latLng": { # An object representing a latitude/longitude pair. This is expressed as a pair # The latitude and longitude of the location, in degrees.
              # of doubles representing degrees latitude and degrees longitude. Unless
              # specified otherwise, this must conform to the
              # <a href="http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf">WGS84
              # standard</a>. Values must be within normalized ranges.
              #
              # Example of normalization code in Python:
              #
              #     def NormalizeLongitude(longitude):
              #       """Wraps decimal degrees longitude to [-180.0, 180.0]."""
              #       q, r = divmod(longitude, 360.0)
              #       if r > 180.0 or (r == 180.0 and q <= -1.0):
              #         return r - 360.0
              #       return r
              #
              #     def NormalizeLatLng(latitude, longitude):
              #       """Wraps decimal degrees latitude and longitude to
              #       [-90.0, 90.0] and [-180.0, 180.0], respectively."""
              #       r = latitude % 360.0
              #       if r <= 90.0:
              #         return r, NormalizeLongitude(longitude)
              #       elif r >= 270.0:
              #         return r - 360, NormalizeLongitude(longitude)
              #       else:
              #         return 180 - r, NormalizeLongitude(longitude + 180.0)
              #
              #     assert 180.0 == NormalizeLongitude(180.0)
              #     assert -180.0 == NormalizeLongitude(-180.0)
              #     assert -179.0 == NormalizeLongitude(181.0)
              #     assert (0.0, 0.0) == NormalizeLatLng(360.0, 0.0)
              #     assert (0.0, 0.0) == NormalizeLatLng(-360.0, 0.0)
              #     assert (85.0, 180.0) == NormalizeLatLng(95.0, 0.0)
              #     assert (-85.0, -170.0) == NormalizeLatLng(-95.0, 10.0)
              #     assert (90.0, 10.0) == NormalizeLatLng(90.0, 10.0)
              #     assert (-90.0, -10.0) == NormalizeLatLng(-90.0, -10.0)
              #     assert (0.0, -170.0) == NormalizeLatLng(-180.0, 10.0)
              #     assert (0.0, -170.0) == NormalizeLatLng(180.0, 10.0)
              #     assert (-90.0, 10.0) == NormalizeLatLng(270.0, 10.0)
              #     assert (90.0, 10.0) == NormalizeLatLng(-270.0, 10.0)
            "latitude": 3.14, # The latitude in degrees. It must be in the range [-90.0, +90.0].
            "longitude": 3.14, # The longitude in degrees. It must be in the range [-180.0, +180.0].
          },
          "locality": "A String", # Generally refers to the city/town portion of an address.
          "regionCode": "A String", # CLDR (Common Locale Data Repository) region code .
          "administrativeArea": "A String", # Top-level administrative subdivision of this country.
          "address": "A String", # The single string version of the address.
          "postalCode": "A String", # Values are frequently alphanumeric.
        },
        "websiteUrl": "A String", # URL of the company's website.
        "certificationStatuses": [ # The list of Google Partners certification statuses for the company.
          { # Google Partners certification status.
            "isCertified": True or False, # Whether certification is passing.
            "userCount": 42, # Number of people who are certified,
            "type": "A String", # The type of the certification.
            "examStatuses": [ # List of certification exam statuses.
              { # Status for a Google Partners certification exam.
                "numberUsersPass": 42, # The number of people who have passed the certification exam.
                "type": "A String", # The type of certification exam.
              },
            ],
          },
        ],
        "publicProfile": { # Basic information from a public profile. # Basic information from the company's public profile.
          "url": "A String", # The URL of the public profile.
          "profileImage": "A String", # The URL to the main profile image of the public profile.
          "displayImageUrl": "A String", # The URL to the main display image of the public profile. Being deprecated.
          "displayName": "A String", # The display name of the public profile.
          "id": "A String", # The ID which can be used to retrieve more details about the public profile.
        },
        "localizedInfos": [ # The list of localized info for the company.
          { # The localized company information.
            "countryCodes": [ # List of country codes for the localized company info.
              "A String",
            ],
            "languageCode": "A String", # Language code of the localized company info, as defined by
                # <a href="https://tools.ietf.org/html/bcp47">BCP 47</a>
                # (IETF BCP 47, "Tags for Identifying Languages").
            "displayName": "A String", # Localized display name.
            "overview": "A String", # Localized brief description that the company uses to advertise themselves.
          },
        ],
        "convertedMinMonthlyBudget": { # Represents an amount of money with its currency type. # The minimum monthly budget that the company accepts for partner business,
            # converted to the requested currency code.
          "nanos": 42, # Number of nano (10^-9) units of the amount.
              # The value must be between -999,999,999 and +999,999,999 inclusive.
              # If `units` is positive, `nanos` must be positive or zero.
              # If `units` is zero, `nanos` can be positive, zero, or negative.
              # If `units` is negative, `nanos` must be negative or zero.
              # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
          "units": "A String", # The whole units of the amount.
              # For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
          "currencyCode": "A String", # The 3-letter currency code defined in ISO 4217.
        },
        "primaryLanguageCode": "A String", # The primary language code of the company, as defined by
            # <a href="https://tools.ietf.org/html/bcp47">BCP 47</a>
            # (IETF BCP 47, "Tags for Identifying Languages").
        "name": "A String", # The name of the company.
      },
    ],
    "responseMetadata": { # Common data that is in each API response. # Current response metadata.
      "debugInfo": { # Debug information about this request. # Debug information about this request.
        "serverTraceInfo": "A String", # Server-side debug stack trace.
        "serviceUrl": "A String", # URL of the service that handled this request.
        "serverInfo": "A String", # Info about the server that serviced this request.
      },
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call 'execute()' on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

</body></html>