AI-generated Key Takeaways
-
The Ad Manager API uses both named Major version releases and backward compatible in-place releases.
-
Services, methods, and fields can be marked as deprecated but remain supported until the Major version is retired.
-
Major version releases involve backward incompatible changes and have different API endpoints.
-
Backward compatible changes, including new features and bug fixes, are released in-place to the current Major API version.
-
Backward compatibility within a Major version is defined by source, wire, and semantic compatibility.
The Ad Manager API has both named Major version releases and backward compatible in-place releases to the current Major version.
Services, methods, and fields could be marked as deprecated at any time within a Major version (e.g. v1), however, they will remain supported until that Major version is retired.
Major version releases
A Major version release is defined as a release with backward incompatible API changes. These releases will be named and have different API endpoints. Previous Major versions are supported for a migration period.
The Ad Manager API does not have a regular release cadence for Major versions. New Major versions will only be released when necessary.
In-place releases
Backward compatible changes including new features and bug fixes are released in-place to the current Major API version. Clients must handle unknown fields in API responses.
Backward Compatibility
Backward compatibility is maintained for changes within a Major version. Compatibility is defined as:
-
Source compatibility: Code written against a previous release compiles against a newer release, and successfully runs with a newer version of the client library.
-
Wire compatibility: Code written against a previous release communicates correctly with a newer server. In other words, not only are inputs and outputs compatible, but the serialization and deserialization expectations continue to match.
-
Semantic compatibility: Code written against a previous version continues to receive what most reasonable developers would expect.
The following tables enumerate types of API changes and if they are considered backward compatible.
Services
| Type of Change | Backward compatible |
|---|---|
| Add a new service | Yes |
| Remove a service | No |
Methods
| Type of Change | Backward compatible |
|---|---|
| Add a new method | Yes |
| Remove a method | No |
| Change a method's request or response type | No |
Objects
| Type of Change | Backward compatible |
|---|---|
| Add a required field | No |
| Add an optional field | Yes |
| Moving a field into or out of a submessage | No |
| Change a field from required to optional | Yes |
| Change a field from optional to required | No |
| Remove an immutable restriction | Yes |
| Add an immutable restriction | No |
Enumerations
| Type of Change | Backward compatible |
|---|---|
| Add an enum value | Yes |
| Remove an enum value | No |
Deprecated field behavior
Replacement fields
For fields that have a replacement, both fields will be populated when feasible.
When updating, either field can be set. Including both fields in an update
request results in an INVALID_ARGUMENT
error.
Consider the following schema:
{
// The cost of this Foo in micros.
// Deprecated: Use `cost` instead.
"costMicros"
:
number
,
// The cost of this Foo.
"cost"
:
{
object
(
Money
)
}
}
A read response populates both fields with equivalent values:
{
"costMicros"
:
1250000
,
"cost"
:
{
"currencyCode"
:
"USD"
,
"units"
:
"1"
,
"nanos"
:
250000000
}
}
Update requests can set either value. Including both fields results in an INVALID_ARGUMENT
error:
costMicros
// Update payload
{
"costMicros"
:
1500000
}
// Response payload
{
"costMicros"
:
1500000
,
"cost"
:
{
"currencyCode"
:
"USD"
,
"units"
:
"1"
,
"nanos"
:
500000000
}
}
cost
// Update payload
{
"cost"
:
{
"currencyCode"
:
"USD"
,
"units"
:
"1"
,
"nanos"
:
500000000
}
}
// Response payload
{
"costMicros"
:
1500000
,
"cost"
:
{
"currencyCode"
:
"USD"
,
"units"
:
"1"
,
"nanos"
:
500000000
}
}
Both
// Update payload
{
"costMicros"
:
1250000
,
"cost"
:
{
"currencyCode"
:
"USD"
,
"units"
:
"1"
,
"nanos"
:
500000000
}
}
// Response payload
{
"error"
:
{
"code"
:
400
,
"message"
:
"Request contains an invalid argument."
,
"status"
:
"INVALID_ARGUMENT"
,
"details"
:
[
{
"@type"
:
"type.googleapis.com/google.rpc.BadRequest"
,
"fieldViolations"
:
[
{
"field"
:
"costMicros"
,
"description"
:
"Cannot update both costMicros and cost."
}
]
}
]
}
}
Discontinued features
If a product feature is discontinued, corresponding fields will be marked as deprecated and may return a semantically appropriate default value. Updates can be ignored.
{
// The salesperson split amount in micros.
// Deprecated: The Sales Management feature has been deprecated. This field
// will always be `0`.
"salespersonSplitMicros"
:
number
,
}

