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 createCreate a draft response for a supplier on a sourcing event.
PUT, PATCH /api/quote_responses/:id updateUpdate a draft response (e.g., lines, comments, name, attachments).
PATCH /api/quote_responses/:id updateUpload 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 submitSubmit a draft response.
POST /api/quote_responses/:id/award awardAward the quote response.
DELETE /api/quote_responses/:id/award remove_awardRemove award from the quote response.
GET /api/quote_requests/:quote_request_id/quote_responses indexGet 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 allGet all responses for a Sourcing event, including all submitted and draft responses.
GET /api/quote_responses indexGet all responses of specific Sourcing event.
GET /api/quote_responses/:id showGet information about the particular response.
GET /api/quote_responses/all allGet 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.
Important:

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 Created with the full response object.
  • On events configured for multiple responses, a unique track-id is 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 state to submitted.
  • Sets submitted-at to the current timestamp.
  • Marks the response as the supplier's active bid.
  • Updates supplier participation status to responded.
Note: Only buyer users can submit via API; supplier users receive 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.

CAUTION:

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 FieldRequiredDescription / Notes
fileYesThe binary file to upload.
quote_response_line_idOne of these threeID of the response line to attach the file to.
quote_request_attachment_response_idOne of these threeID of the event-level attachment response to attach the file to.
easy_form_response_idOne of these threeID of the questionnaire / form response to attach the file to.
intentNoAttachment 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:

  1. Create Draft: Send POST /api/quote_responses with quote-request-id and quote-supplier-id (201 Created). This generates a draft with pre-built lines and form responses.
  2. Update Line Data: Send PATCH /api/quote_responses/:id with a JSON body containing lines with pricing (price-amount), lead times, or attributes (200 OK).
  3. Upload Attachments: Send PATCH /api/quote_responses/:id with Content-Type: multipart/form-data passing file and the target ID (200 OK). Note: Repeat for each file as needed.
  4. Submit Response: Send PUT /api/quote_responses/:id/submit with an empty body (200 OK). The state transitions to submitted.

Elements

Element Description Req'd Unique Allowable Value In Out Data Type
awardedAwardedyesboolean
commentsCommentsyesyestext
created-atAutomatically created by Coupa in the format YYYY-MM-DDTHH:MM:SS+HH:MMZyesdatetime
created-byUser who createdyes User
idCoupa unique identifieryesinteger
linesResponse lines, updatable in placeyesyes QuoteResponseLine
nameResponse nameyesyesstring
positionpositionyesinteger
promotedpromotedyesboolean
quote-request-attachment-responsesDetails about supplier attachments at the event level.yesyes Quote Request Attachment Response
quote-request-idquote_request_idyes (on create)yesyesinteger
quote-request-original-idCoupa unique identifier for original Sourcing Eventyesstring
quote-request-revisionSourcing Event Revisionyesstring
quote-supplierquote_supplieryesyes QuoteSupplier
response-statusResponse status of the supplier response (e.g., Awarded, Not Awarded, Disqualified, Promoted to Next Stage)yesyesQuote Response Status
stateResponse state (e.g., working, submitted)yesstring(255)
submitted-atTimestamp when response was submittedyesdatetime
track-idIdentifier grouping responses on multi-response eventsyesstring
updated-atAutomatically created by Coupa in the format YYYY-MM-DDTHH:MM:SS+HH:MMZyesdatetime
updated-byUser who updatedyes 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 lines array: lines[].attachments[]
  • Event-level attachments: Inside the quote-request-attachment-responses array: quote-request-attachment-responses[].attachments[]
  • Questionnaire / Form attachments: Inside the easy-form-responses array: 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

ActionRequired Permission
create, award, remove_awardquotes/responses → create
submitquotes/responses → edit
updatequotes/responses → update
index, allquotes/responses → index
showquotes/responses → show
Note: create and submit are restricted exclusively to buyer users. Supplier user accounts will receive a 403 Forbidden error.