Quote Responses API
Use the quote responses API endpoints to create, update, submit, and view supplier responses to sourcing events, upload response attachments, and award lines and lots.
Actions
| Verb | Path | Action | Description |
|---|---|---|---|
| POST | /api/quote_responses
| create | Create a draft response for a supplier on a sourcing event. |
| PUT, PATCH | /api/quote_responses/:id
| update | Update a draft response (e.g., lines, comments, name, attachments). |
| PATCH | /api/quote_responses/:id
| update | Upload a file using multipart/form-data and attach it to a line, event-level attachment response, or form response. |
| PUT | /api/quote_responses/:id/submit
| submit | Submit a draft response. |
| POST | /api/quote_responses/:id/award
| award | Award the quote response. |
| DELETE | /api/quote_responses/:id/award
| remove_award | Remove award from the quote response. |
| GET | /api/quote_requests/:quote_request_id/quote_responses
| index | Get the latest submitted response per supplier. To see all responses, use the /api/quote_requests/:quote_request_id/quote_responses/all endpoint. |
| GET | /api/quote_requests/:quote_request_id/quote_responses/all
| all | Get all responses for a Sourcing event, including all submitted and draft responses. |
| GET | /api/quote_responses
| index | Get all responses of specific Sourcing event. |
| GET | /api/quote_responses/:id
| show | Get information about the particular response. |
| GET | /api/quote_responses/all
| all | Get all responses, including all submitted and draft responses. |
Create a Quote Response (POST /api/quote_responses)
Creates a draft response (state: "working") on behalf of a supplier. Lines, lots, and questionnaire/form responses are initialized automatically from the sourcing event. You do not send lines on create; lines are updated in a subsequent update call.
Request Body Parameters:
quote-request-id(integer, required): The ID of the sourcing event.quote-supplier-id(integer, required): The ID of the supplier invited to that event.name(string, optional): Response name.comments(text, optional): General comments.
If the event does not allow multiple responses and the supplier already has a draft (working) response, the API returns the existing draft rather than creating a new record. Do not retry requests expecting duplicates to be created.
Behavior & Constraints:
- Returns
201 Createdwith the full response object. - On events configured for multiple responses, a unique
track-idis assigned. - A distributed lock is taken on the supplier during creation to prevent concurrent duplicate creations.
- Drafts are saved without executing complete response validation. Strict validation occurs at submit time.
- Only buyer users can perform this action (supplier users receive
403 Forbidden).
Submit a Quote Response (PUT /api/quote_responses/:id/submit)
Submits a draft quote response. This endpoint takes no request body and returns 200 OK with the submitted response payload.
Side Effects:
- Changes
statetosubmitted. - Sets
submitted-atto the current timestamp. - Marks the response as the supplier's active bid.
- Updates supplier participation status to
responded.
403 Forbidden.Multipart/form-data File Upload (PATCH /api/quote_responses/:id)
Upload a binary file and attach it to a response line, an event-level attachment response, or a form response by sending a PATCH request with Content-Type: multipart/form-data.
Pure Upload Endpoint: When Content-Type: multipart/form-data is sent, the request is treated purely as an attachment upload. It does not apply any line or field updates. Uploading a file and updating line pricing/attributes must be performed in two separate requests.
Form Fields:
| Form Field | Required | Description / Notes |
|---|---|---|
file | Yes | The binary file to upload. |
quote_response_line_id | One of these three | ID of the response line to attach the file to. |
quote_request_attachment_response_id | One of these three | ID of the event-level attachment response to attach the file to. |
easy_form_response_id | One of these three | ID of the questionnaire / form response to attach the file to. |
intent | No | Attachment intent. Defaults to Internal. Also accepts Supplier. |
Evaluation Rules & Error Handling:
- Precedence: Send exactly one target ID. If multiple are sent, they are evaluated in order (
quote_response_line_id>quote_request_attachment_response_id>easy_form_response_id) and the first present ID is used while others are ignored. - Scoping: The target ID must belong to the response in the URL. An ID belonging to a different response returns
404 Not Found. - Rollback: If attachment validation fails (
422 Unprocessable Entity), the transaction rolls back completely and no orphan attachment record is created.
Success Response (200 OK):
Returns the full quote response object with an additional top-level attachment object describing the newly created attachment:
{
"id": 1,
"state": "working",
"lines": [ ... ],
"attachment": {
"id": 246,
"attached-to": "quote-response-line",
"attached-to-id": 12345
}
}
The attached-to value will be one of: quote-response-line, quote-request-attachment-response, or easy-form-response.
Supplier Response End-to-End Workflow
To submit a response on behalf of a supplier via the API, execute the endpoints in the following sequence:
- Create Draft: Send
POST /api/quote_responseswithquote-request-idandquote-supplier-id(201 Created). This generates a draft with pre-built lines and form responses. - Update Line Data: Send
PATCH /api/quote_responses/:idwith a JSON body containinglineswith pricing (price-amount), lead times, or attributes (200 OK). - Upload Attachments: Send
PATCH /api/quote_responses/:idwithContent-Type: multipart/form-datapassingfileand the target ID (200 OK). Note: Repeat for each file as needed. - Submit Response: Send
PUT /api/quote_responses/:id/submitwith an empty body (200 OK). The state transitions tosubmitted.
Elements
| Element | Description | Req'd | Unique | Allowable Value | In | Out | Data Type |
|---|---|---|---|---|---|---|---|
| awarded | Awarded | yes | boolean | ||||
| comments | Comments | yes | yes | text | |||
| 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 | ||||
| id | Coupa unique identifier | yes | integer | ||||
| lines | Response lines, updatable in place | yes | yes | QuoteResponseLine | |||
| name | Response name | yes | yes | string | |||
| position | position | yes | integer | ||||
| promoted | promoted | yes | boolean | ||||
| quote-request-attachment-responses | Details about supplier attachments at the event level. | yes | yes | Quote Request Attachment Response | |||
| quote-request-id | quote_request_id | yes (on create) | yes | yes | integer | ||
| quote-request-original-id | Coupa unique identifier for original Sourcing Event | yes | string | ||||
| quote-request-revision | Sourcing Event Revision | yes | string | ||||
| quote-supplier | quote_supplier | yes | yes | QuoteSupplier | |||
| response-status | Response status of the supplier response (e.g., Awarded, Not Awarded, Disqualified, Promoted to Next Stage) | yes | yes | Quote Response Status | |||
| state | Response state (e.g., working, submitted) | yes | string(255) | ||||
| submitted-at | Timestamp when response was submitted | yes | datetime | ||||
| track-id | Identifier grouping responses on multi-response events | yes | string | ||||
| 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 |
Quote Response Attachments
To access Quote Response attachments, retrieve the response via GET /api/quote_requests/:quote_request_id/quote_responses (latest per supplier), GET /api/quote_requests/:quote_request_id/quote_responses/all, or GET /api/quote_responses/:id.
Attachments can be located within the response in three places:
- Line attachments: Inside the
linesarray:lines[].attachments[] - Event-level attachments: Inside the
quote-request-attachment-responsesarray:quote-request-attachment-responses[].attachments[] - Questionnaire / Form attachments: Inside the
easy-form-responsesarray:easy-form-responses[].attachments[]
Once you locate the attachment id, use the Attachments API to view or download the attachment file.
For example, this sample snippet from a GET response shows an attachment ID on a line:
[
{
"id": 1,
"created-at": "2023-05-03T08:14:37-07:00",
"updated-at": "2023-05-03T08:14:48-07:00",
"quote-request-id": 1,
"submitted-at": "2023-05-03T08:14:48-07:00",
"state": "submitted",
"promoted": false,
"position": null,
"comments": null,
"exported": false,
"quote-request-original-id": null,
"quote-request-revision": null,
"awarded": false,
"lines": [
{
"id": 1,
"created-at": "2023-05-03T08:14:37-07:00",
"updated-at": "2023-05-24T04:26:55-07:00",
"price-amount": "1.0",
"quantity": "1.0",
"reporting-price-amount": "1.0",
"price-currency": {
"id": 1,
"code": "USD",
"decimals": 2
},
"quote-request-line-id": 1,
"lot-id": 1,
"lead-time": null,
"cost-element-values": {},
"supplier-item-name": null,
"item-description": null,
"item-part-number": null,
"awarded": false,
"easy-form-response": null,
"shipping-term": null,
"attachments": [
{
"file": "path_to_attachment.xlsx",
"file-content-type": "application/octet-stream",
"file-file-name": "attachment_name.xlsx",
"file-file-size": "11565",
"file-url": "http://my-website.com/attachment/attachment_file/file/246/attachment_name.xlsx",
"id": 246,
"intent": "Internal",
"linked-to": "quote_request_attachment",
"text": null,
"type": "AttachmentFile",
"url": "http://my-website.com/attachments/246/view/attachment_name.xlsx"
}
]
}
]
}
]
Permissions
| Action | Required Permission |
|---|---|
create, award, remove_award | quotes/responses → create |
submit | quotes/responses → edit |
update | quotes/responses → update |
index, all | quotes/responses → index |
show | quotes/responses → show |
create and submit are restricted exclusively to buyer users. Supplier user accounts will receive a 403 Forbidden error.