---
title: "OpptyProductRelations.batch_create_or_update"
method: POST
path: "/entities/OpptyProductRelations/batch-modify"
tags: ["Product Line Items"]
---

# OpptyProductRelations.batch_create_or_update

`POST /entities/OpptyProductRelations/batch-modify`

## Request

- Base URL: `https://us-east.api.coevera.com/api/v100/rest/spaces/your_space_id`
- URL: `https://us-east.api.coevera.com/api/v100/rest/spaces/your_space_id/entities/OpptyProductRelations/batch-modify`
- Auth: HTTP basic
- TypeScript: <https://skmtc.dev/coevera/apis/coevera-crm-api/docs/entities/OpptyProductRelations/batch-modify/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates or updates OpptyProductRelation records in one request: an item with an id updates that record, an item without one creates a new record.

## Query parameters

- `validation-level` integer
- `rollback-method` 0 | 1

## Request body

- BatchOpptyProductRelationInput[]
  - `paired_oppty_product_relation` object: 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. Related OpptyProductRelation record; see 'updateOpptyProductRelationInput' for its fields.
    - `id` string, uuid: Id of the related OpptyProductRelation record.
  - `amount` number, double: Total amount of the line item (price * quantity, with discounts applied).
  - `comment` string: Free-form note describing this line item.
  - `currency_exchange_rates_list_id` string, uuid: Id of the currency exchange rate list used to convert this line item, inherited from the parent opportunity or quote.
  - `online_form_field_id` string, uuid: 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.
  - `online_form_id` string, uuid: Id of the online form submission this line item came from, or empty when it was not created through a form.
  - `oppty_id` string, uuid: Id of the opportunity.
  - `oppty_product_relation_type_id` string, uuid: Id of the line-item type.
  - `paired_oppty_product_relation_id` string, uuid: Id of the paired line item.
  - `price` number, double: Per-unit price of the line item. Defaults to the product price from the price list when not supplied explicitly.
  - `quantity` number, double: Number of product units on this line item.
  - `quote_id` string, uuid: Id of the quote this line item belongs to. Mutually exclusive with oppty_id.
  - `section_id` string, uuid: Identifier of the product section this line belongs to (see the product_sections JSON layout on the parent opportunity or quote).
  - `sort_order` integer: Display order of the line item within its section. Maintained automatically when lines are added or moved.
  - `revision` integer: Revision when entity was lastly changed.
  - `revenue_schedule` object: Per-line revenue schedule splitting the line amount across periods. Available only when revenue scheduling is configured at product-amount level. Related OpptyProductRelationRevenueSchedule record; see 'updateOpptyProductRelationRevenueScheduleInput' for its fields.
    - `id` string, uuid: Id of the related OpptyProductRelationRevenueSchedule record.
  - `id` string, uuid: ID of object to update.

## Response `200`

Result per item, in request order: the id of the created or updated record, or the error.

- object
  - `success` boolean: True when the request succeeded; false on error.
  - `data` union[]
    - union
      - string, uuid: Id of the created or updated record.
      - Error: The body of every REST error. `code` and `name` are stable identifiers; `message` is for people. The full list of codes is at https://developers.coevera.com/reference/errors/.
        - `http_status` integer, required: HTTP status code.
        - `code` integer: Numeric code of the API error.
        - `name` string: Name of the API error.
        - `message` string: Message describing the error.
        - `success` boolean, required: Always false on error.

## Other responses

- `400`: Bad request: a bad or unknown parameter (codes 117, 118), a missing permission (code 50), conflicting data (code 2002) or any other API error. The REST API answers 400 where others answer 403 or 409; check `code`.
- `401`: Not authenticated: missing or wrong credentials, a credential of another space, or an expired token (code 401, ERROR_UNAUTHORIZED).
- `422`: Validation failed (code 40000, with the failing fields) or a required parameter is missing (code 119). By default one failed item fails a whole batch and nothing is written.
- `429`: Too many requests (code 182). Wait for the seconds in Retry-After, then retry.
- `500`: Unexpected server error (code 1000, ERROR_UNKNOWN).

---

[API](https://skmtc.dev/coevera/apis/coevera-crm-api.md) - [All operations](https://skmtc.dev/coevera/apis/coevera-crm-api/llms.txt) - [OpenAPI document](https://skmtc.dev/coevera/apis/coevera-crm-api/revisions/40ebbc83f179?raw)
