x-partner-id is not required because the token identifies the customer.
x-api-key: <api_key>
x-external-user-id: <external_user_id>
Authorization: Bearer <access_token>
Authorization header with x-api-key and x-external-user-id.
Get profile
| Method | Endpoint | Auth |
|---|---|---|
GET | /users/me | Partner API key + External user ID, or Customer access token |
curl https://dev-api.keystonecommerce.in/api/v1/users/me \
-H "Authorization: Bearer <access_token>"
{
"statusCode": 200,
"message": "Success",
"data": {
"id": "cmr928qjc000002s6nh2ufmo2",
"partnerId": "<partner_id>",
"phone": "<customer_phone>",
"name": "<customer_name>",
"email": "<customer_email>",
"role": "USER",
"addresses": []
}
}
Update profile
| Method | Endpoint | Auth |
|---|---|---|
PATCH | /users/me | Partner API key + External user ID, or Customer access token |
curl -X PATCH https://dev-api.keystonecommerce.in/api/v1/users/me \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"name":"<customer_name>","email":"<customer_email>"}'
{
"statusCode": 200,
"message": "Success",
"data": {
"id": "cmr928qjc000002s6nh2ufmo2",
"partnerId": "<partner_id>",
"phone": "<customer_phone>",
"name": "<customer_name>",
"email": "<customer_email>",
"role": "USER"
}
}
List addresses
| Method | Endpoint | Auth |
|---|---|---|
GET | /users/me/addresses | Partner API key + External user ID, or Customer access token |
curl https://dev-api.keystonecommerce.in/api/v1/users/me/addresses \
-H "Authorization: Bearer <access_token>"
{
"statusCode": 200,
"message": "Success",
"data": [
{
"id": "cmr928qzz000202s6f59zezkm",
"userId": "cmr928qjc000002s6nh2ufmo2",
"label": "Home",
"line1": "221B MG Road",
"line2": "Near Trinity Metro",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001",
"landmark": "Near Trinity Metro",
"isDefault": true
}
]
}
Create address
| Method | Endpoint | Auth |
|---|---|---|
POST | /users/me/addresses | Partner API key + External user ID, or Customer access token |
curl -X POST https://dev-api.keystonecommerce.in/api/v1/users/me/addresses \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{
"recipientName": "Aarav Sharma",
"recipientPhone": "9876543210",
"label": "Home",
"line1": "221B MG Road",
"line2": "Near Trinity Metro",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001",
"landmark": "Near Trinity Metro",
"isDefault": true
}'
{
"statusCode": 200,
"message": "Success",
"data": {
"id": "cmr928qzz000202s6f59zezkm",
"recipientName": "Aarav Sharma",
"recipientPhone": "9876543210",
"label": "Home",
"line1": "221B MG Road",
"line2": "Near Trinity Metro",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001",
"landmark": "Near Trinity Metro",
"isDefault": true
}
}
recipientName, recipientPhone, label, line1, city, state, pincode, and landmark.
| Field | Notes |
|---|---|
recipientName | Up to 80 characters |
recipientPhone | 10 digits |
alternatePhone | Optional, 10 digits |
label | Up to 40 characters |
line1 | Up to 160 characters |
line2 | Optional, up to 240 characters |
city | Up to 80 characters |
state | An Indian state or union territory name, up to 80 characters, for example Karnataka |
stateCode | Optional 2-digit GST state code. It must match state, for example 29 for Karnataka |
pincode | 6-digit Indian pincode |
landmark | Up to 160 characters, not blank |
googlePlaceId, latitude, longitude, formattedAddress | Optional location details. formattedAddress accepts up to 500 characters. |
deliveryInstructions | Optional, up to 500 characters |
isDefault | Optional. The first address is always the default. To change the default, set isDefault: true on another address; isDefault: false on the current default has no effect. Deleting the default address makes the most recently updated remaining address the default. |
Update address
| Method | Endpoint | Auth |
|---|---|---|
PATCH | /users/me/addresses/{addressId} | Partner API key + External user ID, or Customer access token |
curl -X PATCH https://dev-api.keystonecommerce.in/api/v1/users/me/addresses/cmr928qzz000202s6f59zezkm \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"label":"Work","line2":"Floor 4"}'
{
"statusCode": 200,
"message": "Success",
"data": {
"id": "cmr928qzz000202s6f59zezkm",
"label": "Work",
"line1": "221B MG Road",
"line2": "Floor 4",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001",
"landmark": "Near Trinity Metro",
"isDefault": true
}
}
Delete address
| Method | Endpoint | Auth |
|---|---|---|
DELETE | /users/me/addresses/{addressId} | Partner API key + External user ID, or Customer access token |
curl -X DELETE https://dev-api.keystonecommerce.in/api/v1/users/me/addresses/cmr928qzz000202s6f59zezkm \
-H "Authorization: Bearer <access_token>"
{
"statusCode": 200,
"message": "Success",
"data": {
"id": "cmr928qzz000202s6f59zezkm",
"label": "Work",
"line1": "221B MG Road",
"line2": "Floor 4",
"city": "Bengaluru",
"state": "Karnataka",
"pincode": "560001",
"landmark": "Near Trinity Metro",
"isDefault": true
}
}
Accept terms
Record the customer’s acceptance of the current terms version.| Method | Endpoint | Auth |
|---|---|---|
POST | /users/me/terms-acceptance | Partner API key + External user ID, or Customer access token |
curl -X POST https://dev-api.keystonecommerce.in/api/v1/users/me/terms-acceptance \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json" \
-d '{"version":"2026-07-v1"}'
{
"statusCode": 200,
"message": "Success",
"data": {
"id": "cmr928qjc000002s6nh2ufmo2",
"partnerId": "<partner_id>",
"termsVersion": "2026-07-v1",
"termsAcceptedAt": "2026-08-05T10:00:00.000Z"
}
}