Get product offers (single)
Returns a single product with up to 3 cheapest available offers, optionally narrowed by minimum total quantity and maximum price. Use this endpoint to inspect the current offer landscape for a specific product before placing an order — especially when you want to identify the cheapest offer or find offers within a budget.
Typical use cases:
- Check current offers and prices for a known product before purchase.
- Find the offer ID to use as
offerIdin a manual order item.
Endpoint: GET /export/v1/product-offers/{productId}
Headers
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer token obtained from the OAuth2 token endpoint. Format: Bearer <access_token>. See Authentication. |
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
productId | string | Yes | Product identifier. Must be exactly 14 digits and numeric (e.g. 10000004439009). |
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
totalQuantity | integer | No | Filter offers by minimum total quantity — only offers where the combined available stock is greater than or equal to this value are returned. Must be between 1 and 1000000. |
maxPrice | string (decimal) | No | Filter offers by maximum unit price — only offers with a price at or below this value are returned. Maximum two decimal places (e.g. 30.00). Range: 0.01–99999999999.99. |
Example requests
Cheapest offers for a product (up to 3)
GET /export/v1/product-offers/10000004439009
Offers within a price and quantity budget
GET /export/v1/product-offers/10000004439009?totalQuantity=5&maxPrice=30.00
Sandbox
curl --location 'https://sandboxapi.g2a.com/export/v1/product-offers/10000000258278' \
--header 'Authorization: Bearer rfC3vIi6zoVqZSHAlhTXslTfvMZYwWPZ'
Success response (200)
{
"data": {
"id": "10000004439009",
"name": "Grand Theft Auto San Andreas Steam Key GLOBAL",
"totalQuantity": 156,
"offers": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"price": "1.49",
"quantity": 50
},
{
"id": "660e8400-e29b-41d4-a716-446655440001",
"price": "1.89",
"quantity": 106
}
],
"updatedAt": "2026-03-20T10:00:00Z",
"currency": "EUR"
}
}
Response fields
| Field | Type | Description |
|---|---|---|
data.id | string | Product identifier (e.g. 10000004439009) |
data.name | string | Product name |
data.totalQuantity | integer | Total quantity of all available items across all offers, unfiltered regardless of totalQuantity/maxPrice params |
data.offers | array | Up to 3 cheapest offers matching the requested filters, sorted by price ascending. Empty array if no offers match. |
data.offers[].id | string (UUID) | Offer identifier — use this as offerId in a manual order item |
data.offers[].price | string (decimal) | Price per unit for this offer (e.g. 12.20) |
data.offers[].quantity | integer | Number of items available from this offer |
data.updatedAt | string (ISO 8601) | UTC timestamp of the last offer update |
data.currency | string | Currency code for all prices. Always "EUR". |
Error responses
| Status | Description | Possible error codes |
|---|---|---|
| 400 | Bad request | validation-error — one or more parameters failed validation; see message for details |
| 401 | Unauthorized | unauthorized — missing or invalid Bearer token |
| 400 | Not found | product-not-found — no product with the given productId exists in the offers catalog |
| 500 | Internal server error | internal-server-error — unexpected server-side error; contact your Key Account Manager and include the traceId from the response |
validation-error (400) — the message field identifies the specific parameter and problem. Possible causes:
productId path parameter:
- Not exactly 14 characters long
- Not numeric
- Below the minimum value (
10000000000000)
totalQuantity query parameter:
- Not a valid integer
- Less than
1 - Greater than
1000000
maxPrice query parameter:
- Not a valid number
- More than one decimal point
- More than 2 decimal places
- Less than
0.01 - Greater than
99999999999.99
Example — invalid productId:
{
"error": {
"code": "validation-error",
"message": "productId 123 must have exactly 14 characters",
"status": 400
}
}
Example — invalid totalQuantity:
{
"error": {
"code": "validation-error",
"message": "totalQuantity must be at least 1",
"status": 400
}
}
Example — invalid maxPrice:
{
"error": {
"code": "validation-error",
"message": "maxPrice can have at most 2 decimal places",
"status": 400
}
}
Example — product not found (400):
{
"error": {
"code": "product-not-found",
"message": "Product not found or no offers available for the specified parameters",
"status": 400
}
}