To create unconditionally, POST the resource JSON to {base}/{ResourceType} and capture the server-assigned id from the Location header or the returned resource.
For a conditional create, add the header If-None-Exist with a search query string (e.g. identifier=system|value); the server creates the resource only if no match is found, otherwise returns the existing resource with 200.
For a conditional update (upsert), send a PUT to {base}/{ResourceType}?identifier=system|value; the server creates if absent or updates if exactly one match exists.
Include a resource.identifier with a system URI and value that is stable and externally meaningful so future conditional operations can find the same record.
Check the HTTP response code: 201 means created, 200 means matched and returned (or updated), 412 means multiple matches were found and the operation was rejected.
Wrap multiple related creates in a FHIR transaction Bundle (Bundle.type=transaction) so they succeed or fail atomically.
Known gotchas
A 412 Precondition Failed on conditional create means your search matched more than one resource; you must resolve the ambiguity before retrying.
Not all servers support conditional operations; check the CapabilityStatement rest[].resource[].conditionalCreate flag before depending on this pattern.
Server-assigned ids are not portable across systems; always carry your own business identifier and use conditional logic rather than assuming a known id.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp