skills — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited skills (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
| Resource | URL |
|---|---|
| Cybersource Developer Portal | https://developer.cybersource.com |
| API Reference | https://developer.cybersource.com/api-reference-assets/index.md |
| Business Center (Sandbox) | https://businesscentertest.cybersource.com/ebc2/ |
| Customer Support | https://support.visaacceptance.com |
| SDK Samples (Java) | https://github.com/CyberSource/cybersource-rest-samples-java |
| SDK Samples (Node) | https://github.com/CyberSource/cybersource-rest-samples-node |
| SDK Samples (Python) | https://github.com/CyberSource/cybersource-rest-samples-python |
| SDK Samples (CSharp) | https://github.com/CyberSource/cybersource-rest-samples-csharp |
| SDK Samples (PHP) | https://github.com/CyberSource/cybersource-rest-samples-php |
| SDK Samples (Ruby) | https://github.com/CyberSource/cybersource-rest-samples-ruby |
| llms.txt (AI discovery index) | https://developer.cybersource.com/llms.txt |
Three auth modes are available: JWT Shared Secret, JWT P12, and HTTP Signature. Both JWT modes are recommended for new integrations; HTTP Signature is deprecated.
Symmetric JWT signed with HMAC using a shared secret key. Supports MLE.
SDK config keys: authenticationType=jwt, jwtKeyType=SHARED_SECRET, merchantID, merchantKeyId, merchantsecretKey, runEnvironment=apitest.cybersource.com
Key gotcha: "The shared secret is shown only once when generated. Copy it immediately."
Certificate-based authentication using a PKCS#12 file. Supports MLE.
SDK config keys: authenticationType=jwt, merchantID, keysDirectory, keyFilename, keyPass, keyAlias, runEnvironment=apitest.cybersource.com
Obtaining your P12 certificate:
.p12 file — store securely, never commit to source controlSigns each request with HMAC-SHA256. Being deprecated — migrate to JWT Shared Secret. Does not support MLE.
SDK config keys: authenticationType=http_signature, merchantID, merchantKeyId, merchantsecretKey, runEnvironment=apitest.cybersource.com
Key gotcha: "The shared secret is shown only once when generated. Copy it immediately."
For ISV/partner delegation — allows one merchant to authorize another to act on their behalf. Not a general-purpose auth method. Uses separate endpoints: api-matest.cybersource.com (sandbox), api-ma.cybersource.com (production).
| Environment | URL | Use |
|---|---|---|
| Sandbox | https://apitest.cybersource.com | Development and testing |
| Production | https://api.cybersource.com | Live transactions |
| OAuth Sandbox | https://api-matest.cybersource.com | OAuth testing |
| OAuth Production | https://api-ma.cybersource.com | OAuth live |
Never mix environments in the same code example. Sandbox test cards will fail on production and vice versa.
Application-level payload encryption (request) and decryption (response). Supported only with JWT authentication — works with both JWT key types (P12 and SHARED_SECRET). HTTP Signature does not support MLE.
Enable globally: set enableRequestMLEForOptionalApisGlobally=true in merchantConfig (replaces the deprecated useMLEGlobally).
Request MLE certificate source by key type:
| JWT key type | Where the MLE cert comes from |
|---|---|
P12 | Auto-extracted from the P12 file via requestMleKeyAlias (default alias CyberSource_SJC_US), or supplied via mleForRequestPublicCertPath |
SHARED_SECRET | Must be supplied via mleForRequestPublicCertPath (no P12 to extract from) — download the cert from Business Center |
Key gotchas:
SHARED_SECRET, mleForRequestPublicCertPath is required or request MLE cannot rundisableRequestMLEForMandatoryApisGlobally=true to opt mandatory-MLE APIs outCyberSource_SJC_US — only change if using a custom cert| Operation | Method | Endpoint |
|---|---|---|
| Authorization | POST | /pts/v2/payments |
| Capture | POST | /pts/v2/payments/{id}/captures |
| Void | POST | /pts/v2/payments/{id}/voids |
| Refund | POST | /pts/v2/payments/{id}/refunds |
| Use case | capture flag | Auth window |
|---|---|---|
| Physical goods (ship later) | false (auth-only) | 7 days Visa/MC, 30 days Amex |
| Digital goods (instant delivery) | true (auth+capture) | Immediate |
| Pre-auth (hotels, car rental) | false with incremental auth | Varies |
Gotchas:
Store payment credentials without handling raw PANs. Never store raw card numbers in your database.
| Type | Use case | Lifetime |
|---|---|---|
| Transient token (UC) | Single-use, created client-side | 15 minutes |
| TMS Payment Instrument | Stored card-on-file | Permanent |
| TMS Instrument Identifier | Network-agnostic token | Permanent |
| Network Token | Visa/MC provisioned token | Managed by network |
POST /pts/v2/payments with actionList: ["TOKEN_CREATE"], capture: false, totalAmount: "0.00". Returns a TMS token for permanent storage.
IMPORTANT: Always use UC v1 (/uc/v1/sessions). Do NOT use the legacy Microform/Flex endpoint/pts/v2/microform/capture-contexts— that is a deprecated v0.x API.
Drop-in payment form handling card entry, digital wallets, and 3DS — all PCI-compliant.
POST /uc/v1/sessions — creates a UC session and returns a captureContext JWTcaptureContext/pts/v2/payments with the transient token to authorizeSession lifetime is 15 minutes. Generate a fresh one per checkout session.
POST /uc/v1/sessions
{
"targetOrigins": ["https://yoursite.com"],
"allowedCardNetworks": ["VISA", "MASTERCARD", "AMEX"],
"allowedPaymentTypes": ["PANENTRY", "SRC", "GOOGLEPAY", "APPLEPAY"]
}Response includes captureContext — a JWT passed directly to the UC JS library.
High-impact feature. Include paymentInformation in the session creation request to pre-populate UC with a stored card from TMS. The customer sees their saved card without re-entering details.Option A — Pass a specific Payment Instrument ID:
POST /uc/v1/sessions
{
"targetOrigins": ["https://yoursite.com"],
"allowedCardNetworks": ["VISA", "MASTERCARD"],
"allowedPaymentTypes": ["PANENTRY"],
"paymentInformation": {
"paymentInstrument": {
"id": "<TMS_PAYMENT_INSTRUMENT_ID>"
}
}
}Option B — Pass a TMS Customer ID (loads all saved cards for that customer):
POST /uc/v1/sessions
{
"targetOrigins": ["https://yoursite.com"],
"allowedCardNetworks": ["VISA", "MASTERCARD"],
"allowedPaymentTypes": ["PANENTRY"],
"paymentInformation": {
"customerId": "<TMS_CUSTOMER_ID>"
}
}Key gotchas for TMS passthrough:
merchantID making the session requestcaptureContext returned will contain masked card details; the full PAN is never exposedpaymentInstrument.id is invalid or expired, UC falls back to blank card entry (no error thrown to the merchant)targetOrigins must exactly match your domain (including port if non-standard)"captureContext is a JWT — do not decode or modify it client-sideallowedPaymentTypes: PANENTRY, SRC, GOOGLEPAY, APPLEPAYImplements SCA (Strong Customer Authentication) for PSD2 compliance.
| Flow | User experience | When |
|---|---|---|
| Frictionless | No challenge, instant auth | Low-risk transactions |
| Step-Up | Issuer challenge (OTP, biometric) | High-risk or issuer policy |
The issuer decides — frictionless cannot be forced.
/pts/v2/payments with paymentSolution: "001"Two paths:
GOOGLEPAY in allowedPaymentTypes in the /uc/v1/sessions request — UC handles everything/pts/v2/payments with paymentSolution: "012"Enable SRC in allowedPaymentTypes in the /uc/v1/sessions request. No separate integration required.
Subscribe to payment events via POST /notification-subscriptions/v1/webhooks with mutual trust security.
Event types: payments.payments.authorized, payments.payments.captured, payments.payments.refunded
Gotchas:
webhookId for deduplication (idempotency)| Transaction type | initiator.type | storedCredentialUsed | Notes |
|---|---|---|---|
| Initial (customer-initiated) | customer | false | Include actionList: ["TOKEN_CREATE"] |
| Subsequent (merchant-initiated) | merchant | true | Reference the stored token ID |
| Card | Behavior |
|---|---|
| 4111111111111111 | Visa — approved |
| 5555555555554444 | Mastercard — approved |
| 4000000000000002 | Visa — declined |
Always use https://apitest.cybersource.com. Production credentials will not work in sandbox.
runEnvironment to api.cybersource.com| HTTP Code | Meaning | Action |
|---|---|---|
| 201 | Success (payment created) | Process normally |
| 400 | Invalid request | Check request body, fix validation errors |
| 401 | Unauthorized | Check credentials, key not expired |
| 403 | Forbidden | Check permissions, MLE config |
| 404 | Not found | Check endpoint URL |
| 429 | Rate limited | Back off and retry with exponential delay |
| 502/503 | Server error | Retry with idempotency key |
| Code | Meaning | Retry? |
|---|---|---|
| 100 | Approved | No — success |
| 05 | Do not honor (issuer decline) | Never auto-retry |
| 14 | Invalid card number | No — fix input |
| 51 | Insufficient funds | No — inform cardholder |
| 91 | Issuer unavailable | Yes — retry after delay |
| Language | Package | GitHub |
|---|---|---|
| Java | com.cybersource:cybersource-rest-client-java | CyberSource/cybersource-rest-client-java |
| Node.js | cybersource-rest-client-node | CyberSource/cybersource-rest-client-node |
| Python | cybersource-rest-client-python | CyberSource/cybersource-rest-client-python |
| PHP | cybersource/rest-client-php | CyberSource/cybersource-rest-client-php |
| Ruby | cybersource_rest_client | CyberSource/cybersource-rest-client-ruby |
| .NET | CyberSource.RestClient.DotNet | CyberSource/cybersource-rest-client-dotnet |
All SDKs handle JWT/HTTP Signature generation automatically. Set authenticationType and credentials — the SDK handles the rest.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.