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

# entities.product

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

REST: [Products](https://developers.coevera.com/reference/rest/products.md).

## Queries

- `getById(entityId: ID!): ProductEntity` Returns the record with the given id, or null when there is none. Deleted records are returned as well.
- `getByIds(entityIds: [ID!]!): [ProductEntity!]!` 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: ProductFilterInput, orderBy: [ProductOrderByInput!], includeDeleted: Boolean): [ProductEntity!]!` Returns the records that match the filter, paged with limit and offset.
- `getByCriteria(filter: ProductFilterInput, orderBy: [ProductOrderByInput!], includeDeleted: Boolean, priceListId: ID, before: String, after: String, first: Int, last: Int): ProductEntityConnection` Returns the products that match the filter as a cursor-paginated connection.
- `getChangedFieldsSinceRevision(id: UUID!, revision: Int!): [UUID!]!` Returns the ids of the fields of a record that changed after the given revision. Returns an empty list for entities without change tracking.
- `getBySession(includedIds: [UUID!]!, excludedIds: [UUID!]!, sessionId: String!, before: String, after: String, first: Int, last: Int): ProductEntityConnection` Returns a page of records selected in a list or report: all records of the given result plus the explicitly included ids, minus the excluded ids.
- `getByIdFormatted(id: UUID!, fieldIds: [UUID!]): JSONString` Returns the values of a record's fields formatted for display, keyed by field id.
- `getForPipeline(pipelineId: UUID!, limit: Int, offset: Int, filter: ProductFilterInput, orderBy: [ProductOrderByInput!]): [ProductEntity!]!` Returns the products that can be used in the given pipeline: products allowed in all pipelines and products assigned to this pipeline.

## Mutations

- `createProduct(input: CreateProductInput!, validationLevel: [ValidationLevel!], priceLists: SetProductPriceList): CreateProductPayload` Create one record.
- `updateProduct(input: UpdateProductInput!, validationLevel: [ValidationLevel!], sessionIdToUpdate: String): UpdateProductPayload` Update fields.
- `bulkUpdateProduct(input: [CreateOrUpdateProductInput!]!, validationLevel: [ValidationLevel!], rollbackMethod: RollbackMethod, match: MatchingInput, priceLists: SetProductPriceList): BulkUpdateProductPayload` Create or update many; per-item results.
- `deleteProduct(input: DeleteProductInput!): DeleteProductPayload` Soft-delete.

## Types

### ProductEntity (object)

Product or service in the catalog that can be added as a line item to opportunities and quotes.

- `customFields: JSONString! (1 args)` Values of the record's custom fields as a JSON object keyed by custom field apiName (camelCase).
- `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.
- `id: ID!` Unique identifier of entity.
- `isDeleted: Boolean` Specifies if the entity is considered deleted.
- `modified: DateTime` Last modification time.
- `created: DateTime` Creation time.
- `currencyExchangeRatesList: CurrencyExchangeRatesListEntity` Currency exchange rate list used to convert monetary fields linked to this product. Empty to inherit the team space default.
- `picture: CloudObjectEntity` Product picture.
- `productCategory: ProductCategoryEntity` Product category this product belongs to. Categories form a hierarchy used in the catalog browser.
- `productType: ProductTypeEntity` Product type that classifies this product. Product types are configurable per team space and drive which form, fields and product-line behavior apply.
- `allowedPipelines: AccessPipelinesEnum` Whether this product can be added to all pipelines or only the explicitly linked subset (see productPipelineRelations).
- `currencyExchangeRatesListId: ID` Id of the currency exchange rate list applied to this product.
- `description: String` Free-form description of the product.
- `name: String!` Name of the product, shown in catalogues and pickers.
- `pictureId: ID` Id of the product picture document.
- `productCategoryId: ID` Id of the product category this product belongs to, or empty when it is not categorized.
- `productTypeId: ID` Id of the product type that classifies this product.
- `sku: String` Stock-keeping unit (SKU) identifier of the product. Must be unique across products.
- `unitSymbol: String` Unit of measure shown next to product quantities (e.g. pcs, kg, hours).
- `revision: Int` Revision when entity was lastly changed.
- `productPipelineRelations: ProductPipelineRelationEntityConnection (8 args)` Deprecated pipeline connection.
- `productPipelines: ProductPipelinesObject` Configuration of Pipelines where the Product can be used.
- `formattedName: String!` Display version of the product name, used in lists and references.
- `opptyProductRelationTypeId: UUID!` Id of the product line-item type derived from productType. Used as a filter when listing relations on opportunities and quotes. Read-only.
- `priceLists: [ProductPriceListReference!]` Active price lists this product is priced in, ordered by name. Read-only; computed by Coevera.
- `priceSchedules: [ProductPriceListReference!]` Active price schedules this product is priced in, ordered by name. Read-only; computed by Coevera.
- `instancePermissions: [EntityPermsEnum!]! (1 args)` Permissions the current user has on this record, out of the requested ones.
- `priceListPrice: Float (2 args)` Price of the product in the given price list and currency. Returns 0 when either is not given or the product has no price for that combination.

### ProductEntityConnection (object)

Paginated list of Product records.

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

### ProductEntityEdge (object)

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

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

### AccessPipelinesEnumFilterInput (input)

Conditions on an enumeration field. Several conditions given together must all match.

- `eq: [AccessPipelinesEnum!]` Matches any of the listed values.
- `NOT: AccessPipelinesEnumFilterInput` Matches values that do not meet this condition.

### ProductFilterInput (input)

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

- `OR: [ProductFilterInput!]` Matches records that meet at least one of the listed filters.
- `AND: [ProductFilterInput!]` Matches records that meet all of the listed filters.
- `NOT: ProductFilterInput` 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.
- `allowedPipelines: AccessPipelinesEnumFilterInput` Whether this product can be added to all pipelines or only the explicitly linked subset (see productPipelineRelations).
- `currencyExchangeRatesListId: EntityFilterStringField` Id of the currency exchange rate list applied to this product.
- `description: EntityFilterStringField` Free-form description of the product.
- `name: EntityFilterStringField` Name of the product, shown in catalogues and pickers.
- `pictureId: EntityFilterStringField` Id of the product picture document.
- `productCategoryId: EntityFilterStringField` Id of the product category this product belongs to, or empty when it is not categorized.
- `productTypeId: EntityFilterStringField` Id of the product type that classifies this product.
- `sku: EntityFilterStringField` Stock-keeping unit (SKU) identifier of the product. Must be unique across products.
- `unitSymbol: EntityFilterStringField` Unit of measure shown next to product quantities (e.g. pcs, kg, hours).
- `revision: EntityFilterNumberField` Revision when entity was lastly changed.
- `allowedForPipeline: UUID` Id of a pipeline. Matches products that can be used in it: products available in all pipelines and products assigned to this pipeline.
- `isTypeDeleted: Boolean` Filters products by whether their product type has been deleted.
- `withCustom: [CustomField!]` Conditions on custom fields, each identified by its api name. All listed conditions must match.
- `currencyExchangeRatesList: CurrencyExchangeRatesListFilterInput` Currency exchange rate list used to convert monetary fields linked to this product. Empty to inherit the team space default. Matches records where a related record meets these conditions.
- `picture: CloudObjectFilterInput` Product picture. Matches records where a related record meets these conditions.
- `productCategory: ProductCategoryFilterInput` Product category this product belongs to. Categories form a hierarchy used in the catalog browser. Matches records where a related record meets these conditions.
- `productType: ProductTypeFilterInput` Product type that classifies this product. Product types are configurable per team space and drive which form, fields and product-line behavior apply. Matches records where a related record meets these conditions.
- `productPipelineRelations: ProductPipelineRelationFilterInput` Deprecated pipeline connection. Matches records where a related record meets these conditions.

### ProductOrderByInput (input)

Sorting of Product 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.
- `currencyExchangeRatesList: [CurrencyExchangeRatesListOrderByNestedInput!]` Currency exchange rate list used to convert monetary fields linked to this product. Empty to inherit the team space default. Sorts by fields of the related record, listed in order of priority.
- `productCategory: [ProductCategoryOrderByNestedInput!]` Product category this product belongs to. Categories form a hierarchy used in the catalog browser. Sorts by fields of the related record, listed in order of priority.
- `productType: [ProductTypeOrderByNestedInput!]` Product type that classifies this product. Product types are configurable per team space and drive which form, fields and product-line behavior apply. Sorts by fields of the related record, listed in order of priority.
- `currencyExchangeRatesListId: OrderByEnum` Id of the currency exchange rate list applied to this product.
- `description: OrderByEnum` Free-form description of the product.
- `name: OrderByEnum` Name of the product, shown in catalogues and pickers.
- `productCategoryId: OrderByEnum` Id of the product category this product belongs to, or empty when it is not categorized.
- `productTypeId: OrderByEnum` Id of the product type that classifies this product.
- `sku: OrderByEnum` Stock-keeping unit (SKU) identifier of the product. Must be unique across products.
- `unitSymbol: OrderByEnum` Unit of measure shown next to product quantities (e.g. pcs, kg, hours).
- `revision: OrderByEnum` Revision when entity was lastly changed.
- `withCustom: CommonEntityRepositoryOrderByCustomField` Sorts by a custom field.

### CreateOrUpdateProductInput (input)

Field values of a Product record to create, or to update when its id is set.

- `clientMutationId: String` Optional client-supplied identifier passed on a mutation input and echoed back unchanged on its payload, so a client can correlate the response with its request (Relay convention).
- `id: ID` Unique identifier of entity.
- `modified: DateTime` Last modification time.
- `created: DateTime` Creation time.
- `picture: CreateCloudObjectInput` Product picture.
- `allowedPipelines: AccessPipelinesEnum` Whether this product can be added to all pipelines or only the explicitly linked subset (see productPipelineRelations).
- `currencyExchangeRatesListId: ID` Id of the currency exchange rate list applied to this product.
- `description: String` Free-form description of the product.
- `name: String` Name of the product, shown in catalogues and pickers.
- `pictureId: ID` Id of the product picture document.
- `productCategoryId: ID` Id of the product category this product belongs to, or empty when it is not categorized.
- `productTypeId: ID` Id of the product type that classifies this product.
- `sku: String` Stock-keeping unit (SKU) identifier of the product. Must be unique across products.
- `unitSymbol: String` Unit of measure shown next to product quantities (e.g. pcs, kg, hours).
- `customFields: JSONString` Custom field values to set, as a JSON object keyed by custom field API name, e.g. {"cfBudget": 1000}. Only the custom fields included are changed; each value uses the format of that field.
- `revision: Int` Revision when entity was lastly changed.
- `productPipelineRelations: [CreateProductPipelineRelationNoProductBackrefInput!]` Deprecated pipeline connection.
- `productPipelines: ProductPipelinesInput` Configuration of Pipelines where the Product can be used.
- `pictureSourceUrl: String` URL of an image to use as the product picture. The image is downloaded from this URL and checked; only pictures are supported.

### CreateProductInput (input)

Field values of a new Product record.

- `clientMutationId: String` Optional client-supplied identifier passed on a mutation input and echoed back unchanged on its payload, so a client can correlate the response with its request (Relay convention).
- `modified: DateTime` Last modification time.
- `created: DateTime` Creation time.
- `picture: CreateCloudObjectInput` Product picture.
- `allowedPipelines: AccessPipelinesEnum` Whether this product can be added to all pipelines or only the explicitly linked subset (see productPipelineRelations).
- `currencyExchangeRatesListId: ID` Id of the currency exchange rate list applied to this product.
- `description: String` Free-form description of the product.
- `name: String!` Name of the product, shown in catalogues and pickers.
- `pictureId: ID` Id of the product picture document.
- `productCategoryId: ID` Id of the product category this product belongs to, or empty when it is not categorized.
- `productTypeId: ID` Id of the product type that classifies this product.
- `sku: String` Stock-keeping unit (SKU) identifier of the product. Must be unique across products.
- `unitSymbol: String` Unit of measure shown next to product quantities (e.g. pcs, kg, hours).
- `customFields: JSONString` Custom field values to set, as a JSON object keyed by custom field API name, e.g. {"cfBudget": 1000}. Only the custom fields included are changed; each value uses the format of that field.
- `revision: Int` Revision when entity was lastly changed.
- `productPipelineRelations: [CreateProductPipelineRelationNoProductBackrefInput!]` Deprecated pipeline connection.
- `productPipelines: ProductPipelinesInput` Configuration of Pipelines where the Product can be used.
- `pictureSourceUrl: String` URL of an image to use as the product picture. The image is downloaded from this URL and checked; only pictures are supported.

### CreateProductPipelineRelationNoProductBackrefInput (input)

Field values of a new ProductPipelineRelation record, created together with the record it belongs to.

- `modified: DateTime` Last modification time.
- `created: DateTime` Creation time.
- `pipelineId: ID!` Id of the pipeline in which the product can be added as a line item.
- `revision: Int` Revision when entity was lastly changed.

### DeleteProductInput (input)

Id of the Product record to delete.

- `clientMutationId: String` Optional client-supplied identifier passed on a mutation input and echoed back unchanged on its payload, so a client can correlate the response with its request (Relay convention).
- `id: ID!` Unique identifier of entity.

### ProductPipelinesInput (input)

Pipelines in which a product can be added to opportunities, as set on create or update.

- `pipelines: [ID!]!` Ids of the pipelines the product can be added in. Effective only when allowedPipelines is Selected.
- `allowedPipelines: AccessPipelinesEnum!` Whether the product can be added in all pipelines (All) or only in those listed in pipelines (Selected).

### SetProductPriceList (input)

Parameters of the createProduct mutation.

- `operation: SetProductPriceListOperation!` Which price lists the new products are added to: none (DontSet), all (All) or those in priceListIds (Selected).
- `priceListIds: [UUID!]!` Ids of the price lists to add the products to when operation is Selected.

### UpdateProductInput (input)

Id of a Product record and the field values to change.

- `clientMutationId: String` Optional client-supplied identifier passed on a mutation input and echoed back unchanged on its payload, so a client can correlate the response with its request (Relay convention).
- `id: ID!` Unique identifier of entity.
- `modified: DateTime` Last modification time.
- `created: DateTime` Creation time.
- `picture: CreateCloudObjectInput` Product picture.
- `allowedPipelines: AccessPipelinesEnum` Whether this product can be added to all pipelines or only the explicitly linked subset (see productPipelineRelations).
- `currencyExchangeRatesListId: ID` Id of the currency exchange rate list applied to this product.
- `description: String` Free-form description of the product.
- `name: String` Name of the product, shown in catalogues and pickers.
- `pictureId: ID` Id of the product picture document.
- `productCategoryId: ID` Id of the product category this product belongs to, or empty when it is not categorized.
- `productTypeId: ID` Id of the product type that classifies this product.
- `sku: String` Stock-keeping unit (SKU) identifier of the product. Must be unique across products.
- `unitSymbol: String` Unit of measure shown next to product quantities (e.g. pcs, kg, hours).
- `customFields: JSONString` Custom field values to set, as a JSON object keyed by custom field API name, e.g. {"cfBudget": 1000}. Only the custom fields included are changed; each value uses the format of that field.
- `revision: Int` Revision when entity was lastly changed.
- `productPipelineRelations: [CreateProductPipelineRelationNoProductBackrefInput!]` Deprecated pipeline connection.
- `productPipelines: ProductPipelinesInput` Configuration of Pipelines where the Product can be used.
- `pictureSourceUrl: String` URL of an image to use as the product picture. The image is downloaded from this URL and checked; only pictures are supported.

### BulkUpdateProductPayload (object)

Result of the bulkUpdateProduct mutation.

- `result: BulkUpdateResults!` Ids of the created, updated and deleted records, and the items that failed.

### CreateProductPayload (object)

Result of the createProduct mutation.

- `product: ProductEntity` The created record.
- `clientMutationId: String` Optional client-supplied identifier passed on a mutation input and echoed back unchanged on its payload, so a client can correlate the response with its request (Relay convention).

### DeleteProductPayload (object)

Result of the deleteProduct mutation.

- `product: ProductEntity` The deleted record.
- `clientMutationId: String` Optional client-supplied identifier passed on a mutation input and echoed back unchanged on its payload, so a client can correlate the response with its request (Relay convention).

### UpdateProductPayload (object)

Result of the updateProduct mutation.

- `product: ProductEntity` The updated record.
- `clientMutationId: String` Optional client-supplied identifier passed on a mutation input and echoed back unchanged on its payload, so a client can correlate the response with its request (Relay convention).

### AccessPipelinesEnum (enum)

Which pipelines a product can be added to.

- `All` The product can be added in all pipelines.
- `Selected` The product can be added only in the pipelines it is linked to.

### ProductPipelinesObject (object)

Pipelines in which a product can be added to opportunities.

- `pipelines: [ID!]!` Ids of the pipelines the product can be added in. Effective only when allowedPipelines is Selected.
- `allowedPipelines: AccessPipelinesEnum!` Whether the product can be added in all pipelines (All) or only in those listed in pipelines (Selected).

### ProductPriceListReference (object)

Id and name of one price list a product is priced in.

- `id: ID!` Id of the price list.
- `name: String!` Name of the price list.

### SetProductPriceListOperation (enum)

Which price lists newly created products are added to.

- `DontSet` Products are not added to any price list.
- `All` Products are added to every price list, with a zero price in each currency.
- `Selected` Products are added to the price lists in priceListIds, with a zero price in each currency.

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 FirstProducts {
  entities {
    product {
      getByCriteria(first: 3, orderBy: [{ modified: Desc }]) {
        totalCount
        edges { node { id name formattedName 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 FirstProducts { entities { product { getByCriteria(first: 3, orderBy: [{ modified: Desc }]) { totalCount edges { node { id name formattedName modified } } } } } }"}'
```

## Examples of each operation

Built from the schema and checked against it; replace the placeholders, such as `<product id>`, with values from your space.

### getById

```graphql
query ProductGetById {
  entities {
    product {
      getById(entityId: "<product id>") {
        id
        name
        formattedName
        modified
      }
    }
  }
}
```

### getByIds

```graphql
query ProductGetByIds {
  entities {
    product {
      getByIds(entityIds: ["<product id>"]) {
        id
        name
        formattedName
        modified
      }
    }
  }
}
```

### getAll

```graphql
query ProductGetAll {
  entities {
    product {
      getAll(limit: 10) {
        id
        name
        formattedName
        modified
      }
    }
  }
}
```

### getByCriteria

```graphql
query ProductGetByCriteria {
  entities {
    product {
      getByCriteria(first: 10) {
        totalCount
        edges {
          node {
            id
            name
            formattedName
            modified
          }
        }
        pageInfo {
          hasNextPage
          endCursor
        }
      }
    }
  }
}
```

### getChangedFieldsSinceRevision

```graphql
query ProductGetChangedFieldsSinceRevision {
  entities {
    product {
      getChangedFieldsSinceRevision(id: "<product id>", revision: 10)
    }
  }
}
```

### getBySession

```graphql
query ProductGetBySession {
  entities {
    product {
      getBySession(
        includedIds: ["<product id>"]
        excludedIds: ["<product id>"]
        sessionId: "<session id>"
        first: 10
      ) {
        totalCount
        edges {
          node {
            id
            name
            formattedName
            modified
          }
        }
        pageInfo {
          hasNextPage
          endCursor
        }
      }
    }
  }
}
```

### getByIdFormatted

```graphql
query ProductGetByIdFormatted {
  entities {
    product {
      getByIdFormatted(id: "<product id>")
    }
  }
}
```

### getForPipeline

```graphql
query ProductGetForPipeline {
  entities {
    product {
      getForPipeline(pipelineId: "<pipeline id>", limit: 10) {
        id
        name
        formattedName
        modified
      }
    }
  }
}
```

### createProduct

```graphql
mutation CreateProduct {
  createProduct(input: {name: "Northwind Analytics"}) {
    product {
      id
      name
      formattedName
      modified
    }
  }
}
```

### updateProduct

```graphql
mutation UpdateProduct {
  updateProduct(input: {id: "<product id>"}) {
    product {
      id
      name
      formattedName
      modified
    }
  }
}
```

### bulkUpdateProduct

```graphql
mutation BulkUpdateProduct {
  bulkUpdateProduct(input: [{id: "<product id>"}]) {
    result {
      created {
        id
      }
      errors {
        index
        code
        message
        entityId
      }
      updated
      deleted
      errorsOnDelete {
        index
        code
        message
        entityId
      }
    }
  }
}
```

### deleteProduct

```graphql
mutation DeleteProduct {
  deleteProduct(input: {id: "<product id>"}) {
    product {
      id
      name
      formattedName
      modified
    }
  }
}
```
