Skip to content

docs: clarify network token usage and PCI scope in card credentials#367

Open
jamesandersen wants to merge 3 commits intoUniversal-Commerce-Protocol:mainfrom
jamesandersen:docs/network-token-usage
Open

docs: clarify network token usage and PCI scope in card credentials#367
jamesandersen wants to merge 3 commits intoUniversal-Commerce-Protocol:mainfrom
jamesandersen:docs/network-token-usage

Conversation

@jamesandersen
Copy link
Copy Markdown
Contributor

Summary

  • Add a Pre-Provisioned Network Tokens section to the tokenization guide, documenting the BYOT path where platforms present card network tokens directly (card_number_type: "network_token") without a tokenize/detokenize round-trip
  • Clarify PCI scope differences between FPAN and network token credential modes in the overview and card credential schema description
  • Add a network token credential example with cryptogram and eci_value

Split from #296 into a focused docs-only PR per reviewer feedback. TRID intentionally omitted per discussion in #296.

Type of change

  • Documentation update

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • cspell passes (added MDES to custom dictionary)
  • markdownlint passes

Add documentation for pre-provisioned network token usage and PCI scope
distinctions between FPAN and network token credential modes:

- Add "Pre-Provisioned Network Tokens" section to the tokenization guide
  covering the BYOT path where platforms present card network tokens
  directly as card_number_type: "network_token" without a
  tokenize/detokenize round-trip
- Add network token bullet to Platform PCI Scope in the overview
- Update card_credential.json description to distinguish PCI scope
  between fpan (full PCI DSS) and network_token (reduced scope)

References Universal-Commerce-Protocol#296 — split from the original card network token credential
PR into a focused docs-only change per reviewer feedback.
@kmcduffie
Copy link
Copy Markdown

@jamesandersen At a high level I think this makes sense. At the same time, I would like to avoid setting the UCP documentation in a way that it needs to be updated if PCI guidance changes. Would you be open to adjusting the language to reference the PCI guidance and do the right thing?

@kmcduffie kmcduffie self-assigned this Apr 20, 2026
Update three locations that asserted DPANs "are not considered cardholder
data by most acquirers" to instead reference current PCI DSS guidance,
avoiding scope claims that could go stale if PCI SSC updates requirements.
@jamesandersen
Copy link
Copy Markdown
Contributor Author

@kmcduffie Good call — I was trying to find phrasing that didn't imply network tokens were not in scope of PCI DSS, but referring to the spec itself with guidance to consult it is a better path. Updated all three places where I made scope assertions (overview, tokenization guide, card_credential.json description) to point to current PCI DSS guidance instead. Pushing now.

Copy link
Copy Markdown

@kmcduffie kmcduffie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for some of the outdated comments, I couldn't figure out how to delete the no longer relevant ones.

Comment thread docs/specification/overview.md Outdated
- Using PSP tokenization payment handlers where raw credentials never pass
through the platform
- Presenting pre-provisioned card network tokens
(`card_number_type: "network_token"`) — DPANs with cryptograms are not
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think of having this cover both DPANs and CPANs?

"$id": "https://ucp.dev/schemas/shopping/types/card_credential.json",
"title": "Card Credential",
"description": "A card credential containing sensitive payment card details including raw Primary Account Numbers (PANs). This credential type MUST NOT be used for checkout, only with payment handlers that tokenize or encrypt credentials. CRITICAL: Both parties handling CardCredential (sender and receiver) MUST be PCI DSS compliant. Transmission MUST use HTTPS/TLS with strong cipher suites.",
"description": "A card credential containing payment card details. When card_number_type is 'fpan', this contains a raw Primary Account Number (PAN) — both parties MUST be PCI DSS compliant. When card_number_type is 'network_token', this contains a Device PAN (DPAN) with cryptogram and ECI, which operates under reduced PCI scope as DPANs are not considered cardholder data by most acquirers. FPAN credentials MUST NOT be used directly for checkout — use payment handlers that tokenize or encrypt credentials. Transmission MUST use HTTPS/TLS with strong cipher suites.",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a situation where the card_number_type is fpan, but can be exchanged in a secure flow outside of UCP, where what is passed from the payment handler is effectively a foreign key to that value that was previously exchanged, or a reference to something that can be retrieved.

### Pre-Provisioned Network Tokens

Not all credential flows require a tokenize/detokenize round-trip. When a
platform already holds a **card network token** (provisioned via Visa VTS,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given the new APIs networks are standing up, what do you think of dropping the API names and having the documentation simply reference Visa / MC?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I would drop any concern about who provisioned it here to stay bias-free in the protocol documentation 😄

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed — dropped the VTS/MDES references.


```json
{
"type": "card",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also a flow where this obj, even when DPAN / CPAN, could still be wrapped in a payment_handler wrapper. It wouldn't require a de-tokenization call to an out of band API, but would make the object opaque to any intermediate parties.

Can you update the language to be open to that setup as well? I would expect the object definition of the card credential would specify what the object contains.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aligned and truthfully I think thats what would fit the current state of UCP!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep - language is updated to note a payment handler is needed for negotiation. This should leave the door open for handlers that also that wrap credentials for intermediary opacity.

I'm interested to discuss/learn more about pros/cons of wrapping vs. directly passing network tokens (which the schema seems to allow on a complete checkout call) BUT also interested in getting this PR over the finish line before diving into that further ;-)

Comment thread docs/specification/overview.md Outdated
- Using PSP tokenization payment handlers where raw credentials never pass
through the platform
- Presenting pre-provisioned card network tokens
(`card_number_type: "network_token"`) — DPANs with cryptograms may
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With CPANs, not all cryptograms will be device bound. What do you think of updating the comments to be more broadly around cryptograms?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call — updated the language to say "network tokens with cryptograms" rather than "DPANs with cryptograms," so it covers both DPANs and CPANs without assuming device-binding.

Copy link
Copy Markdown
Contributor

@raginpirate raginpirate left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really appreciate you working on this @jamesandersen! I'm definitely enjoying the discourse as we find the right place to fit network tokens into UCP 😄

### Pre-Provisioned Network Tokens

Not all credential flows require a tokenize/detokenize round-trip. When a
platform already holds a **card network token** (provisioned via Visa VTS,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I would drop any concern about who provisioned it here to stay bias-free in the protocol documentation 😄

Comment on lines +77 to +78
the tokenization handler lifecycle entirely — the credential is ready for
checkout as-is.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm thats interesting: to make this work mechanically, we would require a base dev.ucp.network_token payment handler to allow proper negotiation of direct network token support at checkout + advertising constraints.

Until we decide to deliver something like that (and have a volunteer business & platform adopters), this statement is not necessarily true.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right — I've updated the language to cover a payment handler requirement for capability negotiation. The specific handler definition (while perhaps the spirit of what I was after with #296 - but didn't quite nail) is something we tackle in the future. Hopefully you'll find the docs here framing that up correctly now though.

Comment on lines +75 to +76
Mastercard MDES, or similar), it can present the token directly as a
`card_credential` with `card_number_type: "network_token"`. This bypasses
Copy link
Copy Markdown
Contributor

@raginpirate raginpirate Apr 22, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmmmm... From a business perspective nothing happened involving them, but from a platform perspective they still need to generate a cryptogram, which to me is a form of tokenization process that a handler can/should describe in the ecosystem 😄

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I'm with you on the need for a handler through which the platform and business can "agree" on use of a network token.


```json
{
"type": "card",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aligned and truthfully I think thats what would fit the current state of UCP!

Tokenization handlers accept source credentials (e.g., card with FPAN) and
produce checkout credentials (e.g., tokens).

### Pre-Provisioned Network Tokens
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a note that this document, although it uses card as an example, does not actually get into the specifics of how one should handle card tokenization. This context is a bit jarring living here, it might be worth pivoting this to describe secure tokens and using network tokens as an example of reducing compliance risk with a secure tokenization protocol.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright - I've tried to reframe the section as "Pre-Provisioned Credentials," with a general pattern of credentials acquired in advance that don't require a per-transaction tokenize/detokenize round-trip. Network tokens are a concrete example of this pattern (though details of provisioning / submitting for payment are outside the scope of this doc) rather than the sole focus. WDYT?

Reframe pre-provisioned network tokens as a general credential pattern:
- Rename section to "Pre-Provisioned Credentials"
- Drop DPAN qualifier and VTS/MDES API references
- Clarify payment handler is required for capability negotiation
- Use network tokens as concrete example, not sole focus
@jamesandersen jamesandersen force-pushed the docs/network-token-usage branch from 4da321b to ab9db85 Compare April 24, 2026 06:31
Copy link
Copy Markdown
Contributor Author

@jamesandersen jamesandersen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @kmcduffie and @raginpirate for sticking with this PR - good feedback throughout and hopefully we're getting close with this latest round of updates ;-)

Comment thread docs/specification/overview.md Outdated
- Using PSP tokenization payment handlers where raw credentials never pass
through the platform
- Presenting pre-provisioned card network tokens
(`card_number_type: "network_token"`) — DPANs with cryptograms may
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call — updated the language to say "network tokens with cryptograms" rather than "DPANs with cryptograms," so it covers both DPANs and CPANs without assuming device-binding.

### Pre-Provisioned Network Tokens

Not all credential flows require a tokenize/detokenize round-trip. When a
platform already holds a **card network token** (provisioned via Visa VTS,
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed — dropped the VTS/MDES references.

Tokenization handlers accept source credentials (e.g., card with FPAN) and
produce checkout credentials (e.g., tokens).

### Pre-Provisioned Network Tokens
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright - I've tried to reframe the section as "Pre-Provisioned Credentials," with a general pattern of credentials acquired in advance that don't require a per-transaction tokenize/detokenize round-trip. Network tokens are a concrete example of this pattern (though details of provisioning / submitting for payment are outside the scope of this doc) rather than the sole focus. WDYT?

Comment on lines +75 to +76
Mastercard MDES, or similar), it can present the token directly as a
`card_credential` with `card_number_type: "network_token"`. This bypasses
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I'm with you on the need for a handler through which the platform and business can "agree" on use of a network token.

Comment on lines +77 to +78
the tokenization handler lifecycle entirely — the credential is ready for
checkout as-is.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right — I've updated the language to cover a payment handler requirement for capability negotiation. The specific handler definition (while perhaps the spirit of what I was after with #296 - but didn't quite nail) is something we tackle in the future. Hopefully you'll find the docs here framing that up correctly now though.


```json
{
"type": "card",
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep - language is updated to note a payment handler is needed for negotiation. This should leave the door open for handlers that also that wrap credentials for intermediary opacity.

I'm interested to discuss/learn more about pros/cons of wrapping vs. directly passing network tokens (which the schema seems to allow on a complete checkout call) BUT also interested in getting this PR over the finish line before diving into that further ;-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants