---
title: "Store Greywind lab-integration credentials for this clinic. Fields left null keep their stored value, so laboratories can be changed without re-entering the password (which this API never returns). Laboratories — each lab's name and the clinic ID it knows this clinic by — are written to greywind_lab_accounts, not the secret: they are identifiers, and Greywind's clinic ID is per laboratory, so it is what selects the lab on every sync, poll and order."
method: POST
path: "/integrations/credentials/greywind"
tags: ["IntegrationCredentials"]
---

# Store Greywind lab-integration credentials for this clinic. Fields left null keep their stored value, so laboratories can be changed without re-entering the password (which this API never returns). Laboratories — each lab's name and the clinic ID it knows this clinic by — are written to greywind_lab_accounts, not the secret: they are identifiers, and Greywind's clinic ID is per laboratory, so it is what selects the lab on every sync, poll and order.

`POST /integrations/credentials/greywind`

## Request

- Base URL: `https://api.clinicos.vet/backend/business`
- URL: `https://api.clinicos.vet/backend/business/integrations/credentials/greywind`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/docs/integrations/credentials/greywind/post.ts> (a function with typed inputs; its response is checked against the schema)

## Request body

- GreywindCredentialsDto: Greywind lab-integration credentials. Null fields keep their stored value; a non-null List&lt;GreywindLabAccountDto&gt;? GreywindCredentialsDto.Labs replaces the whole list.
  - `username` string, nullable
  - `password` string, nullable
  - `labs` GreywindLabAccountDto[], nullable
    - `labName` string
    - `clinicId` string
    - `partnerId` string, nullable: Greywind's id for the diagnostic partner this laboratory is (e.g. "31" for Parasight), from Orchestrate's `GET api/greywind/partners`. It picks the host every call for this lab goes to. Null when the lab has not been linked yet; such a lab cannot be ordered from.
    - `username` string, nullable: This laboratory's own Greywind username, which each partner issues per clinic. Null on output means the lab uses the clinic default. On input, null leaves the saved one as it is and an empty string clears it.
    - `password` string, nullable: Input only, never returned. Blank keeps the saved password for this lab.
    - `hasPassword` boolean: Output only: whether this lab has its own saved password.

## Response `200`

OK

- GreywindCredentialsStatusDto
  - `isConfigured` boolean: At least one laboratory is added, and every one has a login it can use.
  - `hasPassword` boolean
  - `username` string, nullable
  - `hasStoredLogin` boolean: Whether any login is stored at all, default or per laboratory, usable or not. Unlike the `HasPassword` flags, which mean "usable now", this stays true for a lab login left bound to its old partner by a partner change that failed halfway, so Settings can still offer to remove it.
  - `connectionEnabled` boolean: Whether the lab connection row is switched on. False when there is no row yet.
  - `labs` GreywindLabAccountDto[]: The laboratories this clinic orders from, each with the clinic ID that lab uses.
    - `labName` string
    - `clinicId` string
    - `partnerId` string, nullable: Greywind's id for the diagnostic partner this laboratory is (e.g. "31" for Parasight), from Orchestrate's `GET api/greywind/partners`. It picks the host every call for this lab goes to. Null when the lab has not been linked yet; such a lab cannot be ordered from.
    - `username` string, nullable: This laboratory's own Greywind username, which each partner issues per clinic. Null on output means the lab uses the clinic default. On input, null leaves the saved one as it is and an empty string clears it.
    - `password` string, nullable: Input only, never returned. Blank keeps the saved password for this lab.
    - `hasPassword` boolean: Output only: whether this lab has its own saved password.

## Other responses

- `400`: Bad Request
- `404`: Not Found

## Changes

- **2026-10-28** `099cf36186e0`: 21 info
  - added the new optional request property `labs/items/hasPassword` (media type: application/json)
  - added the new optional request property `labs/items/hasPassword` (media type: text/json)
  - added the new optional request property `labs/items/hasPassword` (media type: application/*+json)
  - added the new optional request property `labs/items/password` (media type: application/json)
  - …17 more
- **2026-10-21** `85ee96c0bb96`: 6 info
  - added the new optional request property `labs/items/partnerId` (media type: application/json)
  - added the new optional request property `labs/items/partnerId` (media type: text/json)
  - added the new optional request property `labs/items/partnerId` (media type: application/*+json)
  - added the optional property `labs/items/partnerId` to the response with the `200` status (media type: text/plain)
  - …2 more
- **2026-10-11** `f7ab358172d0`: 12 warning, 6 info
  - removed the request property `clinicId` (media type: application/json)
  - removed the request property `clinicId` (media type: text/json)
  - removed the request property `clinicId` (media type: application/*+json)
  - removed the request property `partnerClientIds` (media type: application/json)
  - …14 more
- **2026-09-17** `d4ae30be0619`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/changes/integrations/credentials/greywind/post.md)

---

[API](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1.md) - [All operations](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/llms.txt) - [OpenAPI document](https://skmtc.dev/clinicos/apis/pawthosx-business-api-v1/revisions/099cf36186e0?raw)
