# GET /v1/catalogue/kits/{kitId}

**Service:** Catalogue  
**Operation:** `CatalogueService_GetKit`

Returns the kit with its priced rows, top-level component products, and sub-assemblies — the single call that lets you drill into one kit's full detail.

## Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `kitId` | path | string | yes | The id of the kit to retrieve. Required. |
| `fields` | query | string | no | Comma-separated response fields to include, using camelCase JSON names (e.g. `orderId,total.amountMicros`). Dot paths reach into nested objects and map transparently across arrays. Paths are relative to the resource, not the response envelope; envelope keys like `nextPageToken` are always preserved. Only 2xx JSON responses are filtered; error bodies pass through unmodified. Unknown names are silently ignored. Takes precedence over `excludeFields` when both are provided. |
| `excludeFields` | query | string | no | Comma-separated response fields to exclude, using camelCase JSON names. Dot paths and array-transparency work the same as `fields`. Paths are relative to the resource, not the response envelope. Only 2xx JSON responses are filtered; error bodies pass through unmodified. Ignored when `fields` is also provided. |

## Responses

| Status | Schema | Description |
| --- | --- | --- |
| 200 | `GetKitResponse` | A successful response. |
| 400 | `Error` | The request was rejected because it was malformed — for example a badly formed id. The body is a validation-failure envelope: an overall type and message and one entry per problem (each with a stable code, a message, and a param pointing at the offending parameter). |
| 401 | `Error` | The request is missing a valid bearer token, or the token is invalid or expired. |
| 403 | `Error` | The token is valid but does not permit this action, or the resource belongs to a company the token cannot act for. The error type is permission_denied. |
| 404 | `Error` | No product kit with the given id exists for the authenticated company. |
| 429 | `Error` | The request was throttled (rate_limited) or exceeded a size limit (resource_exhausted). When throttled, the Retry-After header says how many seconds to wait before retrying; a resource_exhausted request will fail the same way if retried unchanged. |
| default | `Error` | Any other error. The body is the same error envelope every error uses: a short stable type identifying the kind of failure (for example "rate_limited" or "internal"), a human-readable message, and the request's idempotency key echoed back when one was supplied. |

## Returns

`GetKitResponse`

| Field | Type | Description |
| --- | --- | --- |
| `kit` | Kit | The requested kit, including its rows and full component tree. |
| `kit.kitId` | string | The kit's id — the id of the catalogue product that fronts this kit. This is the id a kit line item references, and the id GetKit accepts. |
| `kit.name` | string | The kit's display name. |
| `kit.rows` | KitRow[] | The kit's priced variant rows. Populated by GetKit; the kit listing leaves this empty. |
| `kit.rows.kitRowId` | string | The kit variant row's unique id. |
| `kit.rows.attributes` | RowAttribute[] | Attribute pairs that identify this kit variant. |
| `kit.rows.markedUpPrice` | Money | The computed marked-up sell price, for reference. |
| `kit.rows.prices` | RowPrice[] | The variant's price at each of your price levels. |
| `kit.components` | KitProductComponent[] | The kit's top-level component products (those not inside a sub-assembly). Populated by GetKit; the kit listing leaves this empty. |
| `kit.components.kitProductId` | string | The component's unique id within the kit. |
| `kit.components.productId` | string | The id of the catalogue product used as this component. Additional-product components only. |
| `kit.components.productRowId` | string | The id of the specific product variant row used as this component. Catalogue-product components only. |
| `kit.components.colour` | string | The component's colour. Catalogue-product components only. |
| `kit.components.material` | string | The component's material. Catalogue-product components only. |
| `kit.components.quantity` | string | The component's quantity, as a decimal string. |
| `kit.components.productType` | KitComponentType | The component's kind: catalogue product, notes, or labour. Determines which of the fields below are populated. On-the-fly is never a kit-template component, so it is not part of this set. The kind of a component within a product kit.   - KIT_COMPONENT_TYPE_UNSPECIFIED: Default, unset value. Not a valid choice for a kit component.  - KIT_COMPONENT_TYPE_CATALOGUE_PRODUCT: A component that is a product from your catalogue.  - KIT_COMPONENT_TYPE_ON_THE_FLY_PRODUCT: A free-form component not tied to a catalogue product. Occurs on order and quote kits only — it is not a catalogue-template component kind.  - KIT_COMPONENT_TYPE_NOTES: A note component: carries text rather than a priced product.  - KIT_COMPONENT_TYPE_LABOUR: A labour component. One of: KIT_COMPONENT_TYPE_UNSPECIFIED, KIT_COMPONENT_TYPE_CATALOGUE_PRODUCT, KIT_COMPONENT_TYPE_ON_THE_FLY_PRODUCT, KIT_COMPONENT_TYPE_NOTES, KIT_COMPONENT_TYPE_LABOUR. |
| `kit.components.notes` | string | Free-text note. Populated when this is a notes component. |
| `kit.components.notesType` | NotesType | Whether the note is internal-only or customer-visible. Notes components only. Whether a notes line is internal-only or visible to the customer.   - NOTES_TYPE_UNSPECIFIED: Default, unset value. Not a valid choice for a notes line.  - NOTES_TYPE_INTERNAL: An internal note, not shown to the customer.  - NOTES_TYPE_EXTERNAL: An external note, visible to the customer. One of: NOTES_TYPE_UNSPECIFIED, NOTES_TYPE_INTERNAL, NOTES_TYPE_EXTERNAL. |
| `kit.components.labourUserId` | string | The assigned company user's id. Populated when this is a labour component. |
| `kit.components.hourlyRateCharged` | Money | The labour charge-out rate per hour. Labour components only. |
| `kit.components.hourlyRateCost` | Money | The labour cost rate per hour. Labour components only. |
| `kit.components.customHourlyRateCharged` | Money | A custom override of the charge-out rate, when set. Labour components only. |
| `kit.components.customHourlyRateCost` | Money | A custom override of the cost rate, when set. Labour components only. |
| `kit.components.productName` | string | The display name of the catalogue product used as this component. Catalogue-product components only. Echo this into the kit component's `productName` when building an order or quote kit line from this template — component names are stored as given and are not derived from product references. |
| `kit.subKits` | KitSubAssembly[] | The kit's sub-assemblies, each holding its own component products. Nested one level deep (a sub-assembly cannot itself contain sub-assemblies). |
| `kit.subKits.subKitId` | string | The sub-assembly's unique id. |
| `kit.subKits.title` | string | The sub-assembly's display title. |
| `kit.subKits.index` | integer | The sub-assembly's position in display order within the kit. |
| `kit.subKits.components` | KitProductComponent[] | The component products that make up this sub-assembly. |

---

Source: https://developer.factory.app/reference/catalogue/get-kit · Factory Sales API v1
