AmEx Intent Intelligence mapping
Status: research note. Nothing here is implemented.
Global Agent Bureau is an agent bureau and a technology company. The license is PolyForm Noncommercial 1.0.0. This note maps the public American Express Agentic Commerce OpenAPI document onto the KATA intent agreement. It does not enroll an account, create an intent at American Express, issue a payment credential, or send a notification.
The sandbox mapper POST /v1/sandbox/amex-intent/to-kata reads adapters/amex/mapping.v1.json when GAB_ENV is sandbox and the key is a gab_test_ key. It converts a JSON object in this process. It does not contact American Express.
KATA objects below are the ones in schemas/intent.json, schemas/intent-mandate.json, schemas/agreement.json, and schemas/action.json. The rules that check them are in intent-agreement.md.
Which AmEx source
The field source is the OpenAPI 3.1.0 document American Express Agentic Commerce Experience - Enrollment, Intent, Payment Credential, and Notification API (1.0.0), downloaded 18 October 2026.
| Fact | Value |
|---|---|
| URL | nextgen-agentic-payments-openapi-specification.json |
openapi |
3.1.0 |
info.version |
1.0.0 |
info.x-lastUpdated |
April 28, 2026 |
| SHA-256 | 811381ed6dea4e4293f44108b1e8de2d75f1629a4a803729713c7c956ea7c47d |
| Size | 286,306 bytes |
| Operations | 8, on 7 paths |
| Schemas | 64, under components.schemas |
Servers in the file are https://apisandboxm.americanexpress.com (sandbox) and https://apigwm.americanexpress.com (production). Request bodies that carry account, intent, or credential data are described as JWE on the wire. The application/json schema is the decrypted model.
info.version is 1.0.0. No request schema has a schemaVersion property. A sender may still include schemaVersion. The value 1.0.0 matches the document version. The mapper keeps it and reports it as assumed.
Earlier pages
The Intent Intelligence page, published 13 October 2026, is the framework essay. It names Purchase Summary, Max Amount, Intent Expiry, and Maximum Number of Transactions in prose and shows three JPEG samples. On 16 October 2026 the OpenAPI URL on this host answered with an error page, so that essay was the only field list then. It is not the field source for the keys in this note.
The ACE company page says Account Enablement, Intent Intelligence, and Payment Credentials specifications were available as of 14 April 2026, and that Agent Registration and Cart Context were still under development. This OpenAPI file is the product document that is now served. It is one file covering enrollment, intent, payment credentials, and notifications. It does not say it is the Cart Context specification.
Operations
| Method and path | operationId |
What the description says |
|---|---|---|
POST /payments/digital/v1/agentic-commerce/enrollments |
enroll |
Enroll an account. A follow-up request completes step-up when the first response requires it. |
POST /payments/digital/v1/agentic-commerce/intents |
createIntent |
Create an intent for an enrolled account. |
PUT /payments/digital/v1/agentic-commerce/intents/{intentId} |
updateIntent |
Edit an intent. This is the update operation. |
DELETE /payments/digital/v1/agentic-commerce/intents/{intentId} |
cancelIntent |
Cancel an intent. |
POST /payments/digital/v1/agentic-commerce/paymentcredentials |
paymentCredentials |
Issue tokenized payment credentials for an approved intent. |
POST /payments/digital/v1/agentic-commerce/paymentcredentials/complete |
paymentCredentialsComplete |
Acknowledge an authorization outcome: APPROVED, DECLINED, or RETURNED. |
POST /payments/digital/v1/agentic-commerce/notifications |
notifications |
Webhook body for enrollment, intent, or payment-credential status. |
POST /payments/digital/v1/agentic-commerce/unenrollments |
unenroll |
Unenroll an account. |
Every operation lists the headers Authorization, trackingId, agentId, and Content-Type. agentId is required. intentId is also a required path parameter on PUT and DELETE.
Create intent
IntentsRequest requires expirationTs, shipment, and agent. The initial create body also requires enrollmentId, prompt, spendControl, risk, and purchaseDecision. A step-up follow-up is a different body: enrollmentId and stepUpVerification only.
| AmEx key | Where the document says it | KATA field | Fit |
|---|---|---|---|
intentId |
Required string on the create and update responses. Path parameter on PUT and DELETE. Not a property of IntentsRequest. |
agreement_id, also copied to intent.intent_id. mandate_id is that id plus .v1 |
The response id is the lifecycle key. agreement_id is the stable KATA id. The .v1 suffix is a draft. |
prompt.promptSummary |
Required string. A summary of the purchase intent derived from user input. | intent.natural_language_source |
The key is published. The KATA placement is assumed. |
prompt.nlpConfidence |
Number from 0 to 1. Not required. | None | Left on the preserved record. |
spendControl.maxAmount |
Required string. The maximum amount that can be charged using the payment method. | intent.maximum_amount and limits.per_transaction_maximum |
A decimal string is read as a major-unit number. Scale is not published. Item purchaseCriteria.maxAmount is a different property. |
spendControl.currency |
Required string, ISO 4217, on the same object. | intent.currency and limits.currency |
orderContext.currency, items[].currency, and purchaseCriteria.currency are separate. The mapper uses the spend-control currency. |
expirationTs |
Required on the intent. Format date-time. The intent expiration in ISO 8601. |
intent.time_limit and mandate expires_at |
spendControl.expirationTs is a different property: the payment-method expiration. It is not required, and it is not this binding. |
maxAllowedTransactions |
Optional string. The maximum allowed transactions the user authorized to complete the purchase. | limits.frequency.max_count, with per set to agreement |
The wire value is a string. KATA stores an integer count of recorded charges. requestedPaymentCredentialsCount on the credential request is a different integer and defaults to 1. |
orderContext.merchants[].name |
String. The merchant's display or registered name. Not marked required. | Strings in intent.merchant_constraints |
merchantId is an integer. categoryName stays on the preserved record so it is not treated as an allowlist entry. |
orderContext.items[].purchaseCriteria |
Array on each item. type is PRICE or DATE. |
fromDate to not_before, and toDate to the end instants only when expirationTs was absent, and only when type is DATE |
The October reading put purchaseCriteria on orderContext. This document nests it under each item. |
purchaseCriteria for DATE requires fromDate and toDate, both date-time. For PRICE it requires pricePreference: MINIMUM_PRICE, BETWEEN_RANGE, or MAXIMUM_PRICE. maxAmount and minAmount on a criterion are required when pricePreference is BETWEEN_RANGE. Those price strings are not spendControl.maxAmount.
Edit and cancel
PUT /payments/digital/v1/agentic-commerce/intents/{intentId} updates an intent. The description says updates are limited to supported parameters such as maximum amount and expiration. To modify other attributes, the existing intent must be cancelled and a new intent created. The body matches the create shape, including the same step-up follow-up. The response is IntentsResponse.
DELETE /payments/digital/v1/agentic-commerce/intents/{intentId} cancels an intent. The 200 response has no body schema. KATA's edit is a new signed mandate version. KATA's revoke accepts the principal key that signed. This mapper does not build either operation.
purchaseDecision
purchaseDecision is a string on the initial create, the initial update, and the initial payment-credential request. The enum is NON-DELEGATED and DELEGATED, in that order. The description says NON-DELEGATED means the purchase is executed with explicit Card Member approval at the time of the transaction, and DELEGATED means execution is delegated to an agent. The property is required on the initial intent body. It is not mapped. KATA has no field with those two tokens.
intentStatus
intentStatus is not one enum.
| Where | Tokens |
|---|---|
Create and update response before step-up (IntentsResponseBeforeStepUp) |
PENDING_STEP_UP only |
Create and update response after step-up (IntentsResponseAfterStepUp) |
ACTIVE only |
Notification notificationType INTENT_UPDATE |
ACTIVE and CANCEL |
DELETE does not return intentStatus. CANCEL is the notification token, not a create-response token. The mapper does not copy intentStatus onto agreement.status. The scaffold value proposed is a KATA draft marker.
Step-up
Create, update, enrollment, and payment credentials each describe a two-step exchange.
- The first intent request sends the intent body, including
riskandpurchaseDecision. - The before-step-up response has
stepUpAuthenticationRequired(YESorNO),enrollmentId,intentId,intentStatusPENDING_STEP_UP,stepUpSessionId, andavailableChallenges. - The follow-up intent body in the schema is
enrollmentIdplusstepUpVerification.stepUpVerificationrequiresstepUpSessionIdand one challenge result: SafeKeyriskToken, issuer-surfaceauthenticationToken, secure-pushauthenticationToken, or an OTPvalue. - The after-step-up response has
enrollmentId,intentId,intentStatusACTIVE, andproofOfIntent.
Challenge type values are ISSUER_SURFACE, SECURE_PUSH, SAFEKEY, SMS_OTP, and EMAIL_OTP.
The payment-credential follow-up is different. Its required properties are proofOfIntent and stepUpVerification. The description of proofOfIntent there is a signed JSON Web Token received as part of the create-intent response.
The create-intent description says the follow-up is made with the intent identifier and the step-up verification details. The follow-up schema does not include intentId. The identifier is on the before-step-up response and on the PUT and DELETE path.
Order context and Cart Context
orderContext.type is INTENT or CART.
| Token | Document description |
|---|---|
INTENT |
A preliminary selection or preference. |
CART |
A finalized set of items ready for purchase. |
CART is the cart stage inside this file. The company page's separate Cart Context specification was not in the download. This note treats orderContext.type CART as the published cart marker in the Agentic Commerce document, and it does not invent fields from an unopened Cart Context specification. The mapper leaves type on the preserved record. KATA has no order-context type.
orderContext also has merchants, totalAmount, currency, orderId, allowPartialOrder (YES or NO), and either items or airlineItems.
Item properties in Items include itemId (required string), merchantId (integer), name (required), unitAmount (string), currency (ISO 4217, required when unitAmount is set), quantity, condition, category, brand, imageLink, isRefundable (YES or NO), isGiftCard (YES or NO, required), isRecurBill (YES or NO), purchaseCriteria, and string metadata. The October pictures used itemReferenceId and merchantReferenceId. Those names are not in this schema.
Merchant properties are name, merchantId (integer), url, appName, seNumber, categoryName, and string metadata. The merchant item lists no required array.
Agent, principal, proof of intent, purpose
agent is required on the intent. Its required properties are agentName, llmPlatform, and llmVersion. llmPlatform is the enum OPEN_AI only. The agentId header is a separate required string. KATA agent requires agent_id and a public-key fingerprint. The gap stays, because those AmEx fields are not that object. The create-intent example sets llmPlatform to AI_PLATFORM, which is outside the enum.
enrollmentId is the enrolled account id. The intent user object carries firstName, lastName, a billing address, and email or phone, plus userEmailHash and userPhoneNumberHash (PBKDF2WithHmacSHA256, 10 iterations). KATA principal requires type, id, and the signing public key. The gap stays.
proofOfIntent is a string. On the after-step-up intent response and on INTENT_UPDATE notifications the description is a signed JSON Web Token associated with the intent. The schema does not publish claims or an algorithm. One example on the payment-credentials request decodes to header alg RS256, kid intent-key-1, typ JWT, and a payload with iss, sub, intentId, merchantId, amount, currency, scope, iat, and exp. The signature segment decodes to the text signature_placeholder. A nested example token uses alg RS256 and payload sub user_id, and its signature segment is the text signature. Those are placeholders. The mapper does not produce a KATA JWS.
KATA requires intent.purpose. The OpenAPI document has no purpose field.
Differences found in the file
These are places where a short field list and the downloaded document disagree. The document wins.
- The title in the file includes the words "American Express" and the suffix
(1.0.0).x-lastUpdatedis the stringApril 28, 2026, not an ISO date. - Eight operations sit on seven paths. PUT and DELETE share
/payments/digital/v1/agentic-commerce/intents/{intentId}. intentStatuson create and update isPENDING_STEP_UPorACTIVE.ACTIVEandCANCELare theINTENT_UPDATEnotification tokens. DELETE 200 has no body.purchaseDecisionis orderedNON-DELEGATED, thenDELEGATED.- Two properties are named
expirationTs. The intent-level one is required.spendControl.expirationTsis the payment-method expiration and is not required. proofOfIntentis an unconstrained string. Claims andalgare not schema constraints. The only concrete tokens are placeholder examples, includingRS256.agent.llmPlatformallowsOPEN_AIonly. The create-intent example usesAI_PLATFORM.- The create follow-up schema has
enrollmentIdandstepUpVerification. It does not containintentId, despite the operation description. INTENT_UPDATEnotifications requirenotificationType,enrollmentId,intentStatus, andproofOfIntent. They do not includeintentId.merchants[].nameis not marked required. Item identity isitemId. Merchant identity on both objects ismerchantId, an integer.isRefundableandisRecurBillareYESorNO.isGiftCardis required and uses the same tokens.pricePreferenceisMINIMUM_PRICE,BETWEEN_RANGE, orMAXIMUM_PRICE.- The
SECURE_PUSHchallenge object listsurlandriskTokenas required, and its properties only defineauthenticationToken. IntentsRiskrequiresdeviceandorder. The create-intent example omitsorder.
Verified
- The OpenAPI document at the URL above, read 18 October 2026, is OpenAPI 3.1.0, document version
1.0.0,x-lastUpdatedApril 28, 2026, with the SHA-256 in the table. It contains 8 operations and 64 schemas. intentIdis on the create and update responses and is the PUT and DELETE path parameter.prompt.promptSummaryandprompt.nlpConfidenceare the prompt properties.promptSummaryis required.spendControl.maxAmountandspendControl.currencyare required strings.spendControl.expirationTsis a separate date-time.- Intent
expirationTsis a required date-time. maxAllowedTransactionsis a string.purchaseCriteriais underorderContext.items[], withtypePRICEorDATE.orderContext.merchants[].nameis published.orderContext.typeisINTENTorCART, with the descriptions in the table above.purchaseDecisionisNON-DELEGATEDorDELEGATED.intentStatustokens are the ones in the intentStatus table.CANCELis on the intent notification, not on the create response.- PUT is the edit operation. DELETE is the cancel operation. The PUT description limits updates to parameters such as maximum amount and expiration.
- The step-up flow and the five challenge types are the ones in the step-up section.
agentrequiresagentName,llmPlatform, andllmVersion. TheagentIdheader exists and is required.llmPlatformisOPEN_AI.enrollmentIdand the intent user object exist.proofOfIntentis a signed JWT string whose claims and algorithm are not in the schema. No purpose property exists.- KATA amounts are major units. The mandate signature in this repository is a flattened JWS,
EdDSAorES256. Those sentences are from this repository's agreement document, not from American Express.
Assumed
agreement_idcarriesintentId. The document does not name a KATA field.intent_idis a copy.mandate_idadds.v1.prompt.promptSummaryis stored onnatural_language_source.spendControl.maxAmountis the per-transaction ceilingmaximum_amount, also copied tolimits.per_transaction_maximum. It might instead be read aslimits.cumulative_maximum. The document says it is the maximum that can be charged using the payment method.spendControl.currencyis the intent currency and the limits currency. A mix of item currencies is not resolved.maxAllowedTransactionsislimits.frequency.max_countover the whole mandate. The counters differ: authorized transactions versus recorded charges. The windowagreementis not in the document.- Merchant names are an allowlist.
categoryNameis not. - The first item's first
DATEcriterion writesfromDatetonot_before.toDatefills the end instants only whenexpirationTsis absent. - A passkey, a
proofOfIntentJWT, and a KATA principal signature are not the same ceremony. This note does not treat the placeholderRS256example as a KATA algorithm. agreement.statusproposed, the empty ledger, and version1are scaffolds. AmExintentStatusis not that status.schemaVersion, when present, is echoed.1.0.0matchesinfo.versionand is still assumed, because the property is not in the request schema.
Not accessible
- The JWE encryption of the request body: key agreement,
enc, andalgfor the payload encryption. The JSON schema is the decrypted model. - A normative
proofOfIntentheader,alg,kidregistry, and claim names. The examples are placeholders. - Who signs
proofOfIntent: the issuer, the user, the agent, or a wallet. - Whether DELETE invalidates a payment credential that was already issued. The 200 response has no body.
- A purpose string, a KATA principal public key, and a KATA agent public key.
- Unit scale for
spendControl.maxAmount,unitAmount, and the criterion amounts. - The separate Cart Context specification named on the company page.
orderContext.typeCARTis what this file publishes. - Agent Registration, beyond the
agentobject and theagentIdheader in this file.