<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.users.html">users</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#createCompanyRelation">createCompanyRelation(userId, body, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, requestMetadata_locale=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None)</a></code></p>
<p class="firstline">Creates a user's company relation. Affiliates the user to a company.</p>
<p class="toc_element">
  <code><a href="#deleteCompanyRelation">deleteCompanyRelation(userId, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, requestMetadata_locale=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None)</a></code></p>
<p class="firstline">Deletes a user's company relation. Unaffiliaites the user from a company.</p>
<p class="toc_element">
  <code><a href="#get">get(userId, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, requestMetadata_locale=None, userView=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None)</a></code></p>
<p class="firstline">Gets a user.</p>
<p class="toc_element">
  <code><a href="#updateProfile">updateProfile(body, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, requestMetadata_locale=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None)</a></code></p>
<p class="firstline">Updates a user's profile. A user can only update their own profile and</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="createCompanyRelation">createCompanyRelation(userId, body, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, requestMetadata_locale=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None)</code>
  <pre>Creates a user's company relation. Affiliates the user to a company.

Args:
  userId: string, The ID of the user. Can be set to <code>me</code> to mean
the currently authenticated user. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # A CompanyRelation resource representing information about a user's
      # affiliation and standing with a company in Partners.
    "website": "A String", # The website URL for this company.
    "primaryCountryCode": "A String", # The primary country code of the company.
    "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.
      },
    ],
    "companyId": "A String", # The ID of the company. There may be no id if this is a
        # pending company.5
    "isPending": True or False, # The flag that indicates if the company is pending verification.
    "primaryAddress": { # 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.
    },
    "address": "A String", # The primary address for this company.
    "creationTime": "A String", # The timestamp of when affiliation was requested.
        # @OutputOnly
    "companyAdmin": True or False, # Indicates if the user is an admin for this company.
    "badgeTier": "A String", # Whether the company is a Partner.
    "state": "A String", # The state of relationship, in terms of approvals.
    "phoneNumber": "A String", # The phone number for the company's primary address.
    "managerAccount": "A String", # The AdWords manager account # associated this company.
    "logoUrl": "A String", # A URL to a profile photo, e.g. a G+ profile photo.
    "primaryLanguageCode": "A String", # The primary language code of the company.
    "resolvedTimestamp": "A String", # The timestamp when the user was approved.
        # @OutputOnly
    "segment": [ # The segment the company is classified as.
      "A String",
    ],
    "name": "A String", # The name (in the company's primary language) for the company.
  }

  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
  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.

Returns:
  An object of the form:

    { # A CompanyRelation resource representing information about a user's
        # affiliation and standing with a company in Partners.
      "website": "A String", # The website URL for this company.
      "primaryCountryCode": "A String", # The primary country code of the company.
      "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.
        },
      ],
      "companyId": "A String", # The ID of the company. There may be no id if this is a
          # pending company.5
      "isPending": True or False, # The flag that indicates if the company is pending verification.
      "primaryAddress": { # 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.
      },
      "address": "A String", # The primary address for this company.
      "creationTime": "A String", # The timestamp of when affiliation was requested.
          # @OutputOnly
      "companyAdmin": True or False, # Indicates if the user is an admin for this company.
      "badgeTier": "A String", # Whether the company is a Partner.
      "state": "A String", # The state of relationship, in terms of approvals.
      "phoneNumber": "A String", # The phone number for the company's primary address.
      "managerAccount": "A String", # The AdWords manager account # associated this company.
      "logoUrl": "A String", # A URL to a profile photo, e.g. a G+ profile photo.
      "primaryLanguageCode": "A String", # The primary language code of the company.
      "resolvedTimestamp": "A String", # The timestamp when the user was approved.
          # @OutputOnly
      "segment": [ # The segment the company is classified as.
        "A String",
      ],
      "name": "A String", # The name (in the company's primary language) for the company.
    }</pre>
</div>

<div class="method">
    <code class="details" id="deleteCompanyRelation">deleteCompanyRelation(userId, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, requestMetadata_locale=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None)</code>
  <pre>Deletes a user's company relation. Unaffiliaites the user from a company.

Args:
  userId: string, The ID of the user. Can be set to <code>me</code> to mean
the currently authenticated user. (required)
  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
  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.

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(userId, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, requestMetadata_locale=None, userView=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None)</code>
  <pre>Gets a user.

Args:
  userId: string, Identifier of the user. Can be set to <code>me</code> to mean the currently
authenticated user. (required)
  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
  requestMetadata_locale: string, Locale to use for the current request.
  userView: string, Specifies what parts of the user information to return.
  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.

Returns:
  An object of the form:

    { # A resource representing a user of the Partners platform.
    "profile": { # The profile information of a Partners user. # The profile information of a Partners user, contains all the directly
        # editable user information.
        "industries": [ # A list of ids representing which industries the user selected.
          "A String",
        ],
        "primaryCountryCode": "A String", # The user's primary country, an ISO 2-character code.
        "adwordsManagerAccount": "A String", # If the user has edit access to multiple accounts, the user can choose the
            # preferred account and it is used when a personal account is needed. Can
            # be empty.
        "languages": [ # The list of languages this user understands.
          "A String",
        ],
        "markets": [ # A list of ids representing which markets the user was interested in.
          "A String",
        ],
        "emailOptIns": { # A set of opt-ins for a user. # The list of opt-ins for the user, related to communication preferences.
          "specialOffers": True or False, # An opt-in about receiving email regarding new features and products.
          "marketComm": True or False, # An opt-in about receiving email from Partners marketing teams. Includes
              # member-only events and special promotional offers for Google products.
          "phoneContact": True or False, # An opt-in to allow recieivng phone calls about their Partners account.
          "physicalMail": True or False, # An opt-in to receive special promotional gifts and material in the mail.
          "performanceSuggestions": True or False, # An opt-in about receiving email with customized AdWords campaign management
              # tips.
        },
        "familyName": "A String", # The user's family name.
        "channels": [ # A list of ids representing which channels the user selected they were in.
          "A String",
        ],
        "emailAddress": "A String", # The email address the user has selected on the Partners site as primary.
        "address": { # A location with address and geographic coordinates. May optionally contain a # The user's mailing address, contains multiple fields.
            # 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.
        },
        "phoneNumber": "A String", # The user's phone number.
        "givenName": "A String", # The user's given name.
        "jobFunctions": [ # A list of ids represnting which job categories the user selected.
          "A String",
        ],
        "profilePublic": True or False, # Whether the user's public profile is visible to anyone with the URL.
      },
    "companyVerificationEmail": "A String", # The email address used by the user used for company verification.
        # @OutputOnly
    "certificationStatus": [ # The list of achieved certifications. These are calculated based on exam
        # results and other requirements.
        # @OutputOnly
      { # A user's information on a specific certification.
        "lastAchieved": "A String", # The date the user last achieved certification.
        "warning": True or False, # Whether this certification is in the state of warning.
        "expiration": "A String", # Date this certification is due to expire.
        "certificationType": "A String", # The type of certification, the area of expertise.
        "achieved": True or False, # Whether this certification has been achieved.
      },
    ],
    "availableAdwordsManagerAccounts": [ # This is the list of AdWords Manager Accounts the user has edit access to.
        # If the user has edit access to multiple accounts, the user can choose the
        # preferred account and we use this when a personal account is needed. Can
        # be empty meaning the user has access to no accounts.
        # @OutputOnly
      { # Information about a particular AdWords Manager Account.
          # Read more at https://support.google.com/adwords/answer/6139186
        "id": "A String", # The AdWords Manager Account id.
        "customerName": "A String", # Name of the customer this account represents.
      },
    ],
    "company": { # A CompanyRelation resource representing information about a user's # The company that the user is associated with.
        # If not present, the user is not associated with any company.
          # affiliation and standing with a company in Partners.
        "website": "A String", # The website URL for this company.
        "primaryCountryCode": "A String", # The primary country code of the company.
        "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.
          },
        ],
        "companyId": "A String", # The ID of the company. There may be no id if this is a
            # pending company.5
        "isPending": True or False, # The flag that indicates if the company is pending verification.
        "primaryAddress": { # 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.
        },
        "address": "A String", # The primary address for this company.
        "creationTime": "A String", # The timestamp of when affiliation was requested.
            # @OutputOnly
        "companyAdmin": True or False, # Indicates if the user is an admin for this company.
        "badgeTier": "A String", # Whether the company is a Partner.
        "state": "A String", # The state of relationship, in terms of approvals.
        "phoneNumber": "A String", # The phone number for the company's primary address.
        "managerAccount": "A String", # The AdWords manager account # associated this company.
        "logoUrl": "A String", # A URL to a profile photo, e.g. a G+ profile photo.
        "primaryLanguageCode": "A String", # The primary language code of the company.
        "resolvedTimestamp": "A String", # The timestamp when the user was approved.
            # @OutputOnly
        "segment": [ # The segment the company is classified as.
          "A String",
        ],
        "name": "A String", # The name (in the company's primary language) for the company.
      },
    "lastAccessTime": "A String", # The most recent time the user interacted with the Partners site.
        # @OutputOnly
    "primaryEmails": [ # The list of emails the user has access to/can select as primary.
        # @OutputOnly
      "A String",
    ],
    "id": "A String", # The ID of the user.
    "publicProfile": { # Basic information from a public profile. # Information about a user's external public profile outside Google Partners.
      "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.
    },
    "examStatus": [ # The list of exams the user ever taken. For each type of exam, only one
        # entry is listed.
      { # A user's information on a specific exam.
        "examType": "A String", # The type of the exam.
        "warning": True or False, # Whether this exam is in the state of warning.
        "expiration": "A String", # Date this exam is due to expire.
        "passed": True or False, # Whether this exam has been passed and not expired.
        "taken": "A String", # The date the user last taken this exam.
        "lastPassed": "A String", # The date the user last passed this exam.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="updateProfile">updateProfile(body, requestMetadata_userOverrides_ipAddress=None, requestMetadata_trafficSource_trafficSubId=None, requestMetadata_userOverrides_userId=None, x__xgafv=None, requestMetadata_locale=None, requestMetadata_experimentIds=None, requestMetadata_trafficSource_trafficSourceId=None, requestMetadata_partnersSessionId=None)</code>
  <pre>Updates a user's profile. A user can only update their own profile and
should only be called within the context of a logged in user.

Args:
  body: object, The request body. (required)
    The object takes the form of:

{ # The profile information of a Partners user.
    "industries": [ # A list of ids representing which industries the user selected.
      "A String",
    ],
    "primaryCountryCode": "A String", # The user's primary country, an ISO 2-character code.
    "adwordsManagerAccount": "A String", # If the user has edit access to multiple accounts, the user can choose the
        # preferred account and it is used when a personal account is needed. Can
        # be empty.
    "languages": [ # The list of languages this user understands.
      "A String",
    ],
    "markets": [ # A list of ids representing which markets the user was interested in.
      "A String",
    ],
    "emailOptIns": { # A set of opt-ins for a user. # The list of opt-ins for the user, related to communication preferences.
      "specialOffers": True or False, # An opt-in about receiving email regarding new features and products.
      "marketComm": True or False, # An opt-in about receiving email from Partners marketing teams. Includes
          # member-only events and special promotional offers for Google products.
      "phoneContact": True or False, # An opt-in to allow recieivng phone calls about their Partners account.
      "physicalMail": True or False, # An opt-in to receive special promotional gifts and material in the mail.
      "performanceSuggestions": True or False, # An opt-in about receiving email with customized AdWords campaign management
          # tips.
    },
    "familyName": "A String", # The user's family name.
    "channels": [ # A list of ids representing which channels the user selected they were in.
      "A String",
    ],
    "emailAddress": "A String", # The email address the user has selected on the Partners site as primary.
    "address": { # A location with address and geographic coordinates. May optionally contain a # The user's mailing address, contains multiple fields.
        # 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.
    },
    "phoneNumber": "A String", # The user's phone number.
    "givenName": "A String", # The user's given name.
    "jobFunctions": [ # A list of ids represnting which job categories the user selected.
      "A String",
    ],
    "profilePublic": True or False, # Whether the user's public profile is visible to anyone with the URL.
  }

  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
  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.

Returns:
  An object of the form:

    { # The profile information of a Partners user.
      "industries": [ # A list of ids representing which industries the user selected.
        "A String",
      ],
      "primaryCountryCode": "A String", # The user's primary country, an ISO 2-character code.
      "adwordsManagerAccount": "A String", # If the user has edit access to multiple accounts, the user can choose the
          # preferred account and it is used when a personal account is needed. Can
          # be empty.
      "languages": [ # The list of languages this user understands.
        "A String",
      ],
      "markets": [ # A list of ids representing which markets the user was interested in.
        "A String",
      ],
      "emailOptIns": { # A set of opt-ins for a user. # The list of opt-ins for the user, related to communication preferences.
        "specialOffers": True or False, # An opt-in about receiving email regarding new features and products.
        "marketComm": True or False, # An opt-in about receiving email from Partners marketing teams. Includes
            # member-only events and special promotional offers for Google products.
        "phoneContact": True or False, # An opt-in to allow recieivng phone calls about their Partners account.
        "physicalMail": True or False, # An opt-in to receive special promotional gifts and material in the mail.
        "performanceSuggestions": True or False, # An opt-in about receiving email with customized AdWords campaign management
            # tips.
      },
      "familyName": "A String", # The user's family name.
      "channels": [ # A list of ids representing which channels the user selected they were in.
        "A String",
      ],
      "emailAddress": "A String", # The email address the user has selected on the Partners site as primary.
      "address": { # A location with address and geographic coordinates. May optionally contain a # The user's mailing address, contains multiple fields.
          # 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.
      },
      "phoneNumber": "A String", # The user's phone number.
      "givenName": "A String", # The user's given name.
      "jobFunctions": [ # A list of ids represnting which job categories the user selected.
        "A String",
      ],
      "profilePublic": True or False, # Whether the user's public profile is visible to anyone with the URL.
    }</pre>
</div>

</body></html>