Skip to content
Indiana
Dashboard
Docs
Browse docs / Update a customer

Update a customer

POST/api/v1/customers/update

Update a profile with revision checks and a stable requestId. Update attributes, delete named keys with removeAttributes, and change tags incrementally with tagChanges.

SDK 0.0.1Updated

Make the request

Update a profile with revision checks and a stable requestId. Update attributes, delete named keys with removeAttributes, and change tags incrementally with tagChanges.

Credential
Server API key only. Call from your trusted backend.
Permission
customers:write
Set the base URL and App ID from SDK setup. These examples use placeholders and do not execute requests. Never put a server key in browser code.
request.shShell
curl -X POST "$GROOVE_BASE_URL/api/v1/customers/update" \  -H "Authorization: Bearer $GROOVE_SECRET_KEY" \  -H "X-Groove-Project: $GROOVE_PROJECT_ID" \  -H "X-Groove-Environment: sandbox" \  -H "Content-Type: application/json" \  -d '{  "lookup": {    "type": "id",    "value": "00000000-0000-4000-8000-000000000001"  },  "revision": 0,  "requestId": "00000000-0000-4000-8000-000000000001",  "patch": {    "name": "Alex",    "attributes": {      "source": "website"    }  }}'

The response tab lists field types, not an example payload. Actual values depend on customer state.

Request parameters

JSON body

lookupobject | objectRequired

Set type to id or externalUserId and supply the corresponding value.

Show child fields
type"id" | "externalUserId"Required

The type value for this operation. Its accepted type and constraints are listed above and below.

valueuuid | stringRequired

The value value for this operation. Its accepted type and constraints are listed above and below.

revisionintegerRequired

Revision returned by profile reads; updates use it to detect concurrent changes.

min: 0 · max: 9007199254740991

requestIduuidRequired

Business request UUID. Reuse for retries of one operation; generate a new value for a new operation.

patchobjectRequired

Submit only changed profile fields. Use attributes for JSON values, removeAttributes to delete keys, and tagChanges for incremental tag updates.

Show child fields
namestringOptional

Display name of the customer or object; not an identity key.

maxLength: 80

emailemail | ""Optional

Customer contact email; not used to merge customer identities.

attributesobjectOptional

Up to 128 keys, 1–128 characters each, and 64 KiB total JSON. Values may contain nested JSON, limited to 20 levels and 10,000 nodes per value. Reserved fields are rejected. Null is a value; delete keys with removeAttributes. Tags live in attributes.tags and change through tagChanges.

removeAttributesarrayOptional

Explicit attribute keys to delete: up to 128, excluding tags. Names start with a letter and contain only letters, digits and underscores.

maxItems: 128

tagChangesobjectOptional

Use add and remove arrays to change tags. patch.attributes cannot overwrite tags directly.

Show child fields
addarrayRequired

The add value for this operation. Its accepted type and constraints are listed above and below.

maxItems: 20

removearrayRequired

The remove value for this operation. Its accepted type and constraints are listed above and below.

maxItems: 20

Response fields

Successful responses include requestId and scope. Use the actual business status or accepted field to determine the result. Optional fields are omitted when unavailable.

HTTP 200 · application/json

requestIduuidRequired

Server-generated HTTP request UUID. Include it when reporting a failed request.

scopeobjectRequired

The App and environment of this response. Headers only verify scope; they cannot switch key scope.

Show child fields
projectIdstringRequired

App ID bound to the credential.

minLength: 1

environmentenumRequired

Separate data scope: sandbox or live.

Show allowed values

"sandbox""live"

customerobjectRequired

Customer profile object.

Show child fields
iduuidRequired

The id value for this operation. Its accepted type and constraints are listed above and below.

externalUserIdstring | nullRequired

Stable user ID from your server-authenticated login system, not an email address. null for a customer reserved by email and not yet claimed.

namestringRequired

Display name of the customer or object; not an identity key.

maxLength: 80

emailemail | ""Required

Customer contact email; not used to merge customer identities.

attributesobjectRequired

Up to 128 keys, 1–128 characters each, and 64 KiB total JSON. Values may contain nested JSON, limited to 20 levels and 10,000 nodes per value. Reserved fields are rejected. Null is a value; delete keys with removeAttributes. Tags live in attributes.tags and change through tagChanges.

revisionintegerRequired

Revision returned by profile reads; updates use it to detect concurrent changes.

min: 0 · max: 9007199254740991

createdAtdate-timeRequired

ISO 8601 UTC time when the record was created.

updatedAtdate-timeRequired

ISO 8601 UTC time of the last record update.

changedbooleanRequired

The changed value for this operation. Its accepted type and constraints are listed above and below.

replayedbooleanRequired

The replayed value for this operation. Its accepted type and constraints are listed above and below.

Handle errors

Common failures
CodeRecovery
UNAUTHENTICATEDVerify the key or refresh the expired customer token once.
FORBIDDENCheck current key permissions and customer access.
INVALID_REQUESTCheck field types, UUIDs, decimal strings and mutually exclusive fields.
SCOPE_MISMATCHUse the App and environment bound to the credential.

Common failures

  • UNAUTHENTICATED

    Recovery
    Verify the key or refresh the expired customer token once.
  • FORBIDDEN

    Recovery
    Check current key permissions and customer access.
  • INVALID_REQUEST

    Recovery
    Check field types, UUIDs, decimal strings and mutually exclusive fields.
  • SCOPE_MISMATCH

    Recovery
    Use the App and environment bound to the credential.

Related:All request and error conventions·Back to endpoint index