# GET /v1/company/custom-fields

**Service:** Company  
**Operation:** `CompanyService_ListCompanyCustomFields`

Custom fields are account-configured, typed fields on sales documents, customers, and suppliers. The `key` returned here is the identifier write endpoints accept — for example `customFields` on CreateQuoteRequest is an object keyed by these keys. For select and multi-select fields, the value a write must carry is an option `key` from the definition's options (not the option's label). Hidden definitions are included — existing documents can still carry values for fields that were hidden after being set. Optionally filter by module.

## Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `module` | query | string | no | Only return definitions for this module. Optional; unspecified returns every module's definitions. One of: CUSTOM_FIELD_MODULE_UNSPECIFIED, CUSTOM_FIELD_MODULE_SALES_DOCUMENTS, CUSTOM_FIELD_MODULE_CUSTOMERS, CUSTOM_FIELD_MODULE_SUPPLIERS, CUSTOM_FIELD_MODULE_PURCHASE_ORDERS. |
| `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 | `ListCompanyCustomFieldsResponse` | A successful response. |
| 400 | `Error` | The request was rejected because it was malformed — for example an unknown module filter value. The body is a validation-failure envelope. |
| 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. |
| 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

`ListCompanyCustomFieldsResponse`

| Field | Type | Description |
| --- | --- | --- |
| `customFields` | CustomFieldDefinition[] | The company's custom field definitions. |
| `customFields.key` | string | The field's key — the identifier write endpoints accept. |
| `customFields.name` | string | The field's display name. |
| `customFields.module` | CustomFieldModule | Which record type the field is defined for. The record type a custom field is defined for.   - CUSTOM_FIELD_MODULE_SALES_DOCUMENTS: Quotes and orders share one set of sales-document fields. One of: CUSTOM_FIELD_MODULE_UNSPECIFIED, CUSTOM_FIELD_MODULE_SALES_DOCUMENTS, CUSTOM_FIELD_MODULE_CUSTOMERS, CUSTOM_FIELD_MODULE_SUPPLIERS, CUSTOM_FIELD_MODULE_PURCHASE_ORDERS. |
| `customFields.type` | CustomFieldType | The field's value type. A custom field's value type. One of: CUSTOM_FIELD_TYPE_UNSPECIFIED, CUSTOM_FIELD_TYPE_TEXT, CUSTOM_FIELD_TYPE_NUMBER, CUSTOM_FIELD_TYPE_CURRENCY, CUSTOM_FIELD_TYPE_DATE, CUSTOM_FIELD_TYPE_DATETIME, CUSTOM_FIELD_TYPE_SELECT, CUSTOM_FIELD_TYPE_CHECKBOX. |
| `customFields.options` | CustomFieldOption[] | The permitted choices, for select and multi-select fields. A written value must be an option `key` (multi-select: a list of option keys). |
| `customFields.options.key` | string | The option's key — what a written value must contain. |
| `customFields.options.label` | string | The option's display label. |
| `customFields.options.isDefault` | boolean | Whether this option is the field's default. |
| `customFields.readOnly` | boolean | The field's value is computed and cannot be written. |
| `customFields.isHidden` | boolean | Whether the field is hidden in the Factory app. Hidden fields are still returned here so values on existing documents can be interpreted. |

---

Source: https://developer.factory.app/reference/company/list-company-custom-fields · Factory Sales API v1
