Get quotation carts
Overview
A quotation cart is a standard CartType with an attached quotation field of type CartQuotationType. Quotations are created by sellers and represent a fixed-price proposal for the buyer. All quotation carts have isLocked: true, meaning their items cannot be modified, and they cannot go through the normal placeOrder checkout flow. To turn a quotation into an order, use the dedicated quotation lifecycle mutations.
Prerequisites
- Merchant API key
- JWT token for the authenticated buyer
Goal
- List all quotation carts for the current user
- Retrieve a specific quotation cart by ID
- Inspect quotation details, status, and validity
Architecture at a glance
- Authenticate buyer →
listQuotationCarts→ overview of all quotations - Authenticate buyer →
getQuotationCart→ full details for a specific quotation
APIs used
- Merchant API:
https://merchantapi.geins.io/graphql
Step-by-step
List all quotation carts
Use the listQuotationCarts query to retrieve all quotations for the authenticated user. This is useful for building a "My Quotations" overview page.
Request example
query listQuotationCarts(
$channelId: String
$languageId: String
$marketId: String
) {
listQuotationCarts(
channelId: $channelId
languageId: $languageId
marketId: $marketId
) {
id
isLocked
isBlockedFromCheckout
summary {
total {
regularPriceExVat
}
}
quotation {
quotationNumber
name
status
currency
validFrom
validTo
company {
name
}
}
}
}
{
"Accept": "application/json",
"Authorization": "Bearer {JWT_TOKEN}",
"X-ApiKey": "{MERCHANT_API_KEY}"
}
{
"channelId": "{CHANNEL_ID}",
"languageId": "{LANGUAGE_ID}",
"marketId": "{MARKET_ID}"
}
curl -X POST https://merchantapi.geins.io/graphql \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {JWT_TOKEN}" \
-H "X-ApiKey: {MERCHANT_API_KEY}" \
-d '{"query":"query listQuotationCarts($channelId: String, $languageId: String, $marketId: String) { listQuotationCarts(channelId: $channelId, languageId: $languageId, marketId: $marketId) { id isLocked isBlockedFromCheckout summary { total { regularPriceExVat } } quotation { quotationNumber name status currency validFrom validTo company { name } } } }","variables":{"channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}'
channelId, languageId, and marketId arguments are optional and can be left out to use default values.Response example
200 OK{
"data": {
"listQuotationCarts": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"isLocked": true,
"isBlockedFromCheckout": true,
"summary": {
"total": {
"regularPriceExVat": 15000.00
}
},
"quotation": {
"quotationNumber": "2603-01-0001-00",
"name": "Office furniture package",
"status": "PENDING",
"currency": "SEK",
"validFrom": "2026-03-01T00:00:00Z",
"validTo": "2026-04-30T23:59:59Z",
"company": {
"name": "Acme Supplies AB"
}
}
},
{
"id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"isLocked": true,
"isBlockedFromCheckout": false,
"summary": {
"total": {
"regularPriceExVat": 4500.00
}
},
"quotation": {
"quotationNumber": "2603-01-0002-00",
"name": "IT equipment bundle",
"status": "CONFIRMED",
"currency": "SEK",
"validFrom": "2026-03-15T00:00:00Z",
"validTo": "2026-05-15T23:59:59Z",
"company": {
"name": "Tech Solutions AB"
}
}
}
]
}
}
Get a specific quotation cart
Use the getQuotationCart query to retrieve full details for a specific quotation, including line items, addresses, discount, terms, and settings.
Request example
query getQuotationCart(
$quotationId: Guid!
$channelId: String
$languageId: String
$marketId: String
) {
getQuotationCart(
quotationId: $quotationId
channelId: $channelId
languageId: $languageId
marketId: $marketId
) {
id
isLocked
isBlockedFromCheckout
items {
id
skuId
quantity
product {
name
}
unitPrice {
regularPriceExVat
}
totalPrice {
regularPriceExVat
}
}
summary {
total {
regularPriceExVat
}
}
quotation {
quotationNumber
name
status
currency
validFrom
validTo
company {
name
vatNumber
}
owner {
firstName
lastName
}
customer {
firstName
lastName
approvedAt
rejectedAt
}
billingAddress {
firstName
lastName
addressLine1
city
zip
country
}
shippingAddress {
firstName
lastName
addressLine1
city
zip
country
}
discount {
type
value
}
terms {
text
}
settings {
requireConfirmation
}
orderId
}
}
}
{
"Accept": "application/json",
"Authorization": "Bearer {JWT_TOKEN}",
"X-ApiKey": "{MERCHANT_API_KEY}"
}
{
"quotationId": "{QUOTATION_ID}",
"channelId": "{CHANNEL_ID}",
"languageId": "{LANGUAGE_ID}",
"marketId": "{MARKET_ID}"
}
curl -X POST https://merchantapi.geins.io/graphql \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer {JWT_TOKEN}" \
-H "X-ApiKey: {MERCHANT_API_KEY}" \
-d '{"query":"query getQuotationCart($quotationId: Guid!, $channelId: String, $languageId: String, $marketId: String) { getQuotationCart(quotationId: $quotationId, channelId: $channelId, languageId: $languageId, marketId: $marketId) { id isLocked isBlockedFromCheckout items { id skuId quantity product { name } unitPrice { regularPriceExVat } totalPrice { regularPriceExVat } } summary { total { regularPriceExVat } } quotation { quotationNumber name status currency validFrom validTo company { name vatNumber } owner { firstName lastName } customer { firstName lastName approvedAt rejectedAt } billingAddress { firstName lastName addressLine1 city zip country } shippingAddress { firstName lastName addressLine1 city zip country } discount { type value } terms { text } settings { requireConfirmation } orderId } } }","variables":{"quotationId":"{QUOTATION_ID}","channelId":"{CHANNEL_ID}","languageId":"{LANGUAGE_ID}","marketId":"{MARKET_ID}"}}'
Response example
200 OK{
"data": {
"getQuotationCart": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"isLocked": true,
"isBlockedFromCheckout": true,
"items": [
{
"id": "item-1",
"skuId": 12345,
"quantity": 10,
"product": {
"name": "Ergonomic Office Chair"
},
"unitPrice": {
"regularPriceExVat": 1500.00
},
"totalPrice": {
"regularPriceExVat": 15000.00
}
}
],
"summary": {
"total": {
"regularPriceExVat": 15000.00
}
},
"quotation": {
"quotationNumber": "2603-01-0001-00",
"name": "Office furniture package",
"status": "PENDING",
"currency": "SEK",
"validFrom": "2026-03-01T00:00:00Z",
"validTo": "2026-04-30T23:59:59Z",
"company": {
"name": "Acme Supplies AB",
"vatNumber": "SE1234567890"
},
"owner": {
"firstName": "Anna",
"lastName": "Svensson"
},
"customer": {
"firstName": "Erik",
"lastName": "Johansson",
"approvedAt": null,
"rejectedAt": null
},
"billingAddress": {
"firstName": "Erik",
"lastName": "Johansson",
"addressLine1": "Storgatan 1",
"city": "Stockholm",
"zip": "11122",
"country": "SE"
},
"shippingAddress": {
"firstName": "Erik",
"lastName": "Johansson",
"addressLine1": "Storgatan 1",
"city": "Stockholm",
"zip": "11122",
"country": "SE"
},
"discount": {
"type": "percentage",
"value": 10.0
},
"terms": {
"text": "Payment within 30 days. Delivery 5-7 business days."
},
"settings": {
"requireConfirmation": true
},
"orderId": null
}
}
}
}
Options
Multi-market support
All queries support optional parameters for multi-market configurations:
channelId: Target specific sales channelslanguageId: Set content languagemarketId: Target specific markets
channelId, languageId, and marketId in the "how to"-article about using multi-market support.Authenticated access
These queries require JWT authentication since quotation carts are scoped to the authenticated user. Include the JWT bearer token in the Authorization header:
"Authorization": "Bearer {JWT_TOKEN}"
Common pitfalls
- Quotation carts are read-only —
isLockedis alwaystrue, so mutations likeaddToCartorupdateCartItemwill fail on these carts - Do not use
placeOrderon a quotation cart — quotation carts can only become orders through thefinalizeQuotationmutation - A
nullquotationfield on a returnedCartTypemeans the cart is a regular cart, not a quotation - Expired quotations (where
validTois in the past) cannot be accepted or finalized
Related docs
- Act on quotations: Finalize a quotation order
- Cart basics: Get cart
- Complete purchase: Checkout headless cart