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

# entities.opptyProductRelation

Read oppty product relation records with the opptyProductRelation repository, and change them with the oppty product relation mutations. Same records as the REST OpptyProductRelations entity.

REST: [OpptyProductRelations](https://developers.coevera.com/reference/rest/oppty-product-relations.md).

## Queries

- `getById(entityId: ID!): OpptyProductRelationEntity` Returns the record with the given id, or null when there is none. Deleted records are returned as well.
- `getByIds(entityIds: [ID!]!): [OpptyProductRelationEntity!]!` 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: OpptyProductRelationFilterInput, orderBy: [OpptyProductRelationOrderByInput!], includeDeleted: Boolean): [OpptyProductRelationEntity!]!` Returns the records that match the filter, paged with limit and offset.
- `getByCriteria(filter: OpptyProductRelationFilterInput, orderBy: [OpptyProductRelationOrderByInput!], includeDeleted: Boolean, before: String, after: String, first: Int, last: Int): OpptyProductRelationEntityConnection` Returns the records 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): OpptyProductRelationEntityConnection` 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.

## Mutations

- `createOpptyProductRelation(input: CreateOpptyProductRelationInput!, validationLevel: [ValidationLevel!]): CreateOpptyProductRelationPayload` Create one record.
- `updateOpptyProductRelation(input: UpdateOpptyProductRelationInput!, validationLevel: [ValidationLevel!], sessionIdToUpdate: String): UpdateOpptyProductRelationPayload` Update fields.
- `bulkUpdateOpptyProductRelation(input: [CreateOrUpdateOpptyProductRelationInput!]!, deleteInput: [DeleteOpptyProductRelationInput!], validationLevel: [ValidationLevel!], rollbackMethod: RollbackMethod, match: MatchingInput): BulkUpdateOpptyProductRelationPayload` Create or update many; per-item results.
- `deleteOpptyProductRelation(input: DeleteOpptyProductRelationInput!): DeleteOpptyProductRelationPayload` Soft-delete.

## Types

### OpptyProductRelationEntity (object)

Product line item on an opportunity or quote, with its quantity, price and discount.

- `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 this line item, inherited from the parent opportunity or quote.
- `onlineFormField: FieldEntity` Online form field that produced this line item, or empty when not applicable.
- `onlineForm: OnlineFormEntity` Online form this line item came from when the related opportunity was created through a form submission, or empty otherwise.
- `oppty: OpportunityEntity` Opportunity this line item belongs to. Set on create; mutually exclusive with quote.
- `opptyProductRelationType: OpptyProductRelationTypeEntity` Line-item type that drives the form layout for this product line. Resolved from the product type on create.
- `pairedOpptyProductRelation: OpptyProductRelationEntity` Counterpart line item on the paired record (e.g. matching line on the active quote when this line is on the opportunity, or vice versa). Empty when there is no pairing.
- `product: ProductEntity` Product on this line item. Set on create; cannot be changed afterwards.
- `quote: QuoteEntity` Quote this line item belongs to. Set on create; mutually exclusive with opportunity.
- `amount: Float` Total amount of the line item (price * quantity, with discounts applied).
- `comment: String` Free-form note describing this line item.
- `currencyExchangeRatesListId: ID` Id of the currency exchange rate list used to convert this line item, inherited from the parent opportunity or quote.
- `onlineFormFieldId: ID` Id of the online form field in which the respondent selected this product, or empty when the line item did not come from a form submission.
- `onlineFormId: ID` Id of the online form submission this line item came from, or empty when it was not created through a form.
- `opptyId: ID` Id of the opportunity.
- `opptyProductRelationTypeId: ID` Id of the line-item type.
- `pairedOpptyProductRelationId: ID` Id of the paired line item.
- `price: Float` Per-unit price of the line item. Defaults to the product price from the price list when not supplied explicitly.
- `productId: ID!` Id of the product on this line item. Set on create; cannot be changed afterwards.
- `quantity: Float` Number of product units on this line item.
- `quoteId: ID` Id of the quote this line item belongs to. Mutually exclusive with opptyId.
- `sectionId: ID` Identifier of the product section this line belongs to (see the productSections JSON layout on the parent opportunity or quote).
- `sortOrder: Int` Display order of the line item within its section. Maintained automatically when lines are added or moved.
- `revision: Int` Revision when entity was lastly changed.
- `revenueSchedule: OpptyProductRelationRevenueScheduleEntity` Per-line revenue schedule splitting the line amount across periods. Available only when revenue scheduling is configured at product-amount level.
- `discountValue: Float` Absolute monetary discount applied to this line item versus the price-list price. Read-only; computed by Coevera.
- `discountPercentage: Float` Percentage discount applied to this line item versus the price-list price. Read-only; computed by Coevera.
- `modifiedByUser: DateTime` Timestamp of the most recent modification made by an end user (excluding system changes). Read-only; computed by Coevera.
- `instancePermissions: [EntityPermsEnum!]! (1 args)` Permissions the current user has on this record, out of the requested ones.

### OpptyProductRelationEntityConnection (object)

Paginated list of OpptyProductRelation records.

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

### OpptyProductRelationEntityEdge (object)

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

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

### OpptyProductRelationFilterInput (input)

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

- `OR: [OpptyProductRelationFilterInput!]` Matches records that meet at least one of the listed filters.
- `AND: [OpptyProductRelationFilterInput!]` Matches records that meet all of the listed filters.
- `NOT: OpptyProductRelationFilterInput` 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.
- `amount: EntityFilterNumberField` Total amount of the line item (price * quantity, with discounts applied).
- `comment: EntityFilterStringField` Free-form note describing this line item.
- `currencyExchangeRatesListId: EntityFilterStringField` Id of the currency exchange rate list used to convert this line item, inherited from the parent opportunity or quote.
- `onlineFormFieldId: EntityFilterStringField` Id of the online form field in which the respondent selected this product, or empty when the line item did not come from a form submission.
- `onlineFormId: EntityFilterStringField` Id of the online form submission this line item came from, or empty when it was not created through a form.
- `opptyId: EntityFilterStringField` Id of the opportunity.
- `opptyProductRelationTypeId: EntityFilterStringField` Id of the line-item type.
- `pairedOpptyProductRelationId: EntityFilterStringField` Id of the paired line item.
- `price: EntityFilterNumberField` Per-unit price of the line item. Defaults to the product price from the price list when not supplied explicitly.
- `productId: EntityFilterStringField` Id of the product on this line item. Set on create; cannot be changed afterwards.
- `quantity: EntityFilterNumberField` Number of product units on this line item.
- `quoteId: EntityFilterStringField` Id of the quote this line item belongs to. Mutually exclusive with opptyId.
- `sectionId: EntityFilterStringField` Identifier of the product section this line belongs to (see the productSections JSON layout on the parent opportunity or quote).
- `sortOrder: EntityFilterNumberField` Display order of the line item within its section. Maintained automatically when lines are added or moved.
- `revision: EntityFilterNumberField` Revision when entity was lastly changed.
- `discountValue: Float` Absolute monetary discount applied to this line item versus the price-list price. Read-only; computed by Coevera.
- `discountPercentage: Float` Percentage discount applied to this line item versus the price-list price. Read-only; computed by Coevera.
- `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 this line item, inherited from the parent opportunity or quote. Matches records where a related record meets these conditions.
- `onlineFormField: FieldFilterInput` Online form field that produced this line item, or empty when not applicable. Matches records where a related record meets these conditions.
- `onlineForm: OnlineFormFilterInput` Online form this line item came from when the related opportunity was created through a form submission, or empty otherwise. Matches records where a related record meets these conditions.
- `oppty: OpportunityFilterInput` Opportunity this line item belongs to. Set on create; mutually exclusive with quote. Matches records where a related record meets these conditions.
- `opptyProductRelationType: OpptyProductRelationTypeFilterInput` Line-item type that drives the form layout for this product line. Resolved from the product type on create. Matches records where a related record meets these conditions.
- `pairedOpptyProductRelation: OpptyProductRelationFilterInput` Counterpart line item on the paired record (e.g. matching line on the active quote when this line is on the opportunity, or vice versa). Empty when there is no pairing. Matches records where a related record meets these conditions.
- `product: ProductFilterInput` Product on this line item. Set on create; cannot be changed afterwards. Matches records where a related record meets these conditions.
- `quote: QuoteFilterInput` Quote this line item belongs to. Set on create; mutually exclusive with opportunity. Matches records where a related record meets these conditions.
- `revenueSchedule: OpptyProductRelationRevenueScheduleFilterInput` Per-line revenue schedule splitting the line amount across periods. Available only when revenue scheduling is configured at product-amount level. Matches records where a related record meets these conditions.

### OpptyProductRelationOrderByInput (input)

Sorting of OpptyProductRelation 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 this line item, inherited from the parent opportunity or quote. Sorts by fields of the related record, listed in order of priority.
- `onlineFormField: [FieldOrderByNestedInput!]` Online form field that produced this line item, or empty when not applicable. Sorts by fields of the related record, listed in order of priority.
- `onlineForm: [OnlineFormOrderByNestedInput!]` Online form this line item came from when the related opportunity was created through a form submission, or empty otherwise. Sorts by fields of the related record, listed in order of priority.
- `oppty: [OpportunityOrderByNestedInput!]` Opportunity this line item belongs to. Set on create; mutually exclusive with quote. Sorts by fields of the related record, listed in order of priority.
- `opptyProductRelationType: [OpptyProductRelationTypeOrderByNestedInput!]` Line-item type that drives the form layout for this product line. Resolved from the product type on create. Sorts by fields of the related record, listed in order of priority.
- `pairedOpptyProductRelation: [OpptyProductRelationOrderByNestedInput!]` Counterpart line item on the paired record (e.g. matching line on the active quote when this line is on the opportunity, or vice versa). Empty when there is no pairing. Sorts by fields of the related record, listed in order of priority.
- `product: [ProductOrderByNestedInput!]` Product on this line item. Set on create; cannot be changed afterwards. Sorts by fields of the related record, listed in order of priority.
- `quote: [QuoteOrderByNestedInput!]` Quote this line item belongs to. Set on create; mutually exclusive with opportunity. Sorts by fields of the related record, listed in order of priority.
- `amount: OrderByEnum` Total amount of the line item (price * quantity, with discounts applied).
- `comment: OrderByEnum` Free-form note describing this line item.
- `currencyExchangeRatesListId: OrderByEnum` Id of the currency exchange rate list used to convert this line item, inherited from the parent opportunity or quote.
- `onlineFormFieldId: OrderByEnum` Id of the online form field in which the respondent selected this product, or empty when the line item did not come from a form submission.
- `onlineFormId: OrderByEnum` Id of the online form submission this line item came from, or empty when it was not created through a form.
- `opptyId: OrderByEnum` Id of the opportunity.
- `opptyProductRelationTypeId: OrderByEnum` Id of the line-item type.
- `pairedOpptyProductRelationId: OrderByEnum` Id of the paired line item.
- `price: OrderByEnum` Per-unit price of the line item. Defaults to the product price from the price list when not supplied explicitly.
- `productId: OrderByEnum` Id of the product on this line item. Set on create; cannot be changed afterwards.
- `quantity: OrderByEnum` Number of product units on this line item.
- `quoteId: OrderByEnum` Id of the quote this line item belongs to. Mutually exclusive with opptyId.
- `sortOrder: OrderByEnum` Display order of the line item within its section. Maintained automatically when lines are added or moved.
- `revision: OrderByEnum` Revision when entity was lastly changed.
- `revenueSchedule: [OpptyProductRelationRevenueScheduleOrderByNestedInput!]` Per-line revenue schedule splitting the line amount across periods. Available only when revenue scheduling is configured at product-amount level. Sorts by fields of the related record, listed in order of priority.
- `discountValue: OrderByEnum` Absolute monetary discount applied to this line item versus the price-list price. Read-only; computed by Coevera.
- `discountPercentage: OrderByEnum` Percentage discount applied to this line item versus the price-list price. Read-only; computed by Coevera.
- `withCustom: CommonEntityRepositoryOrderByCustomField` Sorts by a custom field.

### CreateOpptyProductRelationInput (input)

Field values of a new OpptyProductRelation 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.
- `pairedOpptyProductRelation: CreateOpptyProductRelationInput` Counterpart line item on the paired record (e.g. matching line on the active quote when this line is on the opportunity, or vice versa). Empty when there is no pairing.
- `amount: Float` Total amount of the line item (price * quantity, with discounts applied).
- `comment: String` Free-form note describing this line item.
- `currencyExchangeRatesListId: ID` Id of the currency exchange rate list used to convert this line item, inherited from the parent opportunity or quote.
- `onlineFormFieldId: ID` Id of the online form field in which the respondent selected this product, or empty when the line item did not come from a form submission.
- `onlineFormId: ID` Id of the online form submission this line item came from, or empty when it was not created through a form.
- `opptyId: ID` Id of the opportunity.
- `opptyProductRelationTypeId: ID` Id of the line-item type.
- `pairedOpptyProductRelationId: ID` Id of the paired line item.
- `price: Float` Per-unit price of the line item. Defaults to the product price from the price list when not supplied explicitly.
- `productId: ID!` Id of the product on this line item. Set on create; cannot be changed afterwards.
- `quantity: Float` Number of product units on this line item.
- `quoteId: ID` Id of the quote this line item belongs to. Mutually exclusive with opptyId.
- `sectionId: ID` Identifier of the product section this line belongs to (see the productSections JSON layout on the parent opportunity or quote).
- `sortOrder: Int` Display order of the line item within its section. Maintained automatically when lines are added or moved.
- `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.
- `revenueSchedule: CreateOpptyProductRelationRevenueScheduleNoIdBackrefInput` Per-line revenue schedule splitting the line amount across periods. Available only when revenue scheduling is configured at product-amount level.

### CreateOpptyProductRelationRevenueScheduleNoIdBackrefInput (input)

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

- `isDeleted: Boolean` Specifies if the entity is considered deleted.
- `modified: DateTime` Last modification time.
- `created: DateTime` Creation time.
- `cancelationDate: Date` Date when the revenue schedule was cancelled. Empty for active schedules.
- `periodCount: Int` Number of periods the line-item amount is split into.
- `periodType: RevenueSchedulePeriodTypeEnum` Length of each period (e.g. Monthly, Quarterly, Yearly).
- `startDate: Date` Date when revenue recognition for this product line begins.
- `revision: Int` Revision when entity was lastly changed.

### CreateOrUpdateOpptyProductRelationInput (input)

Field values of an OpptyProductRelation 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.
- `pairedOpptyProductRelation: CreateOpptyProductRelationInput` Counterpart line item on the paired record (e.g. matching line on the active quote when this line is on the opportunity, or vice versa). Empty when there is no pairing.
- `amount: Float` Total amount of the line item (price * quantity, with discounts applied).
- `comment: String` Free-form note describing this line item.
- `currencyExchangeRatesListId: ID` Id of the currency exchange rate list used to convert this line item, inherited from the parent opportunity or quote.
- `onlineFormFieldId: ID` Id of the online form field in which the respondent selected this product, or empty when the line item did not come from a form submission.
- `onlineFormId: ID` Id of the online form submission this line item came from, or empty when it was not created through a form.
- `opptyId: ID` Id of the opportunity.
- `opptyProductRelationTypeId: ID` Id of the line-item type.
- `pairedOpptyProductRelationId: ID` Id of the paired line item.
- `price: Float` Per-unit price of the line item. Defaults to the product price from the price list when not supplied explicitly.
- `productId: ID` Id of the product on this line item. Set on create; cannot be changed afterwards.
- `quantity: Float` Number of product units on this line item.
- `quoteId: ID` Id of the quote this line item belongs to. Mutually exclusive with opptyId.
- `sectionId: ID` Identifier of the product section this line belongs to (see the productSections JSON layout on the parent opportunity or quote).
- `sortOrder: Int` Display order of the line item within its section. Maintained automatically when lines are added or moved.
- `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.
- `revenueSchedule: UpdateOpptyProductRelationRevenueScheduleNoIdBackrefInput` Per-line revenue schedule splitting the line amount across periods. Available only when revenue scheduling is configured at product-amount level.

### DeleteOpptyProductRelationInput (input)

Id of the OpptyProductRelation 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.

### UpdateOpptyProductRelationInput (input)

Id of an OpptyProductRelation 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.
- `pairedOpptyProductRelation: CreateOpptyProductRelationInput` Counterpart line item on the paired record (e.g. matching line on the active quote when this line is on the opportunity, or vice versa). Empty when there is no pairing.
- `amount: Float` Total amount of the line item (price * quantity, with discounts applied).
- `comment: String` Free-form note describing this line item.
- `currencyExchangeRatesListId: ID` Id of the currency exchange rate list used to convert this line item, inherited from the parent opportunity or quote.
- `onlineFormFieldId: ID` Id of the online form field in which the respondent selected this product, or empty when the line item did not come from a form submission.
- `onlineFormId: ID` Id of the online form submission this line item came from, or empty when it was not created through a form.
- `opptyId: ID` Id of the opportunity.
- `opptyProductRelationTypeId: ID` Id of the line-item type.
- `pairedOpptyProductRelationId: ID` Id of the paired line item.
- `price: Float` Per-unit price of the line item. Defaults to the product price from the price list when not supplied explicitly.
- `quantity: Float` Number of product units on this line item.
- `quoteId: ID` Id of the quote this line item belongs to. Mutually exclusive with opptyId.
- `sectionId: ID` Identifier of the product section this line belongs to (see the productSections JSON layout on the parent opportunity or quote).
- `sortOrder: Int` Display order of the line item within its section. Maintained automatically when lines are added or moved.
- `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.
- `revenueSchedule: UpdateOpptyProductRelationRevenueScheduleNoIdBackrefInput` Per-line revenue schedule splitting the line amount across periods. Available only when revenue scheduling is configured at product-amount level.

### UpdateOpptyProductRelationRevenueScheduleNoIdBackrefInput (input)

Id of an OpptyProductRelationRevenueSchedule record and the field values to change, updated together with the record it belongs to.

- `isDeleted: Boolean` Specifies if the entity is considered deleted.
- `modified: DateTime` Last modification time.
- `created: DateTime` Creation time.
- `cancelationDate: Date` Date when the revenue schedule was cancelled. Empty for active schedules.
- `periodCount: Int` Number of periods the line-item amount is split into.
- `periodType: RevenueSchedulePeriodTypeEnum` Length of each period (e.g. Monthly, Quarterly, Yearly).
- `startDate: Date` Date when revenue recognition for this product line begins.
- `revision: Int` Revision when entity was lastly changed.

### BulkUpdateOpptyProductRelationPayload (object)

Result of the bulkUpdateOpptyProductRelation mutation.

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

### CreateOpptyProductRelationPayload (object)

Result of the createOpptyProductRelation mutation.

- `opptyProductRelation: OpptyProductRelationEntity` 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).

### DeleteOpptyProductRelationPayload (object)

Result of the deleteOpptyProductRelation mutation.

- `opptyProductRelation: OpptyProductRelationEntity` 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).

### UpdateOpptyProductRelationPayload (object)

Result of the updateOpptyProductRelation mutation.

- `opptyProductRelation: OpptyProductRelationEntity` 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).

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