# Packages

> API reference · Wathiqaty Insurer API v1 (draft)

Packages (your products) are authored by your staff in the Wathiqaty portal, because benefits, wordings and documents need a human. Through the API your core system keeps the pricing and the on-sale state in sync. Price changes apply to quotes from the next request. Policies already sold keep the price they were sold at.

Base URL: `https://sandbox-api.wathiqaty.com/api/v1` (sandbox), `https://api.wathiqaty.com/api/v1` (production).

- List packages: `GET /partner/packages`
- Get a package: `GET /partner/packages/{id}`
- Get pricing rules: `GET /partner/packages/{id}/rating-rules`
- Replace pricing rules: `PUT /partner/packages/{id}/rating-rules`
- Put a package on sale: `POST /partner/packages/{id}/activate`
- Take a package off sale: `POST /partner/packages/{id}/deactivate`
- Set your product code: `PUT /partner/packages/{id}/external-reference`

## List packages

`GET /partner/packages`

- Auth: Bearer token, scope `packages:read`

### Query parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `insuranceType` | string | no | Line of business. One of: `individual_medical`, `new_cars`. |
| `status` | string | no | Only `active` packages are sold. One of: `draft`, `active`, `inactive`. |
| `updatedSince` | date-time | no | Only rows changed at or after this instant. Pass the `updatedAt` of the last row you processed (change feed). |
| `page` | integer | no | Page number, from 1. Default 1. |
| `size` | integer | no | Items per page, 1–100. Default 20. |
| `sortOrder` | string | no | Default `desc`. Use `asc` with `sortBy=updatedAt` for a change feed. One of: `asc`, `desc`. |

### Request examples

```bash
curl -X GET "https://sandbox-api.wathiqaty.com/api/v1/partner/packages" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
```

```js
const res = await fetch("https://sandbox-api.wathiqaty.com/api/v1/partner/packages", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${accessToken}`,
  },
})
const { data, error } = await res.json()
if (!res.ok) throw new Error(`${res.status} ${error.code}`)
```

```python
import requests

res = requests.get(
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages",
    headers={
        "Authorization": f"Bearer {access_token}",
    },
    timeout=30,
)
payload = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {payload['error']['code']}")
data = payload["data"]
```

```csharp
using var req = new HttpRequestMessage(HttpMethod.Get,
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages");
req.Headers.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
using var res = await http.SendAsync(req);
var json = await res.Content.ReadAsStringAsync();
res.EnsureSuccessStatusCode();
```

### Response 200

A page of packages.

```json
{
  "status": "success",
  "data": {
    "items": [
      {
        "id": "5e2b8c41-9d3a-4f67-b1c0-7a8e2d4f6b13",
        "insuranceType": "individual_medical",
        "status": "active",
        "name": {
          "en": "Gold Care",
          "ar": "جولد كير"
        },
        "externalReference": "PRD-GOLD-2026",
        "sumInsured": "250000.00",
        "readiness": {
          "sellable": true,
          "missing": []
        },
        "version": 7,
        "createdAt": "2026-09-01T08:00:00.000Z",
        "updatedAt": "2026-11-02T10:20:00.000Z"
      }
    ],
    "meta": {
      "page": 1,
      "size": 20,
      "totalItems": 1,
      "totalPages": 1,
      "hasNextPage": false,
      "hasPreviousPage": false
    }
  },
  "error": null,
  "metadata": {
    "timestamp": "2026-11-05T09:15:02.481Z",
    "path": "/api/v1/partner/packages",
    "method": "GET",
    "requestId": "8d7e2c1a-41f0-4a4e-9a55-6f0b3c2d1e77"
  }
}
```

## Get a package

`GET /partner/packages/{id}`

- Auth: Bearer token, scope `packages:read`

`readiness.missing` lists what blocks activation. The `ETag` header (and `version`) is what to send as `If-Match` on writes.

### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | uuid | yes | The package's Wathiqaty id. |

### Request examples

```bash
curl -X GET "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
```

```js
const res = await fetch("https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${accessToken}`,
  },
})
const { data, error } = await res.json()
if (!res.ok) throw new Error(`${res.status} ${error.code}`)
```

```python
import requests

res = requests.get(
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}",
    headers={
        "Authorization": f"Bearer {access_token}",
    },
    timeout=30,
)
payload = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {payload['error']['code']}")
data = payload["data"]
```

```csharp
using var req = new HttpRequestMessage(HttpMethod.Get,
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}");
req.Headers.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
using var res = await http.SendAsync(req);
var json = await res.Content.ReadAsStringAsync();
res.EnsureSuccessStatusCode();
```

### Response 200

The package.

```json
{
  "status": "success",
  "data": {
    "id": "5e2b8c41-9d3a-4f67-b1c0-7a8e2d4f6b13",
    "insuranceType": "individual_medical",
    "status": "active",
    "name": {
      "en": "Gold Care",
      "ar": "جولد كير"
    },
    "externalReference": "PRD-GOLD-2026",
    "sumInsured": "250000.00",
    "readiness": {
      "sellable": true,
      "missing": []
    },
    "version": 7,
    "createdAt": "2026-09-01T08:00:00.000Z",
    "updatedAt": "2026-11-02T10:20:00.000Z"
  },
  "error": null,
  "metadata": {
    "timestamp": "2026-11-05T09:15:02.481Z",
    "path": "/api/v1/partner/packages/5e2b8c41-9d3a-4f67-b1c0-7a8e2d4f6b13",
    "method": "GET",
    "requestId": "8d7e2c1a-41f0-4a4e-9a55-6f0b3c2d1e77"
  }
}
```

### Errors

| Status | Code | When |
| --- | --- | --- |
| 404 | `not_found` | Package doesn't exist or isn't your company's. |

Plus the generic errors any route can return: [Errors](/guides/errors.md).

## Get pricing rules

`GET /partner/packages/{id}/rating-rules`

- Auth: Bearer token, scope `packages:read`

Each rule matches a customer profile (`criteria`) and sets a tax-inclusive `price`; `loadings` add a percentage for specific answers.

### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | uuid | yes | The package's Wathiqaty id. |

### Request examples

```bash
curl -X GET "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/rating-rules" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
```

```js
const res = await fetch("https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/rating-rules", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${accessToken}`,
  },
})
const { data, error } = await res.json()
if (!res.ok) throw new Error(`${res.status} ${error.code}`)
```

```python
import requests

res = requests.get(
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/rating-rules",
    headers={
        "Authorization": f"Bearer {access_token}",
    },
    timeout=30,
)
payload = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {payload['error']['code']}")
data = payload["data"]
```

```csharp
using var req = new HttpRequestMessage(HttpMethod.Get,
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/rating-rules");
req.Headers.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
using var res = await http.SendAsync(req);
var json = await res.Content.ReadAsStringAsync();
res.EnsureSuccessStatusCode();
```

### Response 200

The package's rules.

```json
{
  "status": "success",
  "data": {
    "version": 7,
    "rules": [
      {
        "id": "8a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
        "price": "9500.00",
        "criteria": [
          {
            "factor": "age",
            "min": 18,
            "max": 35
          },
          {
            "factor": "gender",
            "values": [
              "male",
              "female"
            ]
          }
        ],
        "loadings": [
          {
            "factor": "pre_existing_condition",
            "value": "diabetes",
            "percent": "15.00"
          }
        ]
      },
      {
        "id": "9b2c3d4e-5f6a-4b7c-9d8e-0f1a2b3c4d5e",
        "price": "12800.00",
        "criteria": [
          {
            "factor": "age",
            "min": 36,
            "max": 50
          }
        ],
        "loadings": []
      }
    ]
  },
  "error": null,
  "metadata": {
    "timestamp": "2026-11-05T09:15:02.481Z",
    "path": "/api/v1/partner/…",
    "method": "GET",
    "requestId": "8d7e2c1a-41f0-4a4e-9a55-6f0b3c2d1e77"
  }
}
```

### Errors

| Status | Code | When |
| --- | --- | --- |
| 404 | `not_found` | Package doesn't exist or isn't your company's. |

Plus the generic errors any route can return: [Errors](/guides/errors.md).

## Replace pricing rules

`PUT /partner/packages/{id}/rating-rules`

- Auth: Bearer token, scope `packages:write`
- `Idempotency-Key`: optional
- `If-Match`: supported

Replaces **all** rules of the package in one transaction. Rules not in the body are removed. Counts as 10 requests against your rate limit.

### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | uuid | yes | The package's Wathiqaty id. |

### Body (JSON)

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `rules` | object[] | yes | 1–500 rules: `{ price (decimal string), criteria[{ factor, min?, max?, values? }], loadings[{ factor, value, percent }] }`. |

### Request examples

```bash
curl -X PUT "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/rating-rules" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "If-Match: W/"7"" \
  -d '{"rules":[{"price":"9500.00","criteria":[{"factor":"age","min":18,"max":35},{"factor":"gender","values":["male","female"]}],"loadings":[{"factor":"pre_existing_condition","value":"diabetes","percent":"15.00"}]},{"price":"12800.00","criteria":[{"factor":"age","min":36,"max":50}],"loadings":[]}]}'
```

```js
const res = await fetch("https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/rating-rules", {
  method: "PUT",
  headers: {
    "Authorization": `Bearer ${accessToken}`,
    "Content-Type": "application/json",
    "Idempotency-Key": crypto.randomUUID(),
    "If-Match": "W/\"7\"",
  },
  body: JSON.stringify({
    "rules": [
      {
        "price": "9500.00",
        "criteria": [
          {
            "factor": "age",
            "min": 18,
            "max": 35
          },
          {
            "factor": "gender",
            "values": [
              "male",
              "female"
            ]
          }
        ],
        "loadings": [
          {
            "factor": "pre_existing_condition",
            "value": "diabetes",
            "percent": "15.00"
          }
        ]
      },
      {
        "price": "12800.00",
        "criteria": [
          {
            "factor": "age",
            "min": 36,
            "max": 50
          }
        ],
        "loadings": []
      }
    ]
  }),
})
const { data, error } = await res.json()
if (!res.ok) throw new Error(`${res.status} ${error.code}`)
```

```python
import requests, uuid

res = requests.put(
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/rating-rules",
    headers={
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json",
        "Idempotency-Key": str(uuid.uuid4()),
        "If-Match": "W/\"7\"",
    },
    json={
      "rules": [
        {
          "price": "9500.00",
          "criteria": [
            {
              "factor": "age",
              "min": 18,
              "max": 35
            },
            {
              "factor": "gender",
              "values": [
                "male",
                "female"
              ]
            }
          ],
          "loadings": [
            {
              "factor": "pre_existing_condition",
              "value": "diabetes",
              "percent": "15.00"
            }
          ]
        },
        {
          "price": "12800.00",
          "criteria": [
            {
              "factor": "age",
              "min": 36,
              "max": 50
            }
          ],
          "loadings": []
        }
      ]
    },
    timeout=30,
)
payload = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {payload['error']['code']}")
data = payload["data"]
```

```csharp
using var req = new HttpRequestMessage(HttpMethod.Put,
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/rating-rules");
req.Headers.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
req.Headers.TryAddWithoutValidation("Idempotency-Key", Guid.NewGuid().ToString());
req.Headers.TryAddWithoutValidation("If-Match", "W/\"7\"");
req.Content = new StringContent(
    """
    {
      "rules": [
        {
          "price": "9500.00",
          "criteria": [
            {
              "factor": "age",
              "min": 18,
              "max": 35
            },
            {
              "factor": "gender",
              "values": [
                "male",
                "female"
              ]
            }
          ],
          "loadings": [
            {
              "factor": "pre_existing_condition",
              "value": "diabetes",
              "percent": "15.00"
            }
          ]
        },
        {
          "price": "12800.00",
          "criteria": [
            {
              "factor": "age",
              "min": 36,
              "max": 50
            }
          ],
          "loadings": []
        }
      ]
    }
    """,
    Encoding.UTF8, "application/json");
using var res = await http.SendAsync(req);
var json = await res.Content.ReadAsStringAsync();
res.EnsureSuccessStatusCode();
```

### Response 200

The new rules and the package's new version.

```json
{
  "status": "success",
  "data": {
    "version": 8,
    "rules": [
      {
        "id": "8a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
        "price": "9500.00",
        "criteria": [
          {
            "factor": "age",
            "min": 18,
            "max": 35
          },
          {
            "factor": "gender",
            "values": [
              "male",
              "female"
            ]
          }
        ],
        "loadings": [
          {
            "factor": "pre_existing_condition",
            "value": "diabetes",
            "percent": "15.00"
          }
        ]
      },
      {
        "id": "9b2c3d4e-5f6a-4b7c-9d8e-0f1a2b3c4d5e",
        "price": "12800.00",
        "criteria": [
          {
            "factor": "age",
            "min": 36,
            "max": 50
          }
        ],
        "loadings": []
      }
    ]
  },
  "error": null,
  "metadata": {
    "timestamp": "2026-11-05T09:15:02.481Z",
    "path": "/api/v1/partner/…",
    "method": "PUT",
    "requestId": "8d7e2c1a-41f0-4a4e-9a55-6f0b3c2d1e77"
  }
}
```

### Errors

| Status | Code | When |
| --- | --- | --- |
| 404 | `not_found` | Package doesn't exist or isn't your company's. |
| 412 | `version_conflict` | Changed since you read it (`If-Match` doesn't match). Reload and retry. |
| 422 | `validation_error` | A rule is invalid (`details.fields`, e.g. `rules.3.price`). |
| 422 | `unknown_rating_factor` | A factor or value isn't one your company has selected. |

Plus the generic errors any route can return: [Errors](/guides/errors.md).

## Put a package on sale

`POST /partner/packages/{id}/activate`

- Auth: Bearer token, scope `packages:write`

`draft` or `inactive` → `active`, only when the package is complete.

### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | uuid | yes | The package's Wathiqaty id. |

### Request examples

```bash
curl -X POST "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/activate" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
```

```js
const res = await fetch("https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/activate", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${accessToken}`,
  },
})
const { data, error } = await res.json()
if (!res.ok) throw new Error(`${res.status} ${error.code}`)
```

```python
import requests

res = requests.post(
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/activate",
    headers={
        "Authorization": f"Bearer {access_token}",
    },
    timeout=30,
)
payload = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {payload['error']['code']}")
data = payload["data"]
```

```csharp
using var req = new HttpRequestMessage(HttpMethod.Post,
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/activate");
req.Headers.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
using var res = await http.SendAsync(req);
var json = await res.Content.ReadAsStringAsync();
res.EnsureSuccessStatusCode();
```

### Response 200

The package, now `active`.

```json
{
  "status": "success",
  "data": {
    "id": "5e2b8c41-9d3a-4f67-b1c0-7a8e2d4f6b13",
    "insuranceType": "individual_medical",
    "status": "active",
    "name": {
      "en": "Gold Care",
      "ar": "جولد كير"
    },
    "externalReference": "PRD-GOLD-2026",
    "sumInsured": "250000.00",
    "readiness": {
      "sellable": true,
      "missing": []
    },
    "version": 7,
    "createdAt": "2026-09-01T08:00:00.000Z",
    "updatedAt": "2026-11-02T10:20:00.000Z"
  },
  "error": null,
  "metadata": {
    "timestamp": "2026-11-05T09:15:02.481Z",
    "path": "/api/v1/partner/…",
    "method": "POST",
    "requestId": "8d7e2c1a-41f0-4a4e-9a55-6f0b3c2d1e77"
  }
}
```

### Errors

| Status | Code | When |
| --- | --- | --- |
| 404 | `not_found` | Package doesn't exist or isn't your company's. |
| 422 | `package_incomplete` | Something is missing (`details.missing`, e.g. `rating_rules`, `terms_and_conditions`). |
| 409 | `package_duplicate` | Another active package has the same policy and name. |

Plus the generic errors any route can return: [Errors](/guides/errors.md).

## Take a package off sale

`POST /partner/packages/{id}/deactivate`

- Auth: Bearer token, scope `packages:write`

→ `inactive`. Sold policies are not affected.

### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | uuid | yes | The package's Wathiqaty id. |

### Request examples

```bash
curl -X POST "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/deactivate" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
```

```js
const res = await fetch("https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/deactivate", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${accessToken}`,
  },
})
const { data, error } = await res.json()
if (!res.ok) throw new Error(`${res.status} ${error.code}`)
```

```python
import requests

res = requests.post(
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/deactivate",
    headers={
        "Authorization": f"Bearer {access_token}",
    },
    timeout=30,
)
payload = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {payload['error']['code']}")
data = payload["data"]
```

```csharp
using var req = new HttpRequestMessage(HttpMethod.Post,
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/deactivate");
req.Headers.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
using var res = await http.SendAsync(req);
var json = await res.Content.ReadAsStringAsync();
res.EnsureSuccessStatusCode();
```

### Response 200

The package, now `inactive`.

```json
{
  "status": "success",
  "data": {
    "id": "5e2b8c41-9d3a-4f67-b1c0-7a8e2d4f6b13",
    "insuranceType": "individual_medical",
    "status": "inactive",
    "name": {
      "en": "Gold Care",
      "ar": "جولد كير"
    },
    "externalReference": "PRD-GOLD-2026",
    "sumInsured": "250000.00",
    "readiness": {
      "sellable": true,
      "missing": []
    },
    "version": 7,
    "createdAt": "2026-09-01T08:00:00.000Z",
    "updatedAt": "2026-11-02T10:20:00.000Z"
  },
  "error": null,
  "metadata": {
    "timestamp": "2026-11-05T09:15:02.481Z",
    "path": "/api/v1/partner/…",
    "method": "POST",
    "requestId": "8d7e2c1a-41f0-4a4e-9a55-6f0b3c2d1e77"
  }
}
```

### Errors

| Status | Code | When |
| --- | --- | --- |
| 404 | `not_found` | Package doesn't exist or isn't your company's. |

Plus the generic errors any route can return: [Errors](/guides/errors.md).

## Set your product code

`PUT /partner/packages/{id}/external-reference`

- Auth: Bearer token, scope `packages:write`

Echoed on every policy sold from the package as `packageExternalReference`.

### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | uuid | yes | The package's Wathiqaty id. |

### Body (JSON)

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `externalReference` | string | yes | Your own reference, 1–100 characters, unique within your company. |

### Request examples

```bash
curl -X PUT "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/external-reference" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"externalReference":"PRD-GOLD-2026"}'
```

```js
const res = await fetch("https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/external-reference", {
  method: "PUT",
  headers: {
    "Authorization": `Bearer ${accessToken}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "externalReference": "PRD-GOLD-2026"
  }),
})
const { data, error } = await res.json()
if (!res.ok) throw new Error(`${res.status} ${error.code}`)
```

```python
import requests

res = requests.put(
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/external-reference",
    headers={
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json",
    },
    json={
      "externalReference": "PRD-GOLD-2026"
    },
    timeout=30,
)
payload = res.json()
if not res.ok:
    raise RuntimeError(f"{res.status_code} {payload['error']['code']}")
data = payload["data"]
```

```csharp
using var req = new HttpRequestMessage(HttpMethod.Put,
    "https://sandbox-api.wathiqaty.com/api/v1/partner/packages/{id}/external-reference");
req.Headers.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
req.Content = new StringContent(
    """
    {
      "externalReference": "PRD-GOLD-2026"
    }
    """,
    Encoding.UTF8, "application/json");
using var res = await http.SendAsync(req);
var json = await res.Content.ReadAsStringAsync();
res.EnsureSuccessStatusCode();
```

### Response 200

The package.

```json
{
  "status": "success",
  "data": {
    "id": "5e2b8c41-9d3a-4f67-b1c0-7a8e2d4f6b13",
    "insuranceType": "individual_medical",
    "status": "active",
    "name": {
      "en": "Gold Care",
      "ar": "جولد كير"
    },
    "externalReference": "PRD-GOLD-2026",
    "sumInsured": "250000.00",
    "readiness": {
      "sellable": true,
      "missing": []
    },
    "version": 7,
    "createdAt": "2026-09-01T08:00:00.000Z",
    "updatedAt": "2026-11-02T10:20:00.000Z"
  },
  "error": null,
  "metadata": {
    "timestamp": "2026-11-05T09:15:02.481Z",
    "path": "/api/v1/partner/…",
    "method": "PUT",
    "requestId": "8d7e2c1a-41f0-4a4e-9a55-6f0b3c2d1e77"
  }
}
```

### Errors

| Status | Code | When |
| --- | --- | --- |
| 404 | `not_found` | Package doesn't exist or isn't your company's. |
| 409 | `conflict` | Another package of yours already has this reference. |

Plus the generic errors any route can return: [Errors](/guides/errors.md).
