---
title: entities.productType
description: Read product type records with the productType repository, and change them with the product type mutations. Same records as the REST ProductTypes entity.
canonical: https://developers.coevera.com/reference/graphql/product-type/
section: graphql
verification: schema
generatedFrom: schema f155746 (2026-10-20)
publisher: Coevera
---

# entities.productType

Read product type records with the productType repository, and change them with the product type mutations. Same records as the REST ProductTypes entity.

REST: [ProductTypes](https://developers.coevera.com/reference/rest/product-types.md).

## Queries

- `getById(entityId: ID!): ProductTypeEntity` Returns the record with the given id, or null when there is none. Deleted records are returned as well.
- `getByIds(entityIds: [ID!]!): [ProductTypeEntity!]!` Returns the records with the given ids; ids without a record are left out. Deleted records are returned as well.
- `getAll(limit: Int, offset: Int, filter: ProductTypeFilterInput, orderBy: [ProductTypeOrderByInput!], includeDeleted: Boolean): [ProductTypeEntity!]!` Returns the records that match the filter, paged with limit and offset.
- `getByCriteria(filter: ProductTypeFilterInput, orderBy: [ProductTypeOrderByInput!], includeDeleted: Boolean, before: String, after: String, first: Int, last: Int): ProductTypeEntityConnection` Returns the records that match the filter as a cursor-paginated connection.
- `getPublished(limit: Int, offset: Int, filter: ProductTypeFilterInput, orderBy: [ProductTypeOrderByInput!], includeDeleted: Boolean): [ProductTypeEntity!]!` Returns the published records that match the filter, paged with limit and offset.
- `getDrafts(filter: ProductTypeFilterInput, orderBy: [ProductTypeOrderByInput!]): [ProductTypeEntity!]!` Returns the records that match the filter, with pending unpublished changes applied where a draft exists.
- `getDraftById(entityId: ID!): ProductTypeEntity!` Returns the record with the given id, with its pending unpublished changes applied when a draft exists.

## Types

### ProductTypeEntity (object)

Product type that classifies products and defines their form.

- `hasDraft: Boolean` True when the record has unpublished draft changes, including pending translation changes, that can be published.
- `isDeleteProtected: Boolean!` True when the record is protected against deletion because it must always exist in the space. Deleting a record that is not protected can still fail on other checks. Read-only.
- `formEditApi: Form` Typed, read-only view of a form layout of this type: formEditApi mirrors the edit form (formEdit), formLostApi the form shown when archiving as lost (formLost).
- `canChangeReadonly: Boolean` False for types whose read-only setting is fixed, such as the recurrent appointment type; true otherwise.
- `id: ID!` Unique identifier of entity.
- `isDeleted: Boolean` Specifies if the entity is considered deleted.
- `modified: DateTime` Last modification time.
- `created: DateTime` Creation time.
- `opptyProductRelationType: OpptyProductRelationTypeEntity` Opportunity / quote line-item type paired with this product type. Drives the form used when adding products of this type as line items.
- `formEdit: JSONString!` JSON definition of the form layout used by the UI when creating or editing products of this type. This payload conforms to the `Form` JSON Schema: GET /api/v100/rest/schemas/Form.json on your region's API host
- `isReadonly: Boolean!` True when the product type is system-managed and cannot be edited or deleted by users.
- `name: String!` Name of the entity and its default text representation.
- `opptyProductRelationTypeId: ID!` Id of the paired opportunity/quote line-item type.
- `isPublished: Boolean` True when the entity configuration is published; false while it exists only as an unpublished draft.
- `revision: Int` Revision when entity was lastly changed.
- `instancePermissions: [EntityPermsEnum!]! (1 args)` Permissions the current user has on this record, out of the requested ones.

### ProductTypeEntityConnection (object)

Paginated list of ProductType records.

- `pageInfo: PageInfo!` Pagination data for this connection.
- `edges: [ProductTypeEntityEdge]!` Contains the nodes in this connection.
- `totalCount: Int` Total number of items in the connection.

### ProductTypeEntityEdge (object)

A Relay edge containing a `ProductTypeEntity` and its cursor.

- `node: ProductTypeEntity` The item at the end of the edge
- `cursor: String!` A cursor for use in pagination

### ProductTypeFilterInput (input)

Filter conditions for ProductType records. Conditions on different fields are combined with AND; use OR, AND and NOT for other combinations.

- `OR: [ProductTypeFilterInput!]` Matches records that meet at least one of the listed filters.
- `AND: [ProductTypeFilterInput!]` Matches records that meet all of the listed filters.
- `NOT: ProductTypeFilterInput` Matches records that do not meet this filter.
- `globalSearchQuery: String` Search term matched against the fields that the global search covers for this entity.
- `id: EntityFilterStringField` Unique identifier of entity.
- `isDeleted: Boolean` Specifies if the entity is considered deleted.
- `modified: EntityFilterDateTimeField` Last modification time.
- `created: EntityFilterDateTimeField` Creation time.
- `isReadonly: Boolean` True when the product type is system-managed and cannot be edited or deleted by users.
- `name: EntityFilterStringField` Name of the entity and its default text representation.
- `opptyProductRelationTypeId: EntityFilterStringField` Id of the paired opportunity/quote line-item type.
- `isPublished: Boolean` True when the entity configuration is published; false while it exists only as an unpublished draft.
- `revision: EntityFilterNumberField` Revision when entity was lastly changed.
- `opptyProductRelationType: OpptyProductRelationTypeFilterInput` Opportunity / quote line-item type paired with this product type. Drives the form used when adding products of this type as line items. Matches records where a related record meets these conditions.

### ProductTypeOrderByInput (input)

Sorting of ProductType records. Set exactly one field in each item; list several items to sort by more fields, in order of priority.

- `id: OrderByEnum` Unique identifier of entity.
- `isDeleted: OrderByEnum` Specifies if the entity is considered deleted.
- `modified: OrderByEnum` Last modification time.
- `created: OrderByEnum` Creation time.
- `opptyProductRelationType: [OpptyProductRelationTypeOrderByNestedInput!]` Opportunity / quote line-item type paired with this product type. Drives the form used when adding products of this type as line items. Sorts by fields of the related record, listed in order of priority.
- `isReadonly: OrderByEnum` True when the product type is system-managed and cannot be edited or deleted by users.
- `name: OrderByEnum` Name of the entity and its default text representation.
- `opptyProductRelationTypeId: OrderByEnum` Id of the paired opportunity/quote line-item type.
- `isPublished: OrderByEnum` True when the entity configuration is published; false while it exists only as an unpublished draft.
- `revision: OrderByEnum` Revision when entity was lastly changed.

Types several repositories share, such as `PageInfo` and the filter fields, are in the [types index](https://developers.coevera.com/reference/graphql/types.md). The [SDL](https://developers.coevera.com/graphql/schema.graphql) has the whole schema in one file.

## Example

```graphql
query FirstProductTypes {
  entities {
    productType {
      getByCriteria(first: 3, orderBy: [{ modified: Desc }]) {
        totalCount
        edges { node { id name modified } }
      }
    }
  }
}
```

```bash
curl 'https://{region}.api.coevera.com/api/v100/app/space/{space_id}/graphql/public' \
  --user "$COEVERA_API_KEY:$COEVERA_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{"query":"query FirstProductTypes { entities { productType { getByCriteria(first: 3, orderBy: [{ modified: Desc }]) { totalCount edges { node { id name modified } } } } } }"}'
```
