Keeping passes updated is an important way to engage with your customers and
build a positive experience.

There are two resources that can be updated: The `EventClass` and the
`EventObject`.

## Best Practices

The following list contains helpful information to consider when updating your
event ticket classes and objects:

- When you want to update an entire class or object, send an `update` request. When you want to update a small number of fields in a class or object, send a `patch` request.
- When you make an `update` request, the entire object or class is updated. This means that any fields not included in the request will be cleared. Before sending an `update` request, we recommend you send a `GET` request to ensure you are working with the latest version and all of the intended fields are included in your request.
- When making a `patch` request, only the patched fields are updated. Before sending a `patch` request, consider optionally sending a `GET` request to compare your changes against the latest version.
- When making `patch` requests to update arrays, the original array is replaced with the one included in the request body. You cannot modify the elements in an array individually.
- In some cases, you may not know when changes happen, or when to trigger updates. Consider periodically scheduling `update` or `patch` requests for all classes and objects.

## Update a Passes Class

### Use the Google Wallet Business Console

Pass classes (not objects) can be modified directly in the
[Google Pay \& Wallet Console](https://goo.gle/wallet-console).

1. Navigate to the console
2. Select **Google Wallet API**
3. Select the class you want to modify
4. Select **Edit**
5. Update the class properties
6. Select **Save**

Once you save your changes, the class is updated automatically for any
eventticket holders.

### Use the Google Wallet API

Updating the `EventClass` affects all users who have been provisioned
event tickets using this class. For example, to update the logo for
your event tickets, you would submit an `update` or `patch` request to
the Google Wallet API at either of the following endpoints. The `resourceId`
value would be the class ID (`ISSUER_ID.CLASS_SUFFIX`).

    # Update
    PUT https://walletobjects.googleapis.com/walletobjects/v1/eventticketclass/{resourceId}

    # Patch
    PATCH https://walletobjects.googleapis.com/walletobjects/v1/eventticketclass/{resourceId}

> [!NOTE]
> **Note:** The `PATCH` method supports patch semantics.

For more information, see the
[API reference](https://developers.google.com/wallet/tickets/events/rest/v1/eventticketclass).

### Java


To start your integration in Java, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/java).

```java
/**
 * Update a class.
 *
 * <p><strong>Warning:</strong> This replaces all existing class attributes!
 *
 * @param issuerId The issuer ID being used for this request.
 * @param classSuffix Developer-defined unique ID for this pass class.
 * @return The pass class ID: "{issuerId}.{classSuffix}"
 */
public String updateClass(String issuerId, String classSuffix) throws IOException {
  EventTicketClass updatedClass;

  // Check if the class exists
  try {
    updatedClass =
        service.eventticketclass().get(String.format("%s.%s", issuerId, classSuffix)).execute();
  } catch (GoogleJsonResponseException ex) {
    if (ex.getStatusCode() == 404) {
      // Class does not exist
      System.out.printf("Class %s.%s not found!%n", issuerId, classSuffix);
      return String.format("%s.%s", issuerId, classSuffix);
    } else {
      // Something else went wrong...
      ex.printStackTrace();
      return String.format("%s.%s", issuerId, classSuffix);
    }
  }

  // Class exists
  // Update the class by adding a homepage
  updatedClass.setHomepageUri(
      new Uri()
          .setUri("https://developers.google.com/wallet")
          .setDescription("Homepage description"));

  // Note: reviewStatus must be 'UNDER_REVIEW' or 'DRAFT' for updates
  updatedClass.setReviewStatus("UNDER_REVIEW");

  EventTicketClass response =
      service
          .eventticketclass()
          .update(String.format("%s.%s", issuerId, classSuffix), updatedClass)
          .execute();

  System.out.println("Class update response");
  System.out.println(response.toPrettyString());

  return response.getId();
}
```

### PHP


To start your integration in PHP, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/php).

```php
/**
 * Update a class.
 *
 * **Warning:** This replaces all existing class attributes!
 *
 * @param string $issuerId The issuer ID being used for this request.
 * @param string $classSuffix Developer-defined unique ID for this pass class.
 *
 * @return string The pass class ID: "{$issuerId}.{$classSuffix}"
 */
public function updateClass(string $issuerId, string $classSuffix)
{
  // Check if the class exists
  try {
    $updatedClass = $this->service->eventticketclass->get("{$issuerId}.{$classSuffix}");
  } catch (Google\Service\Exception $ex) {
    if (!empty($ex->getErrors()) && $ex->getErrors()[0]['reason'] == 'classNotFound') {
      // Class does not exist
      print("Class {$issuerId}.{$classSuffix} not found!");
      return "{$issuerId}.{$classSuffix}";
    } else {
      // Something else went wrong...
      print_r($ex);
      return "{$issuerId}.{$classSuffix}";
    }
  }

  // Update the class by adding a homepage
  $updatedClass->setHomepageUri(new Uri([
    'uri' => 'https://developers.google.com/wallet',
    'description' => 'Homepage description'
  ]));

  // Note: reviewStatus must be 'UNDER_REVIEW' or 'DRAFT' for updates
  $updatedClass->setReviewStatus('UNDER_REVIEW');

  $response = $this->service->eventticketclass->update("{$issuerId}.{$classSuffix}", $updatedClass);

  print "Class update response\n";
  print_r($response);

  return $response->id;
}
```

### Python


To start your integration in Python, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/python).

```python
def update_class(self, issuer_id: str, class_suffix: str) -> str:
    """Update a class.

    **Warning:** This replaces all existing class attributes!

    Args:
        issuer_id (str): The issuer ID being used for this request.
        class_suffix (str): Developer-defined unique ID for this pass class.

    Returns:
        The pass class ID: f"{issuer_id}.{class_suffix}"
    """

    # Check if the class exists
    try:
        response = self.client.eventticketclass().get(resourceId=f'{issuer_id}.{class_suffix}').execute()
    except HttpError as e:
        if e.status_code == 404:
            print(f'Class {issuer_id}.{class_suffix} not found!')
            return f'{issuer_id}.{class_suffix}'
        else:
            # Something else went wrong...
            print(e.error_details)
            return f'{issuer_id}.{class_suffix}'

    # Class exists
    updated_class = response

    # Update the class by adding a homepage
    updated_class['homepageUri'] = {
        'uri': 'https://developers.google.com/wallet',
        'description': 'Homepage description'
    }

    # Note: reviewStatus must be 'UNDER_REVIEW' or 'DRAFT' for updates
    updated_class['reviewStatus'] = 'UNDER_REVIEW'

    response = self.client.eventticketclass().update(
        resourceId=f'{issuer_id}.{class_suffix}',
        body=updated_class).execute()

    print('Class update response')
    print(response)

    return f'{issuer_id}.{class_suffix}'
```

### C#


To start your integration in C#, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/dotnet).

```c#
/// <summary>
/// Update a class.
/// <para />
/// <strong>Warning:</strong> This replaces all existing class attributes!
/// </summary>
/// <param name="issuerId">The issuer ID being used for this request.</param>
/// <param name="classSuffix">Developer-defined unique ID for this pass class.</param>
/// <returns>The pass class ID: "{issuerId}.{classSuffix}"</returns>
public string UpdateClass(string issuerId, string classSuffix)
{
  // Check if the class exists
  Stream responseStream = service.Eventticketclass
      .Get($"{issuerId}.{classSuffix}")
      .ExecuteAsStream();

  StreamReader responseReader = new StreamReader(responseStream);
  JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  if (jsonResponse.ContainsKey("error"))
  {
    if (jsonResponse["error"].Value<int>("code") == 404)
    {
      // Class does not exist
      Console.WriteLine($"Class {issuerId}.{classSuffix} not found!");
      return $"{issuerId}.{classSuffix}";
    }
    else
    {
      // Something else went wrong...
      Console.WriteLine(jsonResponse.ToString());
      return $"{issuerId}.{classSuffix}";
    }
  }

  // Class exists
  EventTicketClass updatedClass = JsonConvert.DeserializeObject<EventTicketClass>(jsonResponse.ToString());

  // Update the class by adding a homepage
  updatedClass.HomepageUri = new Google.Apis.Walletobjects.v1.Data.Uri
  {
    UriValue = "https://developers.google.com/wallet",
    Description = "Homepage description"
  };

  // Note: reviewStatus must be 'UNDER_REVIEW' or 'DRAFT' for updates
  updatedClass.ReviewStatus = "UNDER_REVIEW";

  responseStream = service.Eventticketclass
      .Update(updatedClass, $"{issuerId}.{classSuffix}")
      .ExecuteAsStream();

  responseReader = new StreamReader(responseStream);
  jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  Console.WriteLine("Class update response");
  Console.WriteLine(jsonResponse.ToString());

  return $"{issuerId}.{classSuffix}";
}
```

### Node.js


To start your integration in Node, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/nodejs).

```javascript
/**
 * Update a class.
 *
 * **Warning:** This replaces all existing class attributes!
 *
 * @param {string} issuerId The issuer ID being used for this request.
 * @param {string} classSuffix Developer-defined unique ID for this pass class.
 *
 * @returns {string} The pass class ID: `${issuerId}.${classSuffix}`
 */
async updateClass(issuerId, classSuffix) {
  let response;

  // Check if the class exists
  try {
    response = await this.client.eventticketclass.get({
      resourceId: `${issuerId}.${classSuffix}`
    });
  } catch (err) {
    if (err.response && err.response.status === 404) {
      console.log(`Class ${issuerId}.${classSuffix} not found!`);
      return `${issuerId}.${classSuffix}`;
    } else {
      // Something else went wrong...
      console.log(err);
      return `${issuerId}.${classSuffix}`;
    }
  }

  // Class exists
  let updatedClass = response.data;

  // Update the class by adding a homepage
  updatedClass['homepageUri'] = {
    'uri': 'https://developers.google.com/wallet',
    'description': 'Homepage description'
  };

  // Note: reviewStatus must be 'UNDER_REVIEW' or 'DRAFT' for updates
  updatedClass['reviewStatus'] = 'UNDER_REVIEW';

  response = await this.client.eventticketclass.update({
    resourceId: `${issuerId}.${classSuffix}`,
    requestBody: updatedClass
  });

  console.log('Class update response');
  console.log(response);

  return `${issuerId}.${classSuffix}`;
}
```

## Update a Passes Object

Updating an individual `EventObject` affects only the user who has been
provisioned that specific object. You should regularly update individual
event tickets to reflect changes that affect your customers and keep
them engaged. The `resourceId` value would be the object ID
(`ISSUER_ID.OBJECT_SUFFIX`).

    # Update
    PUT https://walletobjects.googleapis.com/walletobjects/v1/eventticketobject/{resourceId}

    # Patch
    PATCH https://walletobjects.googleapis.com/walletobjects/v1/eventticketobject/{resourceId}

For more information, see the
[API reference](https://developers.google.com/wallet/tickets/events/rest/v1/eventticketobject).

### Java


To start your integration in Java, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/java).

```java
/**
 * Update an object.
 *
 * <p><strong>Warning:</strong> This replaces all existing object attributes!
 *
 * @param issuerId The issuer ID being used for this request.
 * @param objectSuffix Developer-defined unique ID for this pass object.
 * @return The pass object ID: "{issuerId}.{objectSuffix}"
 */
public String updateObject(String issuerId, String objectSuffix) throws IOException {
  EventTicketObject updatedObject;

  // Check if the object exists
  try {
    updatedObject =
        service.eventticketobject().get(String.format("%s.%s", issuerId, objectSuffix)).execute();
  } catch (GoogleJsonResponseException ex) {
    if (ex.getStatusCode() == 404) {
      // Object does not exist
      System.out.printf("Object %s.%s not found!%n", issuerId, objectSuffix);
      return String.format("%s.%s", issuerId, objectSuffix);
    } else {
      // Something else went wrong...
      ex.printStackTrace();
      return String.format("%s.%s", issuerId, objectSuffix);
    }
  }

  // Object exists
  // Update the object by adding a link
  Uri newLink =
      new Uri()
          .setUri("https://developers.google.com/wallet")
          .setDescription("New link description");

  if (updatedObject.getLinksModuleData() == null) {
    // LinksModuleData was not set on the original object
    updatedObject.setLinksModuleData(new LinksModuleData().setUris(List.of(newLink)));
  } else {
    updatedObject.getLinksModuleData().getUris().add(newLink);
  }

  EventTicketObject response =
      service
          .eventticketobject()
          .update(String.format("%s.%s", issuerId, objectSuffix), updatedObject)
          .execute();

  System.out.println("Object update response");
  System.out.println(response.toPrettyString());

  return response.getId();
}
```

### PHP


To start your integration in PHP, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/php).

```php
/**
 * Update an object.
 *
 * **Warning:** This replaces all existing object attributes!
 *
 * @param string $issuerId The issuer ID being used for this request.
 * @param string $objectSuffix Developer-defined unique ID for this pass object.
 *
 * @return string The pass object ID: "{$issuerId}.{$objectSuffix}"
 */
public function updateObject(string $issuerId, string $objectSuffix)
{
  // Check if the object exists
  try {
    $updatedObject = $this->service->eventticketobject->get("{$issuerId}.{$objectSuffix}");
  } catch (Google\Service\Exception $ex) {
    if (!empty($ex->getErrors()) && $ex->getErrors()[0]['reason'] == 'resourceNotFound') {
      print("Object {$issuerId}.{$objectSuffix} not found!");
      return "{$issuerId}.{$objectSuffix}";
    } else {
      // Something else went wrong...
      print_r($ex);
      return "{$issuerId}.{$objectSuffix}";
    }
  }

  // Update the object by adding a link
  $newLink = new Uri([
    'uri' => 'https://developers.google.com/wallet',
    'description' => 'New link description'
  ]);

  $linksModuleData = $updatedObject->getLinksModuleData();
  if (is_null($linksModuleData)) {
    // LinksModuleData was not set on the original object
    $linksModuleData = new LinksModuleData([
      'uris' => []
    ]);
  }
  $uris = $linksModuleData->getUris();
  array_push(
    $uris,
    $newLink
  );
  $linksModuleData->setUris($uris);

  $updatedObject->setLinksModuleData($linksModuleData);

  $response = $this->service->eventticketobject->update("{$issuerId}.{$objectSuffix}", $updatedObject);

  print "Object update response\n";
  print_r($response);

  return $response->id;
}
```

### Python


To start your integration in Python, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/python).

```python
def update_object(self, issuer_id: str, object_suffix: str) -> str:
    """Update an object.

    **Warning:** This replaces all existing object attributes!

    Args:
        issuer_id (str): The issuer ID being used for this request.
        object_suffix (str): Developer-defined unique ID for the pass object.

    Returns:
        The pass object ID: f"{issuer_id}.{object_suffix}"
    """

    # Check if the object exists
    try:
        response = self.client.eventticketobject().get(resourceId=f'{issuer_id}.{object_suffix}').execute()
    except HttpError as e:
        if e.status_code == 404:
            print(f'Object {issuer_id}.{object_suffix} not found!')
            return f'{issuer_id}.{object_suffix}'
        else:
            # Something else went wrong...
            print(e.error_details)
            return f'{issuer_id}.{object_suffix}'

    # Object exists
    updated_object = response

    # Update the object by adding a link
    new_link = {
        'uri': 'https://developers.google.com/wallet',
        'description': 'New link description'
    }
    if not updated_object.get('linksModuleData'):
        updated_object['linksModuleData'] = {'uris': []}
    updated_object['linksModuleData']['uris'].append(new_link)

    response = self.client.eventticketobject().update(
        resourceId=f'{issuer_id}.{object_suffix}',
        body=updated_object).execute()

    print('Object update response')
    print(response)

    return f'{issuer_id}.{object_suffix}'
```

### C#


To start your integration in C#, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/dotnet).

```c#
/// <summary>
/// Update an object.
/// <para />
/// <strong>Warning:</strong> This replaces all existing class attributes!
/// </summary>
/// <param name="issuerId">The issuer ID being used for this request.</param>
/// <param name="objectSuffix">Developer-defined unique ID for this pass object.</param>
/// <returns>The pass object ID: "{issuerId}.{objectSuffix}"</returns>
public string UpdateObject(string issuerId, string objectSuffix)
{
  // Check if the object exists
  Stream responseStream = service.Eventticketobject
      .Get($"{issuerId}.{objectSuffix}")
      .ExecuteAsStream();

  StreamReader responseReader = new StreamReader(responseStream);
  JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  if (jsonResponse.ContainsKey("error"))
  {
    if (jsonResponse["error"].Value<int>("code") == 404)
    {
      // Object does not exist
      Console.WriteLine($"Object {issuerId}.{objectSuffix} not found!");
      return $"{issuerId}.{objectSuffix}";
    }
    else
    {
      // Something else went wrong...
      Console.WriteLine(jsonResponse.ToString());
      return $"{issuerId}.{objectSuffix}";
    }
  }

  // Object exists
  EventTicketObject updatedObject = JsonConvert.DeserializeObject<EventTicketObject>(jsonResponse.ToString());

  // Update the object by adding a link
  Google.Apis.Walletobjects.v1.Data.Uri newLink = new Google.Apis.Walletobjects.v1.Data.Uri
  {
    UriValue = "https://developers.google.com/wallet",
    Description = "New link description"
  };

  if (updatedObject.LinksModuleData == null)
  {
    // LinksModuleData was not set on the original object
    updatedObject.LinksModuleData = new LinksModuleData
    {
      Uris = new List<Google.Apis.Walletobjects.v1.Data.Uri>()
    };
  }
  updatedObject.LinksModuleData.Uris.Add(newLink);

  responseStream = service.Eventticketobject
      .Update(updatedObject, $"{issuerId}.{objectSuffix}")
      .ExecuteAsStream();

  responseReader = new StreamReader(responseStream);
  jsonResponse = JObject.Parse(responseReader.ReadToEnd());

  Console.WriteLine("Object update response");
  Console.WriteLine(jsonResponse.ToString());

  return $"{issuerId}.{objectSuffix}";
}
```

### Node.js


To start your integration in Node, refer to our complete
[code samples on GitHub](https://github.com/google-wallet/rest-samples/tree/main/nodejs).

```javascript
/**
 * Update an object.
 *
 * **Warning:** This replaces all existing object attributes!
 *
 * @param {string} issuerId The issuer ID being used for this request.
 * @param {string} objectSuffix Developer-defined unique ID for the pass object.
 *
 * @returns {string} The pass object ID: `${issuerId}.${objectSuffix}`
 */
async updateObject(issuerId, objectSuffix) {
  let response;

  // Check if the object exists
  try {
    response = await this.client.eventticketobject.get({
      resourceId: `${issuerId}.${objectSuffix}`
    });
  } catch (err) {
    if (err.response && err.response.status === 404) {
      console.log(`Object ${issuerId}.${objectSuffix} not found!`);
      return `${issuerId}.${objectSuffix}`;
    } else {
      // Something else went wrong...
      console.log(err);
      return `${issuerId}.${objectSuffix}`;
    }
  }

  // Object exists
  let updatedObject = response.data;

  // Update the object by adding a link
  let newLink = {
    'uri': 'https://developers.google.com/wallet',
    'description': 'New link description'
  }
  if (updatedObject['linksModuleData'] === undefined) {
    updatedObject['linksModuleData'] = {
      'uris': [newLink]
    };
  } else {
    updatedObject['linksModuleData']['uris'].push(newLink);
  }

  response = await this.client.eventticketobject.update({
    resourceId: `${issuerId}.${objectSuffix}`,
    requestBody: updatedObject
  });

  console.log('Object update response');
  console.log(response);

  return `${issuerId}.${objectSuffix}`;
}
```