TENDERWon a tender that requires PunchOut?Download the Tender Kit

Guide · Protocols

cXML vs OCI: how the two PunchOut protocols work

In short

cXML and OCI are the two protocols behind every PunchOut catalogue. cXML (used by SAP Ariba, Coupa, Jaggaer, Ivalua, Oracle) exchanges XML documents over HTTPS and also carries the purchase order. OCI (used by SAP S/4HANA, SRM and ECC) returns the cart as HTML form fields posted to the buyer’s HOOK_URL. Your buyer’s system decides which one you need.

cXML and OCI side by side

cXML vs OCI comparison
cXMLOCI
Full nameCommerce eXtensible Markup LanguageOpen Catalog Interface
Maintained bycXML.org (originally Ariba)SAP
Used bySAP Ariba, Coupa, Jaggaer, Ivalua, Oracle, Workday…SAP S/4HANA, SAP SRM, SAP ECC, some marketplaces
FormatXML documents over HTTPSHTML form fields (NEW_ITEM-*)
Session startPunchOutSetupRequest → PunchOutSetupResponseHTTP call with login parameters and HOOK_URL
Cart returnPunchOutOrderMessageForm POST to the HOOK_URL
Purchase orderOrderRequest (same protocol)A separate channel agreed with the buyer, for example email or its supplier portal
ClassificationClassification domain="UNSPSC"NEW_ITEM-MATGROUP
AuthenticationIdentities + shared secretUser and password or token in the call

cXML PunchOut: how a session works

In cXML every step is an XML document sent over HTTPS. The buyer’s system and your side identify each other with credentials in the header (for SAP Ariba, Network IDs) and a shared secret.

  1. Setup request

    The buyer clicks your catalogue; their system sends a PunchOutSetupRequest with credentials, a BuyerCookie and a return URL.

  2. Setup response

    Your side answers with a StartPage URL; the buyer’s browser opens your store.

  3. Shopping

    The buyer sees contract prices and fills the cart.

  4. Cart return

    A PunchOutOrderMessage posts the cart back to the return URL for approval.

  5. Order

    After approval the purchase order arrives as an OrderRequest.

Example · PunchOutSetupRequest (abridged)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.069/cXML.dtd">
<cXML payloadID="1729332000.4711@buyer.example.com" timestamp="2026-10-19T10:00:00+02:00">
  <Header>
    <From><Credential domain="NetworkID"><Identity>AN01000000001</Identity></Credential></From>
    <To><Credential domain="NetworkID"><Identity>AN01000000002</Identity></Credential></To>
    <Sender>
      <Credential domain="NetworkID">
        <Identity>AN01000000001</Identity>
        <SharedSecret>••••••••</SharedSecret>
      </Credential>
      <UserAgent>Buyer procurement system</UserAgent>
    </Sender>
  </Header>
  <Request>
    <PunchOutSetupRequest operation="create">
      <BuyerCookie>8f2c41d0a9</BuyerCookie>
      <BrowserFormPost><URL>https://buyer.example.com/punchout/return</URL></BrowserFormPost>
      <SupplierSetup><URL>https://gateway.example.com/setup</URL></SupplierSetup>
    </PunchOutSetupRequest>
  </Request>
</cXML>

Example · PunchOutSetupResponse

<cXML payloadID="1729332001.88@gateway.example.com" timestamp="2026-10-19T10:00:01+02:00">
  <Response>
    <Status code="200" text="OK"/>
    <PunchOutSetupResponse>
      <StartPage><URL>https://gateway.example.com/session/7f3a…</URL></StartPage>
    </PunchOutSetupResponse>
  </Response>
</cXML>

Example · PunchOutOrderMessage

<cXML payloadID="1729332555.12@gateway.example.com" timestamp="2026-10-19T10:09:15+02:00">
  <Header>…</Header>
  <Message>
    <PunchOutOrderMessage>
      <BuyerCookie>8f2c41d0a9</BuyerCookie>
      <PunchOutOrderMessageHeader operationAllowed="edit">
        <Total><Money currency="EUR">96.00</Money></Total>
      </PunchOutOrderMessageHeader>
      <ItemIn quantity="20">
        <ItemID><SupplierPartID>GLV-09</SupplierPartID></ItemID>
        <ItemDetail>
          <UnitPrice><Money currency="EUR">4.80</Money></UnitPrice>
          <Description xml:lang="en">Safety gloves, size 9</Description>
          <UnitOfMeasure>PR</UnitOfMeasure>
          <Classification domain="UNSPSC">46181504</Classification>
        </ItemDetail>
      </ItemIn>
    </PunchOutOrderMessage>
  </Message>
</cXML>

OCI PunchOut: how a session works

OCI is simpler and older in style: there is no XML. SAP opens your catalogue URL with login parameters and a HOOK_URL; at the end your store posts the cart to that address as HTML form fields.

  1. Call

    SAP opens your catalogue URL with login parameters and the HOOK_URL.

  2. Shopping

    The buyer shops with its contract prices.

  3. Cart return

    Your store posts the cart as NEW_ITEM-* fields to the HOOK_URL.

  4. Order

    OCI does not carry the purchase order: it reaches you through a channel agreed with the buyer, for example email or its supplier portal.

Example · OCI call with HOOK_URL

https://shop.example.com/oci?USERNAME=acme&PASSWORD=••••
  &HOOK_URL=https%3A%2F%2Fsap.buyer.example.com%2Fsap%2Fbc%2Fsrm%2Foci_return
  &OCI_VERSION=4.0&returntarget=_top

Example · OCI cart return to the HOOK_URL

<form method="post" action="{HOOK_URL}">
  <input type="hidden" name="NEW_ITEM-DESCRIPTION[1]" value="Safety gloves, size 9">
  <input type="hidden" name="NEW_ITEM-QUANTITY[1]"    value="20">
  <input type="hidden" name="NEW_ITEM-UNIT[1]"        value="PR">
  <input type="hidden" name="NEW_ITEM-PRICE[1]"       value="4.80">
  <input type="hidden" name="NEW_ITEM-CURRENCY[1]"    value="EUR">
  <input type="hidden" name="NEW_ITEM-MATGROUP[1]"    value="46181504">
  <input type="hidden" name="NEW_ITEM-VENDORMAT[1]"   value="GLV-09">
</form>

Field names are indexed by line ([1], [2]…). The buyer’s documentation tells you which fields are mandatory, for example a vendor material number, a lead time or a long text.

Which one does your buyer use?

Protocol by buyer system
Buyer systemProtocolGuide
SAP AribacXMLSAP Ariba PunchOut
CoupacXMLCoupa PunchOut
SAP S/4HANA, SRM, ECCOCISAP OCI PunchOut
JaggaercXMLJaggaer PunchOut
Ivalua, Oracle, WorkdaycXMLAll systems
Meplato, SimenoOCI (and cXML)All systems

If you are not sure, the buyer’s supplier documentation says it in the first pages. Some SAP buyers run SAP Ariba for indirect spend and OCI catalogues in S/4HANA for direct materials: you may need both.

cXML PunchOut catalog integration: what changes in your store

Whatever the protocol, a store needs the same five things to work as a PunchOut catalogue:

  • A customer-specific catalogue and prices per buyer
  • A classification code on every product (UNSPSC or ECLASS)
  • Opening inside the buyer’s frame: frame headers, cookies and security settings
  • Units of measure mapped to the buyer’s codes
  • Order import with cXML OrderRequest (Premium plan)

Supporting both on one store

Many suppliers end up with buyers on both protocols. Building two integrations doubles the work; a gateway that speaks both lets one store serve every buyer. With PunchOut Rocket you configure each buyer once in the dashboard, choose cXML or OCI, and the plugin on your store stays the same.

PunchOut on the store you already have

PunchOut Rocket connects WooCommerce, Magento, PrestaShop and nopCommerce to SAP Ariba, Coupa and SAP via cXML or OCI. From €163/month per site, 30-day free trial.

FAQ

Questions

What is the difference between cXML and OCI?

cXML sends XML documents over HTTPS and also covers the purchase order (OrderRequest). OCI is SAP’s protocol: the cart goes back as HTML form fields posted to a HOOK_URL, and the order reaches the supplier through a separate channel.

Which protocol does SAP Ariba use?

cXML. SAP S/4HANA, SRM and ECC use OCI; Coupa, Jaggaer, Ivalua and Oracle use cXML.

Can one store support both cXML and OCI?

Yes. With PunchOut Rocket the same WooCommerce, Magento, PrestaShop or nopCommerce store answers cXML and OCI sessions; the gateway handles the protocol per buyer.

What is a cXML PunchOut catalog integration?

The connection that lets a buyer open your store from their procurement system via cXML, fill a cart and return it with a PunchOutOrderMessage. The approved order then arrives as an OrderRequest.

Is OCI older than cXML?

Both date from the late 1990s and both are still current. The buyer’s system decides which one you need, not the supplier.

Keep reading

Related guides

30-day free trial · no credit card

Your buyer is waiting. Let’s launch.

Install the plugin today and run your first test session this afternoon. If your deadline is close, tell us and we will handle your request with priority.