> ## Documentation Index
> Fetch the complete documentation index at: https://docs.voyantcloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Provider Offer

> Retrieve details of a specific provider offer by ID.

## Method

`GET` `/v1/marketplace/offers/{id}`

Requires the `catalog:read` scope and workspace context.

## Path Parameters

<ParamField path="id" type="string" required>The offer ID (e.g., `offr_abc123`).</ParamField>

## Headers

<ParamField header="Authorization" type="string" required>Bearer token (e.g. <code>Authorization: Bearer YOUR\_API\_KEY</code>)</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.voyantcloud.com/v1/marketplace/offers/offr_abc123" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const offerId = "offr_abc123"

  const res = await fetch(`https://api.voyantcloud.com/v1/marketplace/offers/${offerId}`, {
    headers: { Authorization: `Bearer ${process.env.VOYANT_API_KEY}` },
  })
  const { data } = await res.json()
  ```

  ```python Python theme={null}
  import os, requests

  offer_id = "offr_abc123"
  resp = requests.get(
    f"https://api.voyantcloud.com/v1/marketplace/offers/{offer_id}",
    headers={"Authorization": f"Bearer {os.environ['VOYANT_API_KEY']}"},
  )
  offer = resp.json()["data"]
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "data": {
      "id": "offr_abc123",
      "providerId": "prov_viking",
      "externalOfferId": "VIKING-SUMMER-2024",
      "name": "Summer Mediterranean Savings",
      "description": "Save 10% on Mediterranean cruises this summer",
      "termsAndConditions": "Valid for new bookings only. Cannot be combined with other offers. Subject to availability.",
      "type": "percentage",
      "scope": "region",
      "value": "10",
      "currency": null,
      "maxDiscountAmountMinor": "50000",
      "minPurchaseAmountMinor": "200000",
      "validFrom": "2024-06-01T00:00:00Z",
      "validTo": "2024-08-31T23:59:59Z",
      "bookByDate": "2024-07-31T23:59:59Z",
      "travelFrom": "2024-06-01T00:00:00Z",
      "travelTo": "2024-09-30T23:59:59Z",
      "applicableProductIds": [],
      "applicableDepartureIds": [],
      "applicableCabinCategories": ["veranda", "suite"],
      "applicableRoomTypes": [],
      "applicableRegions": ["mediterranean", "aegean"],
      "excludedProductIds": [],
      "conditions": {
        "minNights": 7,
        "passengerType": "adult"
      },
      "combinableWithOtherOffers": false,
      "exclusiveOfferIds": ["offr_xyz789"],
      "status": "active",
      "lastSyncedAt": "2024-01-20T08:00:00Z",
      "createdAt": "2024-01-15T10:30:00Z",
      "updatedAt": "2024-01-20T08:00:00Z",
      "provider": {
        "id": "prov_viking",
        "kind": "cruise",
        "status": "active",
        "displayName": "Viking Cruises",
        "logoUrl": "https://assets.example.com/viking-logo.png",
        "description": "Award-winning river and ocean cruises"
      }
    }
  }
  ```

  ```json 404 Not Found theme={null}
  {
    "error": "Offer not found"
  }
  ```
</ResponseExample>

## Response Fields

<ResponseField name="data.maxDiscountAmountMinor" type="string">
  Maximum discount cap in minor units (cents). For percentage discounts, this limits the total discount amount.
</ResponseField>

<ResponseField name="data.minPurchaseAmountMinor" type="string">
  Minimum purchase amount required in minor units (cents) to qualify for the offer.
</ResponseField>

<ResponseField name="data.conditions" type="object">
  Provider-defined eligibility rules as a JSON object. Structure varies by provider.
</ResponseField>

<ResponseField name="data.combinableWithOtherOffers" type="boolean">
  Whether this offer can be stacked with other offers.
</ResponseField>

<ResponseField name="data.exclusiveOfferIds" type="array">
  List of offer IDs that are mutually exclusive with this offer.
</ResponseField>

<ResponseField name="data.lastSyncedAt" type="string">
  ISO 8601 timestamp of when the offer was last synced from the provider.
</ResponseField>

<Note>
  The offer must belong to a provider your workspace has an active connection to.
  Access to offers from unconnected providers will return a 404 error.
</Note>
