The upstream changed this person's address
const url = 'https://your-tenant-host/v1/id/upstream/change-identifier';const options = { method: 'POST', headers: { 'x-edgekit-site-id': 'site_example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"subject":"legacy-1001","email":"new@example.com","changedAt":"2026-08-03T09:00:00.000Z","emailVerified":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://your-tenant-host/v1/id/upstream/change-identifier \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'x-edgekit-site-id: site_example' \ --data '{ "subject": "legacy-1001", "email": "new@example.com", "changedAt": "2026-08-03T09:00:00.000Z", "emailVerified": true }'Replaces verify-then-swap in the migration modes. Anything not strictly newer than the change already recorded is ignored, so a retry is safe and cannot undo a fresher observation. A collision with a live user is refused and never merged, and leaves a durable conflict record. Sessions are not revoked: lock and password reset have their own event whose effect is revocation.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”The site this request is for, within this tenant. Every official EdgeKit SDK sets it from the client you configured; set it yourself only when calling this API directly.
Example
site_exampleThe site this request is for, within this tenant. Every official EdgeKit SDK sets it from the client you configured; set it yourself only when calling this API directly.
Request Bodyrequired
Section titled “Request Bodyrequired”object
The sub the identity provider issues for this person.
Example
legacy-1001Example
new@example.comWhen the upstream system recorded the change.
Example
2026-08-03T09:00:00.000ZResponses
Section titled “Responses”The address moved, or the push was older than what is held.
object
Example
{ "success": true, "userId": "01926f3a-8b4c-7d2e-9f10-2a3b4c5d6e7f", "applied": true}Invalid request.
object
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." }}Missing or invalid credential.
object
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." }}Not allowed.
object
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." }}Resource not found.
object
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." }}Conflicts with an existing record.
object
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." }}Request validation failed.
object
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." }}Unexpected error.
object
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." }}With Retry-After, briefly unavailable; without it, not configured.
object
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." }}