List locations
/v1/practices/{practiceId}/locationsRequires locations:read on a practice key or an authorized platform key. Lists active and archived locations by name, with cursor pagination. Use status to filter. Location records are shared between Test and Live for the same practice.
Request example
curl -X GET 'https://api.affinityrx.com/v1/practices/{practiceId}/locations' \
-H "Authorization: Bearer $AFFINITY_API_KEY" \
-H 'Affinity-Version: 2026-09-28'Response example
These examples show the body structure. Values can differ. Select a status code to see its response.
{
"data": [
{
"id": "loc_01j2y8m6jcc9tt24af5pw9x1bc",
"object": "location",
"practiceId": "prac_01j2y8m6jcc9tt24af5pw9x1bc",
"name": "<string>",
"timezone": "<string>",
"city": "<string>",
"country": "<string>",
"line1": "<string>",
"line2": "<string>",
"phone": "<string>",
"postalCode": "<string>",
"state": "<string>",
"status": "active",
"createdAt": "<string>",
"updatedAt": "<string>"
}
],
"object": "list",
"hasMore": false,
"url": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 400,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 401,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 403,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 404,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 409,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 429,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}Implementation specification
Use these field types and limits to build your integration. Download the OpenAPI document for the complete contract.
Path parameters
practiceIdstringrequiredPattern: ^prac_[0-7][0-9a-hjkmnp-tv-z]{25}$
Query parameters
limitintegerDefault: 25
Minimum: 1
Maximum: 100
startingAfterstring | nullShow schema
Any of · 1: string
string
Pattern: ^loc_[0-7][0-9a-hjkmnp-tv-z]{25}$
Any of · 2: null
null
endingBeforestring | nullShow schema
Any of · 1: string
string
Pattern: ^loc_[0-7][0-9a-hjkmnp-tv-z]{25}$
Any of · 2: null
null
statusstring | nullShow schema
Any of · 1: string
string
Allowed: "active", "archived"
Any of · 2: null
null
Headers
Affinity-VersionstringSelects the HTTP API contract for this request only. When omitted, API-key requests use their service account’s stored version. Does not change the stored default.
Pin requests to 2026-09-28.
Response specifications
200Successful response
application/json
dataobject[]requiredShow data fields
Array items · object
idstringrequiredPattern: ^loc_[0-7][0-9a-hjkmnp-tv-z]{25}$
objectstringrequiredAllowed: "location"
practiceIdstringrequiredPattern: ^prac_[0-7][0-9a-hjkmnp-tv-z]{25}$
namestringrequiredtimezonestring | nullrequiredShow timezone fields
Any of · 1: string
string
Any of · 2: null
null
citystring | nullrequiredShow city fields
Any of · 1: string
string
Any of · 2: null
null
countrystringrequiredline1string | nullrequiredShow line1 fields
Any of · 1: string
string
Any of · 2: null
null
line2string | nullrequiredShow line2 fields
Any of · 1: string
string
Any of · 2: null
null
phonestring | nullrequiredShow phone fields
Any of · 1: string
string
Any of · 2: null
null
postalCodestring | nullrequiredShow postalCode fields
Any of · 1: string
string
Any of · 2: null
null
statestring | nullrequiredShow state fields
Any of · 1: string
string
Any of · 2: null
null
statusstringrequiredAllowed: "active", "archived"
createdAtstringrequiredupdatedAtstringrequiredobjectstringrequiredAllowed: "list"
hasMorebooleanrequiredurlstringrequired400HTTP 400
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
401Unauthorized
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
403Forbidden
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
404Not found
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
409Conflict
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
429Too many requests
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri