# Get a client

`GET /v0/labs/client/{client_id}`

> **Authentication:** every request must send `X-ConfidentLims-APIKey`, `X-ConfidentLims-Timestamp` (unix seconds) and `X-ConfidentLims-Signature`, an HMAC-SHA256 signature of the request. The examples below call `sign_request()` from the [Request Signing guide](https://api.confidentcannabis.com/v0/docs/request-signing.md) — read it first. Request bodies are form-encoded, never JSON.

Return full details for a single client, including its primary address and
licenses.

The client must already be associated with your lab, or have existing orders
with it; otherwise the request returns `not_found`.

## Path parameters

- `client_id` (integer, required)

## Responses

### 200 Success

Fields (alongside the `success: true` envelope flag):

- `client` (object)
  - `id` (integer) — Client ID
  - `name` (string) — Organization Name
  - `training` (boolean) — Whether this is a training client
  - `last_modified` (timestamp) — Time this client was last modified
  - `email` (string) — Organization Email
  - `phone` (string) — Organization Phone
  - `url` (string) — Organization Website
  - `primary_address` (object)
    - `id` (integer) — Address ID
    - `address_line_1` (string) — Street address line 1
    - `address_line_2` (string) — Street address line 2
    - `city` (string) — City
    - `state_abbreviation` (string) — Two letter state abbreviation
    - `zipcode` (string) — Zipcode
  - `licenses` (array of objects)
    - `id` (integer) — License ID
    - `license_number` (string) — License Number
    - `license_code` (string) — License Code (some states only)
    - `nickname` (string) — Human entered name for license
    - `license_designation_name` (string) — License Designation Name [changes by state]
    - `license_type_name` (string) — License Type Name [changes by state]
  - `archived` (boolean) — True if this client has been archived
  - `notes` (string) — Client Notes

Example:

```json
{
  "success": true,
  "client": {
    "id": 318,
    "name": "Sunrise Cultivation",
    "training": false,
    "last_modified": "2025-02-27T18:04:03",
    "email": "orders@sunrisecultivation.com",
    "phone": "9165550142",
    "url": "https://sunrisecultivation.com",
    "primary_address": {
      "id": 902,
      "address_line_1": "55 Orchard Road",
      "address_line_2": null,
      "city": "Woodland",
      "state_abbreviation": "CA",
      "zipcode": "95695"
    },
    "licenses": [
      {
        "id": 4410,
        "license_number": "CDPH-10003456",
        "license_code": null,
        "nickname": "Woodland cultivation",
        "license_designation_name": "Adult Use",
        "license_type_name": "Cultivation - Small Indoor"
      }
    ],
    "archived": false,
    "notes": "Prefers Monday drop-offs."
  }
}
```

### 400 Bad request

The request was malformed or failed validation. Validation failures include per-field messages in `error_details`. Possible `error_code` values: `invalid_request`, `request_too_old`.

### 401 Unauthorized

Authentication failed. Possible `error_code` values: `missing_api_key`, `invalid_api_key`, `invalid_credentials_type`, `api_access_restricted`, `api_access_denied`, `missing_signature`, `missing_timestamp`, `invalid_timestamp`, `invalid_signature`.

### 403 Permission denied

The API key is valid but does not have permission for this endpoint (for example, a client key calling a labs endpoint). Possible `error_code` values: `permission_denied`.

### 404 Not found

The requested record does not exist or is not visible to this organization. Possible `error_code` values: `not_found`.

## Examples

### cURL

```bash
# X-ConfidentLims-Signature: see the Request Signing guide - https://api.confidentcannabis.com/v0/docs/request-signing.md
curl -X GET 'https://api.confidentcannabis.com/v0/labs/client/{client_id}' \
  -H 'X-ConfidentLims-APIKey: YOUR_API_KEY' \
  -H 'X-ConfidentLims-Timestamp: UNIX_TIMESTAMP' \
  -H 'X-ConfidentLims-Signature: REQUEST_SIGNATURE'
```

### Python

```python
import time
import requests

# sign_request() is defined in the Request Signing guide:
# https://api.confidentcannabis.com/v0/docs/request-signing.md
from sign_request import sign_request

API_KEY = 'YOUR_API_KEY'
API_SECRET = 'YOUR_API_SECRET'
path = '/v0/labs/client/{client_id}'

headers = {'X-ConfidentLims-Timestamp': str(int(time.time()))}
headers['X-ConfidentLims-Signature'] = sign_request(
    'GET', path, headers, {}, API_KEY, API_SECRET)
headers['X-ConfidentLims-APIKey'] = API_KEY

response = requests.get(
    'https://api.confidentcannabis.com' + path,
    headers=headers,
)
print(response.json())
```

### JavaScript

```javascript
// signRequest() is defined in the Request Signing guide:
// https://api.confidentcannabis.com/v0/docs/request-signing.md
import { signRequest } from './sign_request.js';

const API_KEY = 'YOUR_API_KEY';
const API_SECRET = 'YOUR_API_SECRET';
const path = "/v0/labs/client/{client_id}";

const headers = { 'X-ConfidentLims-Timestamp': String(Math.floor(Date.now() / 1000)) };
headers['X-ConfidentLims-Signature'] = signRequest(
  "GET", path, headers, {}, API_KEY, API_SECRET);
headers['X-ConfidentLims-APIKey'] = API_KEY;

const response = await fetch("https://api.confidentcannabis.com" + path, {
  headers,
});
console.log(await response.json());
```

---

HTML version: https://api.confidentcannabis.com/v0/docs/labs/get-client-details  
OpenAPI spec for this section: https://api.confidentcannabis.com/v0/docs/labs/openapi.json  
Request Signing guide: https://api.confidentcannabis.com/v0/docs/request-signing.md
