Approvals API (/approvals)

Use the approvals API to create, update, or query the approval of a document. This includes specific endpoints to take action (reject/hold/approve) as well as requisition details like requestor, line items, and shipping details.

The URL to access the approvals API is:

https://<instance>/api/approvals/<approval id>

See Integration Best Practices for more info. To learn more about implementing remote approvals, see Remote Approvals via API.

Actions

Verb Path Action Description
PUT /api/approvals/:id/approve approve Perform Approve action on an approval
PUT /api/approvals/:id/hold hold Perform Hold action on an approval
GET /api/approvals index Query approvals
PUT /api/approvals/:id/reject reject Perform Reject action on an approval
GET /api/approvals/:id show Show approval
PUT /api/approvals/:id update Update approval

Elements

These are the elements available for the Approvals API

Field Name Field Description Req'd Unique? Allowable Values In Out Type
approvable-id The document ID that was approved yes integer
approvable-type The document type that was approved (requisition, purchase order, etc) yes string(255)
approval-chain-id ID of the approval chain this approval is located in yes integer
approval-date The date the approval occurred yes datetime
approved-by The user name that made the approval yes User
approver approver yes User, Approval Group
approver-id The user ID that made the approval yes integer
approver-type The role of the approver yes string(255)
created-at Automatically created by Coupa in the format YYYY-MM-DDTHH:MM:SS+HH:MMZ yes datetime
created-by User who created yes User
delegate delegate yes User, Approval Group
delegate-id The delegate ID that made the approval (if applicable) yes integer
delegates Delegates yes Delegate Approval
holdable Hold the approval or not yes boolean
id Coupa unique identifier yes integer
note Reason for approval or reject yes text
position The position in the approval chain this approval occurred yes integer
reasons Reasons yes Approval Reason
status The status of the approval (approved, escalated, rejected, etc) yes string(50)
type How the approval occured (override approval, approval chain approval, etc) yes string(255)
updated-at Automatically created by Coupa in the format YYYY-MM-DDTHH:MM:SS+HH:MMZ yes datetime
updated-by User who updated yes User

Example

In this example, we queried for a single approval with an ID of 12622. We did a GET to the URL:

https://<instance url>/api/approvals/12622 

Approvals GET Response

<?xml version="1.0" encoding="UTF-8"?>
<approval>
	 <id type="integer">12622</id>
	 <created-at type="datetime">2012-02-15T14:56:22-08:00</created-at>
	 <updated-at type="datetime">2012-04-23T11:49:25-07:00</updated-at>
	 <position type="integer">1</position>
	 <approval-chain-id nil="true" />
	 <status>approved</status>
	 <approval-date type="datetime">2012-02-15T14:56:59-08:00</approval-date>
	 <note />
	 <type>ManagementHierarchyApproval</type>
	 <approvable-type>RequisitionHeader</approvable-type>
	 <approvable-id type="integer">2696</approvable-id>
	 <approver>
			<id type="integer">3</id>
			<login>vpierre</login>
			<email>upgrade+vp@coupa.com</email>
			<employee-number />
			<firstname>Victor (CFO)</firstname>
			<lastname>Pierre</lastname>
			<salesforce-id nil="true" />
	 </approver>
	 <created-by>
			<id type="integer">9</id>
			<login>bjenkins</login>
			<email>upgrade+bj@coupa.com</email>
			<employee-number />
			<firstname>Bob (VP Procurement)</firstname>
			<lastname>Jenkins</lastname>
			<salesforce-id nil="true" />
	 </created-by>
<updated-by>
			<id type="integer">17</id>
			<login>coupa_metrics_gatherer</login>
			<email>do_not_reply_metrics@coupa.com</email>
			<employee-number nil="true" />
			<firstname>Coupa</firstname>
			<lastname>Metrics</lastname>
			<salesforce-id nil="true" />
	 </updated-by>
</approval>

Approving or Rejecting

The following describes how you can use the Coupa API to perform actions on Approvals.

Approving

/api/approvals/{id}/approve

Rejecting

/api/approvals/{id}/reject

Adding Reason

In both cases, an approval must be Pending (and not already approved or rejected) for the action to be valid. It is also possible to provide a "Reason" for the rejection through the XML request directly. For example, to reject an approval by id of 12612 and provide a reason of "Rejected by Integration", you would use the following request:

PUT https://{instance url}/api/approvals/12612/reject?reason=Rejected%20by%20Integration

Successful requests will return HTTP 200 Response. The body of the response will include the created requisition. Unsuccessful requests will return

HTTP 400 Bad Request
. The body of the response will include validation errors formatted as XML.