---
title: "Bulk save contract performance obligations"
method: POST
path: "/v3/contracts/{id}/performance-obligations"
tags: ["Contracts"]
---

# Bulk save contract performance obligations

`POST /v3/contracts/{id}/performance-obligations`

## Path parameters

- `id` string, required

## Request body

- BatchSavePobsForContractDto
  - `billingTermGroupId` string, required — Billing term group ID (BTG) that all operations are scoped to
  - `toCreate` ContractScopedCreatePobDto[], required — Performance obligations to create within the billing term group
    - `name` string, nullable — The name of the performance obligation
    - `itemId` string, nullable — The ID of the associated integration item
    - `erpClassId` string, nullable — The ID of the ERP class
    - `category` string, nullable — The revenue category name
    - `considerationType` 'FIXED' | 'VARIABLE', nullable — The consideration type for the performance obligation
    - `recognitionPattern` 'POINT_IN_TIME' | 'INPUT_BASED' | 'OUTPUT_BASED' | 'STRAIGHT_LINE' | 'RECOGNIZE_AS_CONSUMED' | 'RECOGNIZE_AS_BILLED' | 'SEAT_BASED_STRAIGHT_LINE', nullable — The revenue recognition pattern
    - `eventTypeId` string, nullable — Event type ID for RECOGNIZE_AS_CONSUMED pattern
    - `productId` string, nullable — The ID of the product this performance obligation is for
    - `serviceStartDate` string, required — Service start date as YYYY-MM-DD string
    - `serviceEndDate` string, required — Service end date as YYYY-MM-DD string
    - `transactionPrice` string, required — Transaction price as a decimal string
  - `toUpdate` ContractScopedUpdatePobDto[], required — Performance obligations to update (must belong to the billing term group)
    - `id` string, required — The ID of the performance obligation to update
    - `name` string, nullable — The name of the performance obligation
    - `itemId` string, nullable — The ID of the associated integration item
    - `erpClassId` string, nullable — The ID of the ERP class
    - `category` string, nullable — The revenue category name
    - `considerationType` 'FIXED' | 'VARIABLE', nullable — The consideration type for the performance obligation
    - `recognitionPattern` 'POINT_IN_TIME' | 'INPUT_BASED' | 'OUTPUT_BASED' | 'STRAIGHT_LINE' | 'RECOGNIZE_AS_CONSUMED' | 'RECOGNIZE_AS_BILLED' | 'SEAT_BASED_STRAIGHT_LINE', nullable — The revenue recognition pattern
    - `eventTypeId` string, nullable — Event type ID for RECOGNIZE_AS_CONSUMED pattern
    - `productId` string, nullable — The ID of the product this performance obligation is for
    - `serviceStartDate` string — Service start date as YYYY-MM-DD string
    - `serviceEndDate` string — Service end date as YYYY-MM-DD string
    - `transactionPrice` string — Transaction price as a decimal string
  - `toDelete` string[], required — Performance obligation IDs to delete

## Response `200`

Batch save completed successfully

- object
  - `payload` object, required — Response payload, will be empty when success is false
    - `errors` object[] — Array of errors if any operations failed
  - `success` boolean, required — Boolean with true=success, false=failure
  - `message` string, required — Plain-text description of the result
  - `error` IntegratorsApiError, required
    - `code` number, required — API response code
    - `message` string, required — API response message
    - `details` object — Additional details about the error

## Other responses

- `400` — Validation error or performance obligation features not enabled
- `404` — Contract not found
- `500` — Internal Server Error

---

[API](https://skmtc.net/tabsplatform/apis/tabs-external-api.md) · [All operations](https://skmtc.net/tabsplatform/apis/tabs-external-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/tabsplatform/tabs-external-api/versions/7e8885517814/schema)
