Skip to content

Conversation

@ePaul
Copy link
Member

@ePaul ePaul commented Oct 7, 2025

Triggered by a discussion in an internal chat (internal link), this makes it clearer which of the compatibility rules apply for input and output schemas, respectively.

@ePaul ePaul added the editorial label Oct 7, 2025
* Never change the semantic of fields (e.g. changing the semantic from
customer-number to customer-id, as both are different unique customer keys)
customer-number to customer-id, as both are different unique customer keys)
* Consider <<251>> in case a URL has to change.
Copy link
Member Author

@ePaul ePaul Oct 7, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This pointed wrongly to rule 250 before. (251 was originally added as 250 in #762 to a feature branch, but then #759 adding 250 was merged first to main before #781 renamed it and merged it into main.)

I also have a separate PR #852 to fix just this (already merged).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@ePaul ePaul force-pushed the compatibility-separately-for-input-output branch from 7154a27 to 099c0c6 Compare October 8, 2025 08:47
@ePaul ePaul added the major Major feature changes or updates, e.g. feature rollout to a new country, new API calls. label Oct 8, 2025
Copy link
Member

@tfrauenstein tfrauenstein left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for providing more clarity on compatible changes -- it is needed.
I provided some change proposals to further enhance clarity and avoid redundancies.


API designers should apply the following rules to evolve RESTful APIs for
services in a backward-compatible way:
services in a backward-compatible way.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
services in a backward-compatible way.
services in a compatible way.


* Add only optional, never mandatory fields.
* Never change the semantic of fields (e.g. changing the semantic from
customer-number to customer-id, as both are different unique customer keys)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
customer-number to customer-id, as both are different unique customer keys)
customer-number to customer-id, both being unique, but different customer keys)

* Never change the semantic of fields (e.g. changing the semantic from
customer-number to customer-id, as both are different unique customer keys)
customer-number to customer-id, as both are different unique customer keys)
* Consider <<251>> in case a URL has to change.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

* Never change the semantic of fields (e.g. changing the semantic from
customer-number to customer-id, as both are different unique customer keys)
* Consider <<251>> in case a URL has to change.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The compatibility of schema changes depends on whether the input and/or output objects are defined.

customer-number to customer-id, as both are different unique customer keys)
* Consider <<251>> in case a URL has to change.

For schemas used in input only:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
For schemas used in input only:
For schemas only used for *input objects*:

it then would allow later to add a same-named field with different type
or semantic (which is harder to catch). Therefore, this is also considered a non-compatible change.
* `enum` ranges can be reduced when used as output.
* `enum` ranges **cannot** be extended when used for output — clients may
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* `enum` ranges **cannot** be extended when used for output — clients may
* `enum` ranges *cannot* be extended — clients may

* You <<112>> that are used for output parameters and likely to
be extended with growing functionality. The API definition should be updated
first before returning new values.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
(*) Hint: Removing an optional field can be considered as a compatible change that does not break clients. However, removed fields allow later adding a same-named field with different type or semantic (which is harder to catch). We therefore define optional field removal as non-compatible.

be extended with growing functionality. The API definition should be updated
first before returning new values.

For schemas used in both input and output (which is common and recommended in
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
For schemas used in both input and output (which is common and recommended in
For schemas used in both input and output (which is typical in

Comment on lines +89 to 99
* Add only optional, never mandatory fields.
* Don't remove any fields.
* Don't make mandatory fields optional or make optional fields mandatory.
* Input fields may have (complex) constraints being validated via server-side
business logic. Never change the validation logic to be more restrictive and
make sure that all constraints are clearly defined in description.
* `enum` ranges can be reduced only if the server is ready to still accept and
handle old values. They **cannot** be extended.
* You <<112>> that are used for output parameters and likely to
be extended with growing functionality. The API definition should be updated
first before returning new values.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* Add only optional, never mandatory fields.
* Don't remove any fields.
* Don't make mandatory fields optional or make optional fields mandatory.
* Input fields may have (complex) constraints being validated via server-side
business logic. Never change the validation logic to be more restrictive and
make sure that all constraints are clearly defined in description.
* `enum` ranges can be reduced only if the server is ready to still accept and
handle old values. They **cannot** be extended.
* You <<112>> that are used for output parameters and likely to
be extended with growing functionality. The API definition should be updated
first before returning new values.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is is a consequence of the sentence before, and redundant -- should be omitted.

* Consider <<251>> in case a URL has to change.

Input/Output here is from the perspective of a service implementing and
owning the API. For the rare case of APIs implemented by other services
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
owning the API. For the rare case of APIs implemented by other services
owning the API. For the rare case of call-back APIs implemented by other services

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

editorial major Major feature changes or updates, e.g. feature rollout to a new country, new API calls.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants