Partner Onboarding Contract

Pricing Distribution Service API

First-pass partner onboarding contract for Pricing Distribution Service. OpenAPI 3.1.0 and service version 0.1.0.

Pricing Distribution Service (PDS) is a facade over the Novasol partner API. This first-pass OpenAPI document focuses on the HTTP contract exposed by PDS: paths, methods, headers, query parameters, form bodies, status codes, and representative XML or JSON payload examples. Notes: - Several endpoints proxy or forward partner-specific query parameters to the upstream Novasol API. Where PDS does not validate those parameters locally, this document lists the common fields used for onboarding and calls out passthrough behavior in descriptions. - The batch products payload downloaded from GET /api/batches/{batchID} is defined by the XML schema in internal/batch/test/batchfile.xsd. OpenAPI documents the transport; the XSD remains the authoritative schema for the batch XML file structure.

5 Paths
6 Operations
3 Tags
2 Environments
/api/available/{propertyID}
1 operation Availability
GET

Fetch uplifted availability for a property

Retrieves availability from the upstream partner API, applies the configured OTA uplift, and returns XML. PDS forwards the raw query string upstream. This document lists only the commonly used parameters for onboarding. Additional upstream-supported query parameters may also be accepted.
Availability 6 parameters 3 responses

Parameters

  • propertyID in path required (string)
  • agency in query optional - Agency identifier forwarded upstream. (string)
  • arrival in query optional (string, date)
  • departure in query optional (string, date)
  • adults in query optional (integer)
  • children in query optional (integer)

Responses

  • 200 - Availability XML with uplifted prices. (application/xml)
  • 400 - Missing property ID, missing key header, or uplift not enabled. (text/plain)
  • 500 - Internal error. (text/plain)
/api/batches
1 operation Batches
POST

Request a batch export

Creates a full or delta batch export request. The request body is form URL encoded. Notes: - replyTo is required. - lastchange is optional. When supplied, the request is treated as a delta batch. - PDS also accepts replyto and Replyto for compatibility, but replyTo should be used for new integrations.
Batches 0 parameters request body 3 responses

Request Body

Media types: application/x-www-form-urlencoded

Responses

  • 200 - Batch request accepted. (application/xml)
  • 400 - Invalid request body, missing key header, or uplift not enabled.
  • 500 - Internal error.
/api/batches/{batchID}
1 operation Batches
GET

Download an uplifted batch file

Returns the processed batch payload stored by PDS. The transport is documented here; the XML structure inside the batch file is defined by internal/batch/test/batchfile.xsd.
Batches 1 parameter 1 response

Parameters

  • batchID in path required (string)

Responses

  • 200 - Zipped batch file or an XML error payload when the batch cannot be located. (application/octet-stream, application/xml)

Batch Payload Example

Representative XML structure for the downloaded batch file, aligned with internal/batch/test/batchfile.xsd.
information Core property metadata such as quality, occupancy, product type, season-level details, and product URLs.
prices Date-ranged pricing blocks with market-specific values and any adjusted prices used in the exported payload.
availabilities Availability windows plus restriction flags that describe where bookings are open, blocked, or limited.
priceRules Stay and arrival rules that constrain valid combinations such as min stay, max stay, and allowed weekdays.
<?xml version="1.0" encoding="UTF-8"?>
<products>
  <product>
    <propertyID>DTH693</propertyID>
    <season>2026</season>
    <salesMarkets>
      <salesMarket code="280">
        <brands>
          <brand>NOV</brand>
          <brand>DAN</brand>
        </brands>
      </salesMarket>
      <salesMarket code="826">
        <brands>
          <brand>NOV</brand>
        </brands>
      </salesMarket>
      <salesMarket code="840">
        <brands></brands>
      </salesMarket>
    </salesMarkets>
    <information>
      <name><![CDATA[Representative full product]]></name>
      <quality>5</quality>
      <buildYear>2014</buildYear>
      <modernizedYear>2021</modernizedYear>
      <switchDay>6</switchDay>
      <minimumDays>2</minimumDays>
      <type>H</type>
      <specialCode/>
      <adultCount>6</adultCount>
      <childrenCount>0</childrenCount>
      <extraBedCount>0</extraBedCount>
      <sunBedCount>4</sunBedCount>
      <allowedPetCount>1</allowedPetCount>
      <babyChairCount>1</babyChairCount>
      <cotCount>1</cotCount>
      <kidsFreeOfCharge>0</kidsFreeOfCharge>
      <catalogue id="2026" page="123" type="main" mapsCoordinate="DTH693"/>
      <catalogueHouse>DTH693</catalogueHouse>
      <productNotes>
        <productNote languageiso="280" type="general" format="text"><![CDATA[Single-product full fixture for XML round-trip tests.]]></productNote>
      </productNotes>
      <inactive>false</inactive>
      <productUrls>
        <productUrl salesMarket="280" brand="NOV"><![CDATA[www.novasol.de/p/DTH693]]></productUrl>
        <productUrl salesMarket="826" brand="NOV"><![CDATA[www.novasol.co.uk/p/DTH693]]></productUrl>
        <productUrl salesMarket="840" brand="NOV"><![CDATA[www.novasol.com/p/DTH693]]></productUrl>
      </productUrls>
      <originalSeason>2026</originalSeason>
      <presentationPriority>10</presentationPriority>
      <suspended>false</suspended>
      <expiryDate>20270109</expiryDate>
      <productCode>DTH693</productCode>
    </information>
    <features>
      <feature>
        <group>001</group>
        <subgroup>6</subgroup>
        <description>
          <salesMarket code="280"><![CDATA[Living area]]></salesMarket>
        </description>
        <unit id="m2" size="70">
          <code salesMarket="280">sqm</code>
        </unit>
      </feature>
      <feature>
        <group>081</group>
        <subgroup>9</subgroup>
      </feature>
      <feature>
        <group>101</group>
        <subgroup>33</subgroup>
        <startDate>20240113</startDate>
      </feature>
    </features>
    <location>
      <areaCode>DTH</areaCode>
      <description><![CDATA[Ruhla]]></description>
      <metersAboveSeaLevel>420</metersAboveSeaLevel>
      <pointsOfInterest>
        <pointOfInterest>
          <group>beach</group>
          <subgroup>lake</subgroup>
          <distance>12000</distance>
          <description><![CDATA[Bathing lake]]></description>
        </pointOfInterest>
      </pointsOfInterest>
      <keyType>079</keyType>
    </location>
    <address>
      <street><![CDATA[Altensteiner Straße]]></street>
      <streetNumber><![CDATA[34]]></streetNumber>
      <floor><![CDATA[1]]></floor>
      <zip><![CDATA[99842]]></zip>
      <city><![CDATA[Ruhla]]></city>
      <countryISOCode>280</countryISOCode>
      <coordinates quality="9">
        <longitude>10.372570438138968</longitude>
        <latitude>50.87662658468293</latitude>
        <routeLongitude>0</routeLongitude>
        <routeLatitude>0</routeLatitude>
        <permission>F</permission>
        <status>V</status>
      </coordinates>
    </address>
    <buildings>
      <building type="001">
        <room type="101" size="12"></room>
        <room type="111" size="45"></room>
        <room type="131" size="10"></room>
        <room type="150" size="30"></room>
      </building>
    </buildings>
    <pictures>
      <picture linkType="G" lastModified="20240408134112" sequenceNumber="100">
        <type>H</type>
        <domain>https://image.novasol.com</domain>
        <path>/pic/dth/</path>
        <file>dth693_floorplan_01.png</file>
      </picture>
      <picture linkType="P" lastModified="20240408134113" sequenceNumber="1">
        <type>H</type>
        <domain>https://image.novasol.com</domain>
        <path>/pic/dth/</path>
        <file>dth693_main_01.jpg</file>
        <shape>1</shape>
      </picture>
      <picture linkType="W" lastModified="20240408132855" sequenceNumber="701">
        <type>H</type>
        <domain>https://image.novasol.com</domain>
        <path>/pic/dth/</path>
        <file>dth693_bath_01.jpg</file>
        <shape>701</shape>
      </picture>
    </pictures>
    <media>
      <texts>
        <text languageiso="280" type="W" theme="overview" format="text"><![CDATA[Spacious holiday home with representative media, pricing, availability and legal sections.]]></text>
      </texts>
    </media>
    <prices>
      <price>
        <code>T</code>
        <price>
          <salesMarket code="280" currency="EUR">1043</salesMarket>
          <salesMarket code="826" currency="GBP">879</salesMarket>
          <salesMarket code="840" currency="USD">1184</salesMarket>
        </price>
        <adjustedPrice>
          <salesMarket code="280" currency="EUR">1043</salesMarket>
          <salesMarket code="826" currency="GBP">879</salesMarket>
          <salesMarket code="840" currency="USD">1184</salesMarket>
        </adjustedPrice>
        <from>20260110</from>
        <to>20260131</to>
      </price>
      <price>
        <code>A</code>
        <price>
          <salesMarket code="280" currency="EUR">1912</salesMarket>
          <salesMarket code="826" currency="GBP">1612</salesMarket>
          <salesMarket code="840" currency="USD">2170</salesMarket>
        </price>
        <adjustedPrice>
          <salesMarket code="280" currency="EUR">1912</salesMarket>
          <salesMarket code="826" currency="GBP">1612</salesMarket>
          <salesMarket code="840" currency="USD">2170</salesMarket>
        </adjustedPrice>
        <from>20260704</from>
        <to>20260815</to>
      </price>
      <livePrice></livePrice>
    </prices>
    <offers>
      <offer>
        <fromDate>20260704</fromDate>
        <toDate>20260711</toDate>
        <code>specialOffer</code>
        <price>1912</price>
        <discount>574</discount>
        <discountPercentage>30,04</discountPercentage>
        <salesMarket>280</salesMarket>
      </offer>
    </offers>
    <availabilities>
      <availability>
        <apartment>1</apartment>
        <from>20260101</from>
        <to>20261231</to>
        <lastRentalDate>20261231</lastRentalDate>
        <lastAvailabilityDate>20261231</lastAvailabilityDate>
        <days>XXXXXXXXXAAAAAAAOOAXXXXXXXXXXXXXXXXXXXXXOOOOO</days>
        <restrictedWinterDaysUsed>75</restrictedWinterDaysUsed>
        <restrictedWinterDaysMax>-1</restrictedWinterDaysMax>
        <restrictions>
          <restriction>
            <restrictionType>CAL</restrictionType>
            <restrictedDays>75</restrictedDays>
            <restrictedDaysMax>-1</restrictedDaysMax>
          </restriction>
        </restrictions>
      </availability>
    </availabilities>
    <services>
      <extraService>
        <serviceID>BEDLINEN</serviceID>
        <name>
          <salesMarket code="280">Bed linen</salesMarket>
        </name>
        <description>
          <salesMarket code="280">Optional bed linen hire</salesMarket>
        </description>
        <priceUnitCode>4</priceUnitCode>
        <serviceGroup>optional</serviceGroup>
        <price>
          <salesMarket code="280" currency="EUR">12,00</salesMarket>
        </price>
        <serviceType>
          <salesMarket code="280">perPerson</salesMarket>
        </serviceType>
        <maxUnits>6</maxUnits>
        <from>20260101</from>
        <to>20270109</to>
      </extraService>
      <ownerExtraService>
        <serviceID>REN</serviceID>
        <price>0,00</price>
        <minimumPrice>0,00</minimumPrice>
        <calculatedPrice>0,00</calculatedPrice>
        <priceUnitCode>3</priceUnitCode>
        <serviceType>1</serviceType>
        <priceType>1</priceType>
      </ownerExtraService>
    </services>
    <concepts>
      <concept>MISC02</concept>
      <concept>MISC30</concept>
      <concept>MISC81</concept>
      <concept>OAA00</concept>
    </concepts>
    <legal>
      <registration unit="1" type="OID">
        <validFrom>20220708</validFrom>
        <validTo>20351231</validTo>
        <data><![CDATA[98345528293]]></data>
        <data2><![CDATA[DE-TEST-REG]]></data2>
      </registration>
    </legal>
    <relatedProducts>
      <relatedProduct>
        <number>DTH694</number>
        <location>Ruhla</location>
        <productType>H</productType>
        <productTypeDescription>House</productTypeDescription>
        <quality>4</quality>
        <adults>4</adults>
        <children>2</children>
        <pictureURL>https://image.novasol.com/pic/dth/dth694_main_01.jpg</pictureURL>
        <livePrice></livePrice>
        <basePrice></basePrice>
      </relatedProduct>
    </relatedProducts>
    <priceRules>
      <rule>
        <from>2026-01-10</from>
        <to>2026-07-04</to>
        <percentage>145.00</percentage>
        <arrivalWeekdays>1,2,3,4,5,6,7</arrivalWeekdays>
        <minStay>2</minStay>
        <maxStay>7</maxStay>
        <maxDaysToArrival>28</maxDaysToArrival>
      </rule>
      <exceptions>
        <exception>
          <minStay>7</minStay>
          <optionalArrivalFrom>2026-12-12</optionalArrivalFrom>
          <optionalArrivalTo>2027-01-02</optionalArrivalTo>
          <optionalDepartureFrom>2026-12-12</optionalDepartureFrom>
          <optionalDepartureTo>2027-01-02</optionalDepartureTo>
        </exception>
      </exceptions>
      <restrictions>
        <bookingOffset>P1DT30M</bookingOffset>
      </restrictions>
    </priceRules>
  </product>
</products>
/api/bookings
1 operation Bookings
POST

Create a booking

Creates a booking via the upstream partner API. The body is form URL encoded. PDS validates a subset of fields locally and then applies uplift logic before forwarding upstream.
Bookings 0 parameters request body 4 responses

Request Body

Media types: application/x-www-form-urlencoded

Responses

  • 200 - Booking created successfully. (application/xml)
  • 400 - Invalid request payload. (application/xml)
  • 401 - API key missing or partner not enabled for uplift. (application/xml)
  • 500 - Internal error. (application/xml)
/api/bookings/{bookingID}
2 operations BookingsBookings
PUT

Acknowledge an existing booking

Forwards the request to the upstream partner API and streams the XML response back unchanged.
Bookings 2 parameters 3 responses

Parameters

  • bookingID in path required (string)
  • action in query required (string) values: acknowledge

Responses

  • 200 - Upstream acknowledgement response. (application/xml)
  • 400 - Missing booking ID or invalid request.
  • 500 - Internal error.
DELETE

Delete an existing booking

Forwards the request to the upstream partner API and streams the XML response back unchanged.
Bookings 7 parameters 3 responses

Parameters

  • bookingID in path required (string)
  • company in query optional (string)
  • salesmarket in query optional (integer)
  • agency in query optional (integer)
  • propertyid in query optional (string)
  • user in query optional (string)
  • test in query optional (boolean)

Responses

  • 200 - Upstream delete response. (application/xml)
  • 400 - Invalid request.
  • 500 - Internal error.