How to

Get quotation carts

Retrieve and inspect seller-created quotation carts using Geins Merchant API

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.

Try it out in the GraphQL Playground using the query, headers and variables below.
This query requires JWT authentication. Include the JWT token in the Authorization header.

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
      }
    }
  }
}
The channelId, languageId, and marketId arguments are optional and can be left out to use default values.

Response example

200 OK
response.json
{
  "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.

Try it out in the GraphQL Playground using the query, headers and variables below.

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
    }
  }
}

Response example

200 OK
response.json
{
  "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 channels
  • languageId: Set content language
  • marketId: Target specific markets
Read more about 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}"
Read more about obtaining and using JWT tokens in the guide about the authentication flow.

Common pitfalls

  • Quotation carts are read-only — isLocked is always true, so mutations like addToCart or updateCartItem will fail on these carts
  • Do not use placeOrder on a quotation cart — quotation carts can only become orders through the finalizeQuotation mutation
  • A null quotation field on a returned CartType means the cart is a regular cart, not a quotation
  • Expired quotations (where validTo is in the past) cannot be accepted or finalized
Related