Contract Rounds API

Use the Contract Rounds API to retrieve information about contract review rounds, approval progression, reviewer statuses, SLAs, turnaround times, metadata, and watchers in Coupa CLM.

Overview

The Contract Rounds API provides REST access to contract review history and active review cycles. Use this endpoint to monitor reviewer bottlenecks, track negotiation turnaround times against SLAs, and audit review chain triggers across contract iterations.

Elements

The top-level payload response contains the following primary objects:

ElementDescriptionRequired Field?Unique?Allowable ValueApi_In Field?Api_Out Field?Data Type
contract_roundsArray of contract review round objects (XML tag: contract-rounds)nonoanynoyesarray
metadataObject containing user permission flags for the review roundnonoanynoyesobject
watchersArray of watcher objects tracking the contract roundnonoanynoyesarray

The following elements are nested under contract_rounds (XML tag: contract-round):

ElementDescriptionRequired Field?Unique?Allowable ValueApi_In Field?Api_Out Field?Data Type
idCoupa unique identifier for the roundnonoanynoyesinteger
statusStatus of the contract roundnonodraft, pending_review, completed, closednoyesstring
positionSequential position or iteration number of the review roundnonoanynoyesinteger
started_atTimestamp when the overall round was startednonoanynoyesdatetime
internal_review_started_atTimestamp when internal review phase begannonoanynoyesdatetime
internal_review_completed_atTimestamp when internal review phase completednonoanynoyesdatetime
negotiation_started_atTimestamp when counterparty negotiation phase startednonoanynoyesdatetime
negotiation_completed_atTimestamp when counterparty negotiation phase completednonoanynoyesdatetime
created_atTimestamp when round was created in format YYYY-MM-DDTHH:MM:SS+HH:MMnonoanynoyesdatetime
updated_atTimestamp when round was updated in format YYYY-MM-DDTHH:MM:SS+HH:MMnonoanynoyesdatetime
created_byUser who created the roundnonoanynoyesUser
updated_byUser who updated the roundnonoanynoyesUser
reviewsArray of review assignments for this roundnonoanynoyesarray
counterparty_reviewsArray of counterparty review assignments for this roundnonoanynoyesarray

The following elements are nested under reviews:

ElementDescriptionRequired Field?Unique?Allowable ValueApi_In Field?Api_Out Field?Data Type
idCoupa unique identifier of the review recordnonoanynoyesinteger
statusCurrent status of the reviewnonopending_review, completed, skippednoyesstring
reviewer_idCoupa unique identifier of the reviewer or user group (XML tag: reviewer-id)nonoanynoyesinteger
reviewer_typeType of reviewer entity (e.g. User, UserGroup)nonoanynoyesstring
reviewer_nameFull name of the assigned reviewer or user groupnonoanynoyesstring
reviewer_emailEmail address of the assigned reviewernonoanynoyesstring
first_notified_atTimestamp when reviewer was notified (XML tag: first-notified-at)nonoanynoyesdatetime
last_reminded_atTimestamp when reviewer was last reminded (XML tag: last-reminded-at)nonoanynoyesdatetime
reviewed_atTimestamp when review was completed (XML tag: reviewed-at)nonoanynoyesdatetime
reviewed_by_idCoupa unique identifier of the user who completed the review (XML tag: reviewed-by-id)nonoanynoyesinteger
reviewed_by_nameFull name of the user who completed the reviewnonoanynoyesstring
added_by_idCoupa unique identifier of the user who added this reviewer (XML tag: added-by-id)nonoanynoyesinteger
added_by_nameFull name of the user who added this reviewernonoanynoyesstring
can_bypass_reviewBoolean flag indicating whether review bypass is permitted (XML tag: can-bypass-review)nonotrue, falsenoyesboolean
noteNotes or review comments entered by the reviewernonoanynoyestext
review_chain_descriptionDescription explaining the rule or chain that triggered the review (Array of strings in JSON; Array of rule description objects in XML)nonoanynoyesarray
created_atTimestamp when review entry was created (XML tag: created-at)nonoanynoyesdatetime
updated_atTimestamp when review entry was updated (XML tag: updated-at)nonoanynoyesdatetime
created_byUser who created the review record (XML tag: created-by)nonoanynoyesUser
updated_byUser who updated the review record (XML tag: updated-by)nonoanynoyesUser

The following elements are nested under metadata:

ElementDescriptionRequired Field?Unique?Allowable ValueApi_In Field?Api_Out Field?Data Type
can_complete_reviewIndicates if current user can complete the review (XML tag: can-complete-review)nonotrue, falsenoyesboolean
can_start_reviewIndicates if current user can start the review (XML tag: can-start-review)nonotrue, falsenoyesboolean
can_add_reviewerIndicates if current user can add a reviewer (XML tag: can-add-reviewer)nonotrue, falsenoyesboolean
has_counterparty_reviewsIndicates presence of counterparty reviews (XML tag: has-counterparty-reviews)nonotrue, falsenoyesboolean
can_add_watcherIndicates if current user can add a watcher (XML tag: can-add-watcher)nonotrue, falsenoyesboolean
is_reviewerIndicates if current user is assigned as a reviewer (XML tag: is-reviewer)nonotrue, falsenoyesboolean
is_watcherIndicates if current user is an active watcher (XML tag: is-watcher)nonotrue, falsenoyesboolean
is_owner_creatorIndicates if current user is the contract owner/creator (XML tag: is-owner-creator)nonotrue, falsenoyesboolean

The following elements are nested under watchers (XML tag: watcher):

ElementDescriptionRequired Field?Unique?Allowable ValueApi_In Field?Api_Out Field?Data Type
idCoupa unique identifier of the watcher recordnonoanynoyesinteger
watcher_idCoupa unique user ID of the watcher (XML tag: watcher-id)nonoanynoyesinteger
watcher_typeWatcher entity type (e.g. User)nonoanynoyesstring
watcher_nameFull name of the watchernonoanynoyesstring
watcher_emailEmail address of the watchernonoanynoyesstring
can_remove_watcherIndicates if current user can remove this watcher (XML tag: can-remove-watcher)nonotrue, falsenoyesboolean
created_atTimestamp when watcher was added (XML tag: created-at)nonoanynoyesdatetime
created_by_idCoupa user ID of creator (XML tag: created-by-id)nonoanynoyesinteger
created_by_nameFull name of the user who added the watchernonoanynoyesstring

Contract Rounds API Example Calls

Query Options for Contract Rounds:

This query retrieves all rounds, reviewer statuses, metadata, and watchers for a contract:

https://<instance>.coupahost.com/api/contracts/<contract_id>/contract_rounds
Important: Passing the X-COUPA-USER-ID HTTP header is recommended for automated integrations. Coupa verifies that this user has content group permissions to access the specified contract record before returning review round details.
Tip: Payload Encapsulation & Naming Conventions Note:

Please note key structural and naming conventions across formats:

  • JSON Naming & Root Structure: Standard JSON responses use underscores (snake_case, e.g. created_at, first_notified_at) and return a top-level JSON object containing "contract_rounds", "metadata", and "watchers". The review_chain_description field returns an array of formatted strings.
  • XML Naming & Root Structure: XML responses are wrapped in a top-level <hash> root element containing <contract-rounds>, <metadata>, and <watchers>. Standard timestamp/relationship tags use hyphens (kebab-case, e.g. <created-at>), while specific attributes use underscores (e.g. <reviewer_type>, <reviewer_email>). The <review-chain-description> node returns an array of structured rule objects.

Contract Rounds API GET Example (XML)

In this example, we queried for the contract rounds associated with contract ID 1263.

We did a GET to the URL:

https://<instance url>/api/contracts/1263/contract_rounds

Here is the response matching the search criteria:

<?xml version="1.0" encoding="UTF-8"?>
<hash>
    <contract-rounds type="array">
        <contract-round>
            <id type="integer">1263</id>
            <created-at type="dateTime">2026-06-05T10:29:05-06:00</created-at>
            <updated-at type="dateTime">2026-06-05T10:50:21-06:00</updated-at>
            <status>closed</status>
            <reviews type="array">
                <review>
                    <id type="integer">589</id>
                    <created-at type="dateTime">2026-06-05T10:46:44-06:00</created-at>
                    <updated-at type="dateTime">2026-06-05T10:50:21-06:00</updated-at>
                    <status>completed</status>
                    <note>Contract terms verified and approved.</note>
                    <reviewed-at type="dateTime">2026-06-05T10:50:21-06:00</reviewed-at>
                    <reviewed-by-id type="integer">522</reviewed-by-id>
                    <first-notified-at type="dateTime">2026-06-05T10:46:44-06:00</first-notified-at>
                    <last-reminded-at nil="true"/>
                    <reviewer-id type="integer">522</reviewer-id>
                    <reviewer_type>User</reviewer_type>
                    <added-by-id nil="true"/>
                    <reviewer_name>Alex Morgan</reviewer_name>
                    <reviewed-by-name>Alex Morgan</reviewed-by-name>
                    <added-by-name nil="true"/>
                    <review-chain-description type="array">
                        <review-chain-description>
                            <id type="integer">699</id>
                            <review-id type="integer">589</review-id>
                            <key>review.reason.added_by_review_chain</key>
                            <params>
                                <review_chain_name>Legal High Value Chain</review_chain_name>
                            </params>
                            <created-at type="dateTime">2026-06-05T10:46:44-06:00</created-at>
                            <updated-at type="dateTime">2026-06-05T10:46:44-06:00</updated-at>
                        </review-chain-description>
                    </review-chain-description>
                    <can-bypass-review type="boolean">false</can-bypass-review>
                    <reviewer_email>alex.morgan@example.com</reviewer_email>
                    <created-by>
                        <id type="integer">522</id>
                        <login>alex.morgan@example.com</login>
                        <employee-number nil="true"/>
                        <firstname>Alex</firstname>
                        <lastname>Morgan</lastname>
                        <fullname>Alex Morgan</fullname>
                        <email>alex.morgan@example.com</email>
                        <salesforce-id nil="true"/>
                        <avatar-thumb-url nil="true"/>
                    </created-by>
                    <updated-by>
                        <id type="integer">522</id>
                        <login>alex.morgan@example.com</login>
                        <employee-number nil="true"/>
                        <firstname>Alex</firstname>
                        <lastname>Morgan</lastname>
                        <fullname>Alex Morgan</fullname>
                        <email>alex.morgan@example.com</email>
                        <salesforce-id nil="true"/>
                        <avatar-thumb-url nil="true"/>
                    </updated-by>
                </review>
            </reviews>
            <started-at type="dateTime">2026-06-05T10:29:05-06:00</started-at>
            <internal-review-started-at type="dateTime">2026-06-05T10:29:05-06:00</internal-review-started-at>
            <internal-review-completed-at type="dateTime">2026-06-05T10:50:21-06:00</internal-review-completed-at>
            <negotiation-started-at nil="true"/>
            <negotiation-completed-at nil="true"/>
            <position type="integer">1</position>
            <counterparty-reviews type="array"/>
            <created-by>
                <id type="integer">522</id>
                <login>alex.morgan@example.com</login>
                <employee-number nil="true"/>
                <firstname>Alex</firstname>
                <lastname>Morgan</lastname>
                <fullname>Alex Morgan</fullname>
                <email>alex.morgan@example.com</email>
                <salesforce-id nil="true"/>
                <avatar-thumb-url nil="true"/>
            </created-by>
            <updated-by>
                <id type="integer">522</id>
                <login>alex.morgan@example.com</login>
                <employee-number nil="true"/>
                <firstname>Alex</firstname>
                <lastname>Morgan</lastname>
                <fullname>Alex Morgan</fullname>
                <email>alex.morgan@example.com</email>
                <salesforce-id nil="true"/>
                <avatar-thumb-url nil="true"/>
            </updated-by>
        </contract-round>
    </contract-rounds>
    <metadata>
        <can-complete-review type="boolean">false</can-complete-review>
        <can-start-review type="boolean">false</can-start-review>
        <can-add-reviewer type="boolean">false</can-add-reviewer>
        <has-counterparty-reviews type="boolean">false</has-counterparty-reviews>
        <can-add-watcher type="boolean">false</can-add-watcher>
        <is-reviewer type="boolean">false</is-reviewer>
        <is-watcher type="boolean">false</is-watcher>
        <is-owner-creator type="boolean">false</is-owner-creator>
    </metadata>
    <watchers type="array">
        <watcher>
            <id type="integer">171</id>
            <watcher_type>User</watcher_type>
            <watcher_name>Taylor Reed</watcher_name>
            <can-remove-watcher type="boolean">false</can-remove-watcher>
            <created-at type="dateTime">2026-06-05T10:50:21-06:00</created-at>
            <created-by-id type="integer">541</created-by-id>
            <watcher-id type="integer">541</watcher-id>
            <watcher_email>taylor.reed@example.com</watcher_email>
            <created_by_name>Taylor Reed</created_by_name>
        </watcher>
    </watchers>
</hash>

Contract Rounds API GET Example (JSON)

We did a GET with header Accept: application/json to the URL:

https://<instance url>/api/contracts/1263/contract_rounds

Here is the response matching the search criteria:

{
  "contract_rounds": [
    {
      "id": 1263,
      "created_at": "2026-06-05T10:29:05-06:00",
      "updated_at": "2026-06-05T10:50:21-06:00",
      "status": "closed",
      "reviews": [
        {
          "id": 589,
          "created_at": "2026-06-05T10:46:44-06:00",
          "updated_at": "2026-06-05T10:50:21-06:00",
          "status": "completed",
          "note": "Contract terms verified and approved.",
          "reviewed_at": "2026-06-05T10:50:21-06:00",
          "reviewed_by_id": 522,
          "first_notified_at": "2026-06-05T10:46:44-06:00",
          "last_reminded_at": null,
          "reviewer_id": 522,
          "reviewer_type": "User",
          "added_by_id": null,
          "reviewer_name": "Alex Morgan",
          "reviewed_by_name": "Alex Morgan",
          "added_by_name": null,
          "review_chain_description": [
            "Added by the review chain: Legal High Value Chain"
          ],
          "can_bypass_review": false,
          "reviewer_email": "alex.morgan@example.com",
          "created_by": {
            "id": 522,
            "login": "alex.morgan@example.com",
            "employee_number": null,
            "firstname": "Alex",
            "lastname": "Morgan",
            "fullname": "Alex Morgan",
            "email": "alex.morgan@example.com",
            "salesforce_id": null,
            "avatar_thumb_url": null
          },
          "updated_by": {
            "id": 522,
            "login": "alex.morgan@example.com",
            "employee_number": null,
            "firstname": "Alex",
            "lastname": "Morgan",
            "fullname": "Alex Morgan",
            "email": "alex.morgan@example.com",
            "salesforce_id": null,
            "avatar_thumb_url": null
          }
        }
      ],
      "started_at": "2026-06-05T10:29:05-06:00",
      "internal_review_started_at": "2026-06-05T10:29:05-06:00",
      "internal_review_completed_at": "2026-06-05T10:50:21-06:00",
      "negotiation_started_at": null,
      "negotiation_completed_at": null,
      "position": 1,
      "counterparty_reviews": [],
      "created_by": {
        "id": 522,
        "login": "alex.morgan@example.com",
        "employee_number": null,
        "firstname": "Alex",
        "lastname": "Morgan",
        "fullname": "Alex Morgan",
        "email": "alex.morgan@example.com",
        "salesforce_id": null,
        "avatar_thumb_url": null
      },
      "updated_by": {
        "id": 522,
        "login": "alex.morgan@example.com",
        "employee_number": null,
        "firstname": "Alex",
        "lastname": "Morgan",
        "fullname": "Alex Morgan",
        "email": "alex.morgan@example.com",
        "salesforce_id": null,
        "avatar_thumb_url": null
      }
    }
  ],
  "metadata": {
    "can_complete_review": false,
    "can_start_review": false,
    "can_add_reviewer": false,
    "has_counterparty_reviews": false,
    "can_add_watcher": false,
    "is_reviewer": false,
    "is_watcher": false,
    "is_owner_creator": false
  },
  "watchers": [
    {
      "id": 171,
      "watcher_type": "User",
      "watcher_name": "Taylor Reed",
      "can_remove_watcher": false,
      "created_at": "2026-06-05T10:50:21-06:00",
      "created_by_id": 541,
      "watcher_id": 541,
      "watcher_email": "taylor.reed@example.com",
      "created_by_name": "Taylor Reed"
    }
  ]
}

Error Handling

Response CodeMessage / ReasonSolution
401 UnauthorizedUnauthorizedVerify your X-COUPA-API-KEY is active and passed correctly.
404 Not FoundContract not found.Verify the contract ID exists and that the specified user has membership in the contract's Content Group.
404 Not FoundUser not found.Verify the user ID specified in X-COUPA-USER-ID exists in the instance.