I feel this thread derailed a little bit from the original topic.
If I got @mattjmorrison right, his main requirement as a create or update pattern:
For example, I have a partner using my API and they want to send some configuration data to my API. That configuration data may change over time in which case I want them to send me the new configuration data. I do not want to put the burden on them to keep track of if they need to use a POST (to create) or a PATCH (to update) that resource.
The main point seems to be that the client should not need to know if a resource already exists. Not that much if an update is a full-replacement or applies the changes to an existing resource.
This use case has a very specific prerequisite, which is not explicitly called out: It must use client-generated IDs. Only that allows the server to decide if the resource already exists or not.
Typically UUIDs are used as client-generated IDs. Doing so is also recommended by the JSON:API specification:
9.1.1 Client-Generated IDs
A server MAY accept a client-generated ID along with a request to create a resource. An ID MUST be specified with an id
key, the value of which MUST be a universally unique identifier. The client SHOULD use a properly generated and formatted UUID as described in RFC 4122 [RFC4122].
JSON:API — Latest Specification (v1.1)
But the use case described by @mattjmorrison has some additional specifics: The client-generated IDs must be stable over time. And two independent clients must generate the same ID for representing the same entity. This is not supported using UUIDs.
The JSON:API specification mentions one exception in which it may be possible to use client-generated IDs, which are not UUIDs: importing data from another source.
NOTE: In some use-cases, such as importing data from another source, it may be possible to use something other than a UUID that is still guaranteed to be globally unique. Do not use anything other than a UUID unless you are 100% confident that the strategy you are using indeed generates globally unique identifiers.
In my experience this is a rare case. Therefore I’m not confident that it should be supported by the base specification itself. Implementing it as an extension seems to be the way to go.