Update transactions and travel rule documentation - #255

Open
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation
Open

Update transactions and travel rule documentation#255
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Fixes significant drift between the Transactions page and the current API behavior, verified against uphold/backend master. This is the largest correction of the documentation-audit follow-ups.

_transactions.md

  • Rewrote the Beneficiary Information section, which described a validation system removed from the backend (BKO-5438): there are no $3,000 / $1,000-Arizona thresholds, no name/alphabet rules, and no invalid_beneficiary errors anymore. The backend persists only relationship (free-form, 1–255 chars) — name and address are stripped; email+name are kept only for Interac withdrawals; ACH withdrawals are always recorded as relationship: myself. Crypto-withdrawal originator/beneficiary data is collected via the Travel Rule endpoints, now cross-linked. ?validate=true is documented as generic quote validation plus commit-time scope/OTP checks.
  • Fixed the scope lists for create and commit: transactions:deposit is not accepted at route level (a token holding only it fails with invalid_scope); the route scopes are the transfer/withdraw/write set, with the deposit scope checked per transaction type after route authorization.
  • Reserve endpoints: GET /v0/reserve/transactions requires an OAuth token from an authorization_code client with the reserve:read scope — not the previously claimed "API key" (which is defined nowhere); the sample now carries an Authorization header. GET /v0/reserve/transactions/:id is explicitly documented as requiring no authentication.
  • Pruned the public JSON examples to the fields the public mask actually returns (removed message, network, normalized, CardId, description, origin/destination type, denomination.pair/rate, params.progress/ttl/type; added application and priority).
  • Priority fast is no longer Dash-only: it enables instant US bank (ACH) withdrawals; on Dash it buys a higher network fee.
  • Transaction types table refreshed: FPS (and SWIFT/WIRE for unlinked accounts) bank networks, card and alternative-payment-method withdrawal destinations.
  • securityCode for card deposits is accepted as optional by this API ("may be required" — the card gateway can still require it).
  • Documented: 202 on create without ?commit=true; commit-time overrides (beneficiary, purpose, reference besides message); the denomination.target parameter; ?q= filters on List User Transactions (createdAt comparisons/ranges, origin/destination card ids with OR); requirements/requirementsDetails appearing only on uncommitted transactions, with the optional reason field.
  • Fixed OTP-Token: Required → lowercase required (matching the header the API actually sends), noted the OTP challenge can occur at create time with ?commit=true, and several typos.

_travelrule.md

  • A token lacking the required scope fails with a 400invalid_scope error, not the documented 403 (all three endpoints).

Notes for reviewers

  • The Travel Rule response field shapes (amount/threshold) and the possible requirementsDetails.reason values are owned by risk-assessment-service and proxied verbatim; they could not be verified from uphold/backend (its test mocks disagree with the documented flat-string shape). Worth confirming with that team — not changed here.
  • Undocumented endpoints found but deliberately not added (flagging in case they should be): GET /v0/me/transactions/:id, GET /v0/me/transactions/:id/sources, GET /v0/reserve/transactions/:id/sources. Same for the exotic create parameters ttlMilliseconds, order, parentTransactionId, recurringType and redirectUri.
  • The "Get All Transactions (Public)" heading was kept for anchor stability even though the endpoint now requires a token; the body text makes the distinction explicit.

Related issues

Follow-up to #250 (documentation audit against uphold/backend master).

Impacted areas

Transactions and Travel Rule pages of the API reference.

Steps to reproduce or test

Development

Every claim was traced to the enforcing code in uphold/backend master (card/transaction/reserve/travel-rule controllers, transaction-beneficiary-service.js, transaction-scope-resolver.js, quote and transaction models and their tests).

QA

Render both pages; optionally verify against sandbox that an uncommitted create returns 202, that a deposit-only-scoped token is rejected with invalid_scope, and that beneficiary name/address are not persisted.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • The Architectural diagram, if required, has been updated.

Deploy notes

N/A — no files added or removed, so no slate index changes are needed.

🤖 Generated with Claude Code

CopilotAI lite review requested due to automatic review settings August 23, 2026 21:51
@ricardobclricardobcl self-assigned this Aug 23, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the Transactions and Travel Rule API documentation to better match current backend behavior, focusing on scope/authorization semantics, Travel Rule interactions, beneficiary handling, and response/field shapes.

Changes:

  • Updates Travel Rule endpoint docs to state missing-scope failures return 400 invalid_scope (instead of 403).
  • Revises Transactions docs for create/commit scope requirements, Travel Rule requirement fields, reserve transaction authentication, and several transaction/beneficiary/validation details.
  • Prunes and refreshes examples/tables to reflect the public masking behavior and current supported transaction networks/destinations.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

FileDescription
_travelrule.mdUpdates auth error semantics for insufficient scopes to 400 invalid_scope across Travel Rule endpoints.
_transactions.mdBroad documentation refresh: scopes, commit/create behavior, Travel Rule/beneficiary sections, filtering, reserve endpoints, and example payloads.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread_transactions.md Outdated
Comment thread_transactions.md Outdated
@ricardobcl
ricardobclforce-pushed the support/update-transactions-documentation branch from a132641 to 72eeae3CompareAugust 23, 2026 22:37
Sign up for freeto 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.

2 participants

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Update transactions and travel rule documentation - #255

Open
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation
Open

Update transactions and travel rule documentation#255
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Fixes significant drift between the Transactions page and the current API behavior, verified against uphold/backend master. This is the largest correction of the documentation-audit follow-ups.

_transactions.md

  • Rewrote the Beneficiary Information section, which described a validation system removed from the backend (BKO-5438): there are no $3,000 / $1,000-Arizona thresholds, no name/alphabet rules, and no invalid_beneficiary errors anymore. The backend persists only relationship (free-form, 1–255 chars) — name and address are stripped; email+name are kept only for Interac withdrawals; ACH withdrawals are always recorded as relationship: myself. Crypto-withdrawal originator/beneficiary data is collected via the Travel Rule endpoints, now cross-linked. ?validate=true is documented as generic quote validation plus commit-time scope/OTP checks.
  • Fixed the scope lists for create and commit: transactions:deposit is not accepted at route level (a token holding only it fails with invalid_scope); the route scopes are the transfer/withdraw/write set, with the deposit scope checked per transaction type after route authorization.
  • Reserve endpoints: GET /v0/reserve/transactions requires an OAuth token from an authorization_code client with the reserve:read scope — not the previously claimed "API key" (which is defined nowhere); the sample now carries an Authorization header. GET /v0/reserve/transactions/:id is explicitly documented as requiring no authentication.
  • Pruned the public JSON examples to the fields the public mask actually returns (removed message, network, normalized, CardId, description, origin/destination type, denomination.pair/rate, params.progress/ttl/type; added application and priority).
  • Priority fast is no longer Dash-only: it enables instant US bank (ACH) withdrawals; on Dash it buys a higher network fee.
  • Transaction types table refreshed: FPS (and SWIFT/WIRE for unlinked accounts) bank networks, card and alternative-payment-method withdrawal destinations.
  • securityCode for card deposits is accepted as optional by this API ("may be required" — the card gateway can still require it).
  • Documented: 202 on create without ?commit=true; commit-time overrides (beneficiary, purpose, reference besides message); the denomination.target parameter; ?q= filters on List User Transactions (createdAt comparisons/ranges, origin/destination card ids with OR); requirements/requirementsDetails appearing only on uncommitted transactions, with the optional reason field.
  • Fixed OTP-Token: Required → lowercase required (matching the header the API actually sends), noted the OTP challenge can occur at create time with ?commit=true, and several typos.

_travelrule.md

  • A token lacking the required scope fails with a 400invalid_scope error, not the documented 403 (all three endpoints).

Notes for reviewers

  • The Travel Rule response field shapes (amount/threshold) and the possible requirementsDetails.reason values are owned by risk-assessment-service and proxied verbatim; they could not be verified from uphold/backend (its test mocks disagree with the documented flat-string shape). Worth confirming with that team — not changed here.
  • Undocumented endpoints found but deliberately not added (flagging in case they should be): GET /v0/me/transactions/:id, GET /v0/me/transactions/:id/sources, GET /v0/reserve/transactions/:id/sources. Same for the exotic create parameters ttlMilliseconds, order, parentTransactionId, recurringType and redirectUri.
  • The "Get All Transactions (Public)" heading was kept for anchor stability even though the endpoint now requires a token; the body text makes the distinction explicit.

Related issues

Follow-up to #250 (documentation audit against uphold/backend master).

Impacted areas

Transactions and Travel Rule pages of the API reference.

Steps to reproduce or test

Development

Every claim was traced to the enforcing code in uphold/backend master (card/transaction/reserve/travel-rule controllers, transaction-beneficiary-service.js, transaction-scope-resolver.js, quote and transaction models and their tests).

QA

Render both pages; optionally verify against sandbox that an uncommitted create returns 202, that a deposit-only-scoped token is rejected with invalid_scope, and that beneficiary name/address are not persisted.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • The Architectural diagram, if required, has been updated.

Deploy notes

N/A — no files added or removed, so no slate index changes are needed.

🤖 Generated with Claude Code

CopilotAI lite review requested due to automatic review settings August 23, 2026 21:51
@ricardobclricardobcl self-assigned this Aug 23, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the Transactions and Travel Rule API documentation to better match current backend behavior, focusing on scope/authorization semantics, Travel Rule interactions, beneficiary handling, and response/field shapes.

Changes:

  • Updates Travel Rule endpoint docs to state missing-scope failures return 400 invalid_scope (instead of 403).
  • Revises Transactions docs for create/commit scope requirements, Travel Rule requirement fields, reserve transaction authentication, and several transaction/beneficiary/validation details.
  • Prunes and refreshes examples/tables to reflect the public masking behavior and current supported transaction networks/destinations.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

FileDescription
_travelrule.mdUpdates auth error semantics for insufficient scopes to 400 invalid_scope across Travel Rule endpoints.
_transactions.mdBroad documentation refresh: scopes, commit/create behavior, Travel Rule/beneficiary sections, filtering, reserve endpoints, and example payloads.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread_transactions.md Outdated
Comment thread_transactions.md Outdated
@ricardobcl
ricardobclforce-pushed the support/update-transactions-documentation branch from a132641 to 72eeae3CompareAugust 23, 2026 22:37
Sign up for freeto 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.

2 participants

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update transactions and travel rule documentation - #255

Open
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation
Open

Update transactions and travel rule documentation#255
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Fixes significant drift between the Transactions page and the current API behavior, verified against uphold/backend master. This is the largest correction of the documentation-audit follow-ups.

_transactions.md

  • Rewrote the Beneficiary Information section, which described a validation system removed from the backend (BKO-5438): there are no $3,000 / $1,000-Arizona thresholds, no name/alphabet rules, and no invalid_beneficiary errors anymore. The backend persists only relationship (free-form, 1–255 chars) — name and address are stripped; email+name are kept only for Interac withdrawals; ACH withdrawals are always recorded as relationship: myself. Crypto-withdrawal originator/beneficiary data is collected via the Travel Rule endpoints, now cross-linked. ?validate=true is documented as generic quote validation plus commit-time scope/OTP checks.
  • Fixed the scope lists for create and commit: transactions:deposit is not accepted at route level (a token holding only it fails with invalid_scope); the route scopes are the transfer/withdraw/write set, with the deposit scope checked per transaction type after route authorization.
  • Reserve endpoints: GET /v0/reserve/transactions requires an OAuth token from an authorization_code client with the reserve:read scope — not the previously claimed "API key" (which is defined nowhere); the sample now carries an Authorization header. GET /v0/reserve/transactions/:id is explicitly documented as requiring no authentication.
  • Pruned the public JSON examples to the fields the public mask actually returns (removed message, network, normalized, CardId, description, origin/destination type, denomination.pair/rate, params.progress/ttl/type; added application and priority).
  • Priority fast is no longer Dash-only: it enables instant US bank (ACH) withdrawals; on Dash it buys a higher network fee.
  • Transaction types table refreshed: FPS (and SWIFT/WIRE for unlinked accounts) bank networks, card and alternative-payment-method withdrawal destinations.
  • securityCode for card deposits is accepted as optional by this API ("may be required" — the card gateway can still require it).
  • Documented: 202 on create without ?commit=true; commit-time overrides (beneficiary, purpose, reference besides message); the denomination.target parameter; ?q= filters on List User Transactions (createdAt comparisons/ranges, origin/destination card ids with OR); requirements/requirementsDetails appearing only on uncommitted transactions, with the optional reason field.
  • Fixed OTP-Token: Required → lowercase required (matching the header the API actually sends), noted the OTP challenge can occur at create time with ?commit=true, and several typos.

_travelrule.md

  • A token lacking the required scope fails with a 400invalid_scope error, not the documented 403 (all three endpoints).

Notes for reviewers

  • The Travel Rule response field shapes (amount/threshold) and the possible requirementsDetails.reason values are owned by risk-assessment-service and proxied verbatim; they could not be verified from uphold/backend (its test mocks disagree with the documented flat-string shape). Worth confirming with that team — not changed here.
  • Undocumented endpoints found but deliberately not added (flagging in case they should be): GET /v0/me/transactions/:id, GET /v0/me/transactions/:id/sources, GET /v0/reserve/transactions/:id/sources. Same for the exotic create parameters ttlMilliseconds, order, parentTransactionId, recurringType and redirectUri.
  • The "Get All Transactions (Public)" heading was kept for anchor stability even though the endpoint now requires a token; the body text makes the distinction explicit.

Related issues

Follow-up to #250 (documentation audit against uphold/backend master).

Impacted areas

Transactions and Travel Rule pages of the API reference.

Steps to reproduce or test

Development

Every claim was traced to the enforcing code in uphold/backend master (card/transaction/reserve/travel-rule controllers, transaction-beneficiary-service.js, transaction-scope-resolver.js, quote and transaction models and their tests).

QA

Render both pages; optionally verify against sandbox that an uncommitted create returns 202, that a deposit-only-scoped token is rejected with invalid_scope, and that beneficiary name/address are not persisted.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • The Architectural diagram, if required, has been updated.

Deploy notes

N/A — no files added or removed, so no slate index changes are needed.

🤖 Generated with Claude Code

CopilotAI lite review requested due to automatic review settings August 23, 2026 21:51
@ricardobclricardobcl self-assigned this Aug 23, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the Transactions and Travel Rule API documentation to better match current backend behavior, focusing on scope/authorization semantics, Travel Rule interactions, beneficiary handling, and response/field shapes.

Changes:

  • Updates Travel Rule endpoint docs to state missing-scope failures return 400 invalid_scope (instead of 403).
  • Revises Transactions docs for create/commit scope requirements, Travel Rule requirement fields, reserve transaction authentication, and several transaction/beneficiary/validation details.
  • Prunes and refreshes examples/tables to reflect the public masking behavior and current supported transaction networks/destinations.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

FileDescription
_travelrule.mdUpdates auth error semantics for insufficient scopes to 400 invalid_scope across Travel Rule endpoints.
_transactions.mdBroad documentation refresh: scopes, commit/create behavior, Travel Rule/beneficiary sections, filtering, reserve endpoints, and example payloads.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread_transactions.md Outdated
Comment thread_transactions.md Outdated
@ricardobcl
ricardobclforce-pushed the support/update-transactions-documentation branch from a132641 to 72eeae3CompareAugust 23, 2026 22:37
Sign up for freeto 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.

2 participants

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update transactions and travel rule documentation - #255

Open
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation
Open

Update transactions and travel rule documentation#255
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Fixes significant drift between the Transactions page and the current API behavior, verified against uphold/backend master. This is the largest correction of the documentation-audit follow-ups.

_transactions.md

  • Rewrote the Beneficiary Information section, which described a validation system removed from the backend (BKO-5438): there are no $3,000 / $1,000-Arizona thresholds, no name/alphabet rules, and no invalid_beneficiary errors anymore. The backend persists only relationship (free-form, 1–255 chars) — name and address are stripped; email+name are kept only for Interac withdrawals; ACH withdrawals are always recorded as relationship: myself. Crypto-withdrawal originator/beneficiary data is collected via the Travel Rule endpoints, now cross-linked. ?validate=true is documented as generic quote validation plus commit-time scope/OTP checks.
  • Fixed the scope lists for create and commit: transactions:deposit is not accepted at route level (a token holding only it fails with invalid_scope); the route scopes are the transfer/withdraw/write set, with the deposit scope checked per transaction type after route authorization.
  • Reserve endpoints: GET /v0/reserve/transactions requires an OAuth token from an authorization_code client with the reserve:read scope — not the previously claimed "API key" (which is defined nowhere); the sample now carries an Authorization header. GET /v0/reserve/transactions/:id is explicitly documented as requiring no authentication.
  • Pruned the public JSON examples to the fields the public mask actually returns (removed message, network, normalized, CardId, description, origin/destination type, denomination.pair/rate, params.progress/ttl/type; added application and priority).
  • Priority fast is no longer Dash-only: it enables instant US bank (ACH) withdrawals; on Dash it buys a higher network fee.
  • Transaction types table refreshed: FPS (and SWIFT/WIRE for unlinked accounts) bank networks, card and alternative-payment-method withdrawal destinations.
  • securityCode for card deposits is accepted as optional by this API ("may be required" — the card gateway can still require it).
  • Documented: 202 on create without ?commit=true; commit-time overrides (beneficiary, purpose, reference besides message); the denomination.target parameter; ?q= filters on List User Transactions (createdAt comparisons/ranges, origin/destination card ids with OR); requirements/requirementsDetails appearing only on uncommitted transactions, with the optional reason field.
  • Fixed OTP-Token: Required → lowercase required (matching the header the API actually sends), noted the OTP challenge can occur at create time with ?commit=true, and several typos.

_travelrule.md

  • A token lacking the required scope fails with a 400invalid_scope error, not the documented 403 (all three endpoints).

Notes for reviewers

  • The Travel Rule response field shapes (amount/threshold) and the possible requirementsDetails.reason values are owned by risk-assessment-service and proxied verbatim; they could not be verified from uphold/backend (its test mocks disagree with the documented flat-string shape). Worth confirming with that team — not changed here.
  • Undocumented endpoints found but deliberately not added (flagging in case they should be): GET /v0/me/transactions/:id, GET /v0/me/transactions/:id/sources, GET /v0/reserve/transactions/:id/sources. Same for the exotic create parameters ttlMilliseconds, order, parentTransactionId, recurringType and redirectUri.
  • The "Get All Transactions (Public)" heading was kept for anchor stability even though the endpoint now requires a token; the body text makes the distinction explicit.

Related issues

Follow-up to #250 (documentation audit against uphold/backend master).

Impacted areas

Transactions and Travel Rule pages of the API reference.

Steps to reproduce or test

Development

Every claim was traced to the enforcing code in uphold/backend master (card/transaction/reserve/travel-rule controllers, transaction-beneficiary-service.js, transaction-scope-resolver.js, quote and transaction models and their tests).

QA

Render both pages; optionally verify against sandbox that an uncommitted create returns 202, that a deposit-only-scoped token is rejected with invalid_scope, and that beneficiary name/address are not persisted.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • The Architectural diagram, if required, has been updated.

Deploy notes

N/A — no files added or removed, so no slate index changes are needed.

🤖 Generated with Claude Code

CopilotAI lite review requested due to automatic review settings August 23, 2026 21:51
@ricardobclricardobcl self-assigned this Aug 23, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the Transactions and Travel Rule API documentation to better match current backend behavior, focusing on scope/authorization semantics, Travel Rule interactions, beneficiary handling, and response/field shapes.

Changes:

  • Updates Travel Rule endpoint docs to state missing-scope failures return 400 invalid_scope (instead of 403).
  • Revises Transactions docs for create/commit scope requirements, Travel Rule requirement fields, reserve transaction authentication, and several transaction/beneficiary/validation details.
  • Prunes and refreshes examples/tables to reflect the public masking behavior and current supported transaction networks/destinations.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

FileDescription
_travelrule.mdUpdates auth error semantics for insufficient scopes to 400 invalid_scope across Travel Rule endpoints.
_transactions.mdBroad documentation refresh: scopes, commit/create behavior, Travel Rule/beneficiary sections, filtering, reserve endpoints, and example payloads.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread_transactions.md Outdated
Comment thread_transactions.md Outdated
@ricardobcl
ricardobclforce-pushed the support/update-transactions-documentation branch from a132641 to 72eeae3CompareAugust 23, 2026 22:37
Sign up for freeto 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.

2 participants

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Update transactions and travel rule documentation - #255

Open
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation
Open

Update transactions and travel rule documentation#255
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Fixes significant drift between the Transactions page and the current API behavior, verified against uphold/backend master. This is the largest correction of the documentation-audit follow-ups.

_transactions.md

  • Rewrote the Beneficiary Information section, which described a validation system removed from the backend (BKO-5438): there are no $3,000 / $1,000-Arizona thresholds, no name/alphabet rules, and no invalid_beneficiary errors anymore. The backend persists only relationship (free-form, 1–255 chars) — name and address are stripped; email+name are kept only for Interac withdrawals; ACH withdrawals are always recorded as relationship: myself. Crypto-withdrawal originator/beneficiary data is collected via the Travel Rule endpoints, now cross-linked. ?validate=true is documented as generic quote validation plus commit-time scope/OTP checks.
  • Fixed the scope lists for create and commit: transactions:deposit is not accepted at route level (a token holding only it fails with invalid_scope); the route scopes are the transfer/withdraw/write set, with the deposit scope checked per transaction type after route authorization.
  • Reserve endpoints: GET /v0/reserve/transactions requires an OAuth token from an authorization_code client with the reserve:read scope — not the previously claimed "API key" (which is defined nowhere); the sample now carries an Authorization header. GET /v0/reserve/transactions/:id is explicitly documented as requiring no authentication.
  • Pruned the public JSON examples to the fields the public mask actually returns (removed message, network, normalized, CardId, description, origin/destination type, denomination.pair/rate, params.progress/ttl/type; added application and priority).
  • Priority fast is no longer Dash-only: it enables instant US bank (ACH) withdrawals; on Dash it buys a higher network fee.
  • Transaction types table refreshed: FPS (and SWIFT/WIRE for unlinked accounts) bank networks, card and alternative-payment-method withdrawal destinations.
  • securityCode for card deposits is accepted as optional by this API ("may be required" — the card gateway can still require it).
  • Documented: 202 on create without ?commit=true; commit-time overrides (beneficiary, purpose, reference besides message); the denomination.target parameter; ?q= filters on List User Transactions (createdAt comparisons/ranges, origin/destination card ids with OR); requirements/requirementsDetails appearing only on uncommitted transactions, with the optional reason field.
  • Fixed OTP-Token: Required → lowercase required (matching the header the API actually sends), noted the OTP challenge can occur at create time with ?commit=true, and several typos.

_travelrule.md

  • A token lacking the required scope fails with a 400invalid_scope error, not the documented 403 (all three endpoints).

Notes for reviewers

  • The Travel Rule response field shapes (amount/threshold) and the possible requirementsDetails.reason values are owned by risk-assessment-service and proxied verbatim; they could not be verified from uphold/backend (its test mocks disagree with the documented flat-string shape). Worth confirming with that team — not changed here.
  • Undocumented endpoints found but deliberately not added (flagging in case they should be): GET /v0/me/transactions/:id, GET /v0/me/transactions/:id/sources, GET /v0/reserve/transactions/:id/sources. Same for the exotic create parameters ttlMilliseconds, order, parentTransactionId, recurringType and redirectUri.
  • The "Get All Transactions (Public)" heading was kept for anchor stability even though the endpoint now requires a token; the body text makes the distinction explicit.

Related issues

Follow-up to #250 (documentation audit against uphold/backend master).

Impacted areas

Transactions and Travel Rule pages of the API reference.

Steps to reproduce or test

Development

Every claim was traced to the enforcing code in uphold/backend master (card/transaction/reserve/travel-rule controllers, transaction-beneficiary-service.js, transaction-scope-resolver.js, quote and transaction models and their tests).

QA

Render both pages; optionally verify against sandbox that an uncommitted create returns 202, that a deposit-only-scoped token is rejected with invalid_scope, and that beneficiary name/address are not persisted.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • The Architectural diagram, if required, has been updated.

Deploy notes

N/A — no files added or removed, so no slate index changes are needed.

🤖 Generated with Claude Code

CopilotAI lite review requested due to automatic review settings August 23, 2026 21:51
@ricardobclricardobcl self-assigned this Aug 23, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the Transactions and Travel Rule API documentation to better match current backend behavior, focusing on scope/authorization semantics, Travel Rule interactions, beneficiary handling, and response/field shapes.

Changes:

  • Updates Travel Rule endpoint docs to state missing-scope failures return 400 invalid_scope (instead of 403).
  • Revises Transactions docs for create/commit scope requirements, Travel Rule requirement fields, reserve transaction authentication, and several transaction/beneficiary/validation details.
  • Prunes and refreshes examples/tables to reflect the public masking behavior and current supported transaction networks/destinations.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

FileDescription
_travelrule.mdUpdates auth error semantics for insufficient scopes to 400 invalid_scope across Travel Rule endpoints.
_transactions.mdBroad documentation refresh: scopes, commit/create behavior, Travel Rule/beneficiary sections, filtering, reserve endpoints, and example payloads.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread_transactions.md Outdated
Comment thread_transactions.md Outdated
@ricardobcl
ricardobclforce-pushed the support/update-transactions-documentation branch from a132641 to 72eeae3CompareAugust 23, 2026 22:37
Sign up for freeto 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.

2 participants

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update transactions and travel rule documentation - #255

Open
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation
Open

Update transactions and travel rule documentation#255
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Fixes significant drift between the Transactions page and the current API behavior, verified against uphold/backend master. This is the largest correction of the documentation-audit follow-ups.

_transactions.md

  • Rewrote the Beneficiary Information section, which described a validation system removed from the backend (BKO-5438): there are no $3,000 / $1,000-Arizona thresholds, no name/alphabet rules, and no invalid_beneficiary errors anymore. The backend persists only relationship (free-form, 1–255 chars) — name and address are stripped; email+name are kept only for Interac withdrawals; ACH withdrawals are always recorded as relationship: myself. Crypto-withdrawal originator/beneficiary data is collected via the Travel Rule endpoints, now cross-linked. ?validate=true is documented as generic quote validation plus commit-time scope/OTP checks.
  • Fixed the scope lists for create and commit: transactions:deposit is not accepted at route level (a token holding only it fails with invalid_scope); the route scopes are the transfer/withdraw/write set, with the deposit scope checked per transaction type after route authorization.
  • Reserve endpoints: GET /v0/reserve/transactions requires an OAuth token from an authorization_code client with the reserve:read scope — not the previously claimed "API key" (which is defined nowhere); the sample now carries an Authorization header. GET /v0/reserve/transactions/:id is explicitly documented as requiring no authentication.
  • Pruned the public JSON examples to the fields the public mask actually returns (removed message, network, normalized, CardId, description, origin/destination type, denomination.pair/rate, params.progress/ttl/type; added application and priority).
  • Priority fast is no longer Dash-only: it enables instant US bank (ACH) withdrawals; on Dash it buys a higher network fee.
  • Transaction types table refreshed: FPS (and SWIFT/WIRE for unlinked accounts) bank networks, card and alternative-payment-method withdrawal destinations.
  • securityCode for card deposits is accepted as optional by this API ("may be required" — the card gateway can still require it).
  • Documented: 202 on create without ?commit=true; commit-time overrides (beneficiary, purpose, reference besides message); the denomination.target parameter; ?q= filters on List User Transactions (createdAt comparisons/ranges, origin/destination card ids with OR); requirements/requirementsDetails appearing only on uncommitted transactions, with the optional reason field.
  • Fixed OTP-Token: Required → lowercase required (matching the header the API actually sends), noted the OTP challenge can occur at create time with ?commit=true, and several typos.

_travelrule.md

  • A token lacking the required scope fails with a 400invalid_scope error, not the documented 403 (all three endpoints).

Notes for reviewers

  • The Travel Rule response field shapes (amount/threshold) and the possible requirementsDetails.reason values are owned by risk-assessment-service and proxied verbatim; they could not be verified from uphold/backend (its test mocks disagree with the documented flat-string shape). Worth confirming with that team — not changed here.
  • Undocumented endpoints found but deliberately not added (flagging in case they should be): GET /v0/me/transactions/:id, GET /v0/me/transactions/:id/sources, GET /v0/reserve/transactions/:id/sources. Same for the exotic create parameters ttlMilliseconds, order, parentTransactionId, recurringType and redirectUri.
  • The "Get All Transactions (Public)" heading was kept for anchor stability even though the endpoint now requires a token; the body text makes the distinction explicit.

Related issues

Follow-up to #250 (documentation audit against uphold/backend master).

Impacted areas

Transactions and Travel Rule pages of the API reference.

Steps to reproduce or test

Development

Every claim was traced to the enforcing code in uphold/backend master (card/transaction/reserve/travel-rule controllers, transaction-beneficiary-service.js, transaction-scope-resolver.js, quote and transaction models and their tests).

QA

Render both pages; optionally verify against sandbox that an uncommitted create returns 202, that a deposit-only-scoped token is rejected with invalid_scope, and that beneficiary name/address are not persisted.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • The Architectural diagram, if required, has been updated.

Deploy notes

N/A — no files added or removed, so no slate index changes are needed.

🤖 Generated with Claude Code

CopilotAI lite review requested due to automatic review settings August 23, 2026 21:51
@ricardobclricardobcl self-assigned this Aug 23, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the Transactions and Travel Rule API documentation to better match current backend behavior, focusing on scope/authorization semantics, Travel Rule interactions, beneficiary handling, and response/field shapes.

Changes:

  • Updates Travel Rule endpoint docs to state missing-scope failures return 400 invalid_scope (instead of 403).
  • Revises Transactions docs for create/commit scope requirements, Travel Rule requirement fields, reserve transaction authentication, and several transaction/beneficiary/validation details.
  • Prunes and refreshes examples/tables to reflect the public masking behavior and current supported transaction networks/destinations.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

FileDescription
_travelrule.mdUpdates auth error semantics for insufficient scopes to 400 invalid_scope across Travel Rule endpoints.
_transactions.mdBroad documentation refresh: scopes, commit/create behavior, Travel Rule/beneficiary sections, filtering, reserve endpoints, and example payloads.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread_transactions.md Outdated
Comment thread_transactions.md Outdated
@ricardobcl
ricardobclforce-pushed the support/update-transactions-documentation branch from a132641 to 72eeae3CompareAugust 23, 2026 22:37
Sign up for freeto 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.

2 participants

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Update transactions and travel rule documentation - #255

Open
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation
Open

Update transactions and travel rule documentation#255
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Fixes significant drift between the Transactions page and the current API behavior, verified against uphold/backend master. This is the largest correction of the documentation-audit follow-ups.

_transactions.md

  • Rewrote the Beneficiary Information section, which described a validation system removed from the backend (BKO-5438): there are no $3,000 / $1,000-Arizona thresholds, no name/alphabet rules, and no invalid_beneficiary errors anymore. The backend persists only relationship (free-form, 1–255 chars) — name and address are stripped; email+name are kept only for Interac withdrawals; ACH withdrawals are always recorded as relationship: myself. Crypto-withdrawal originator/beneficiary data is collected via the Travel Rule endpoints, now cross-linked. ?validate=true is documented as generic quote validation plus commit-time scope/OTP checks.
  • Fixed the scope lists for create and commit: transactions:deposit is not accepted at route level (a token holding only it fails with invalid_scope); the route scopes are the transfer/withdraw/write set, with the deposit scope checked per transaction type after route authorization.
  • Reserve endpoints: GET /v0/reserve/transactions requires an OAuth token from an authorization_code client with the reserve:read scope — not the previously claimed "API key" (which is defined nowhere); the sample now carries an Authorization header. GET /v0/reserve/transactions/:id is explicitly documented as requiring no authentication.
  • Pruned the public JSON examples to the fields the public mask actually returns (removed message, network, normalized, CardId, description, origin/destination type, denomination.pair/rate, params.progress/ttl/type; added application and priority).
  • Priority fast is no longer Dash-only: it enables instant US bank (ACH) withdrawals; on Dash it buys a higher network fee.
  • Transaction types table refreshed: FPS (and SWIFT/WIRE for unlinked accounts) bank networks, card and alternative-payment-method withdrawal destinations.
  • securityCode for card deposits is accepted as optional by this API ("may be required" — the card gateway can still require it).
  • Documented: 202 on create without ?commit=true; commit-time overrides (beneficiary, purpose, reference besides message); the denomination.target parameter; ?q= filters on List User Transactions (createdAt comparisons/ranges, origin/destination card ids with OR); requirements/requirementsDetails appearing only on uncommitted transactions, with the optional reason field.
  • Fixed OTP-Token: Required → lowercase required (matching the header the API actually sends), noted the OTP challenge can occur at create time with ?commit=true, and several typos.

_travelrule.md

  • A token lacking the required scope fails with a 400invalid_scope error, not the documented 403 (all three endpoints).

Notes for reviewers

  • The Travel Rule response field shapes (amount/threshold) and the possible requirementsDetails.reason values are owned by risk-assessment-service and proxied verbatim; they could not be verified from uphold/backend (its test mocks disagree with the documented flat-string shape). Worth confirming with that team — not changed here.
  • Undocumented endpoints found but deliberately not added (flagging in case they should be): GET /v0/me/transactions/:id, GET /v0/me/transactions/:id/sources, GET /v0/reserve/transactions/:id/sources. Same for the exotic create parameters ttlMilliseconds, order, parentTransactionId, recurringType and redirectUri.
  • The "Get All Transactions (Public)" heading was kept for anchor stability even though the endpoint now requires a token; the body text makes the distinction explicit.

Related issues

Follow-up to #250 (documentation audit against uphold/backend master).

Impacted areas

Transactions and Travel Rule pages of the API reference.

Steps to reproduce or test

Development

Every claim was traced to the enforcing code in uphold/backend master (card/transaction/reserve/travel-rule controllers, transaction-beneficiary-service.js, transaction-scope-resolver.js, quote and transaction models and their tests).

QA

Render both pages; optionally verify against sandbox that an uncommitted create returns 202, that a deposit-only-scoped token is rejected with invalid_scope, and that beneficiary name/address are not persisted.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • The Architectural diagram, if required, has been updated.

Deploy notes

N/A — no files added or removed, so no slate index changes are needed.

🤖 Generated with Claude Code

CopilotAI lite review requested due to automatic review settings August 23, 2026 21:51
@ricardobclricardobcl self-assigned this Aug 23, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the Transactions and Travel Rule API documentation to better match current backend behavior, focusing on scope/authorization semantics, Travel Rule interactions, beneficiary handling, and response/field shapes.

Changes:

  • Updates Travel Rule endpoint docs to state missing-scope failures return 400 invalid_scope (instead of 403).
  • Revises Transactions docs for create/commit scope requirements, Travel Rule requirement fields, reserve transaction authentication, and several transaction/beneficiary/validation details.
  • Prunes and refreshes examples/tables to reflect the public masking behavior and current supported transaction networks/destinations.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

FileDescription
_travelrule.mdUpdates auth error semantics for insufficient scopes to 400 invalid_scope across Travel Rule endpoints.
_transactions.mdBroad documentation refresh: scopes, commit/create behavior, Travel Rule/beneficiary sections, filtering, reserve endpoints, and example payloads.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread_transactions.md Outdated
Comment thread_transactions.md Outdated
@ricardobcl
ricardobclforce-pushed the support/update-transactions-documentation branch from a132641 to 72eeae3CompareAugust 23, 2026 22:37
Sign up for freeto 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.

2 participants

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Update transactions and travel rule documentation - #255

Open
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation
Open

Update transactions and travel rule documentation#255
ricardobcl wants to merge 2 commits into
masterfrom
support/update-transactions-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Fixes significant drift between the Transactions page and the current API behavior, verified against uphold/backend master. This is the largest correction of the documentation-audit follow-ups.

_transactions.md

  • Rewrote the Beneficiary Information section, which described a validation system removed from the backend (BKO-5438): there are no $3,000 / $1,000-Arizona thresholds, no name/alphabet rules, and no invalid_beneficiary errors anymore. The backend persists only relationship (free-form, 1–255 chars) — name and address are stripped; email+name are kept only for Interac withdrawals; ACH withdrawals are always recorded as relationship: myself. Crypto-withdrawal originator/beneficiary data is collected via the Travel Rule endpoints, now cross-linked. ?validate=true is documented as generic quote validation plus commit-time scope/OTP checks.
  • Fixed the scope lists for create and commit: transactions:deposit is not accepted at route level (a token holding only it fails with invalid_scope); the route scopes are the transfer/withdraw/write set, with the deposit scope checked per transaction type after route authorization.
  • Reserve endpoints: GET /v0/reserve/transactions requires an OAuth token from an authorization_code client with the reserve:read scope — not the previously claimed "API key" (which is defined nowhere); the sample now carries an Authorization header. GET /v0/reserve/transactions/:id is explicitly documented as requiring no authentication.
  • Pruned the public JSON examples to the fields the public mask actually returns (removed message, network, normalized, CardId, description, origin/destination type, denomination.pair/rate, params.progress/ttl/type; added application and priority).
  • Priority fast is no longer Dash-only: it enables instant US bank (ACH) withdrawals; on Dash it buys a higher network fee.
  • Transaction types table refreshed: FPS (and SWIFT/WIRE for unlinked accounts) bank networks, card and alternative-payment-method withdrawal destinations.
  • securityCode for card deposits is accepted as optional by this API ("may be required" — the card gateway can still require it).
  • Documented: 202 on create without ?commit=true; commit-time overrides (beneficiary, purpose, reference besides message); the denomination.target parameter; ?q= filters on List User Transactions (createdAt comparisons/ranges, origin/destination card ids with OR); requirements/requirementsDetails appearing only on uncommitted transactions, with the optional reason field.
  • Fixed OTP-Token: Required → lowercase required (matching the header the API actually sends), noted the OTP challenge can occur at create time with ?commit=true, and several typos.

_travelrule.md

  • A token lacking the required scope fails with a 400invalid_scope error, not the documented 403 (all three endpoints).

Notes for reviewers

  • The Travel Rule response field shapes (amount/threshold) and the possible requirementsDetails.reason values are owned by risk-assessment-service and proxied verbatim; they could not be verified from uphold/backend (its test mocks disagree with the documented flat-string shape). Worth confirming with that team — not changed here.
  • Undocumented endpoints found but deliberately not added (flagging in case they should be): GET /v0/me/transactions/:id, GET /v0/me/transactions/:id/sources, GET /v0/reserve/transactions/:id/sources. Same for the exotic create parameters ttlMilliseconds, order, parentTransactionId, recurringType and redirectUri.
  • The "Get All Transactions (Public)" heading was kept for anchor stability even though the endpoint now requires a token; the body text makes the distinction explicit.

Related issues

Follow-up to #250 (documentation audit against uphold/backend master).

Impacted areas

Transactions and Travel Rule pages of the API reference.

Steps to reproduce or test

Development

Every claim was traced to the enforcing code in uphold/backend master (card/transaction/reserve/travel-rule controllers, transaction-beneficiary-service.js, transaction-scope-resolver.js, quote and transaction models and their tests).

QA

Render both pages; optionally verify against sandbox that an uncommitted create returns 202, that a deposit-only-scoped token is rejected with invalid_scope, and that beneficiary name/address are not persisted.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • The Architectural diagram, if required, has been updated.

Deploy notes

N/A — no files added or removed, so no slate index changes are needed.

🤖 Generated with Claude Code

CopilotAI lite review requested due to automatic review settings August 23, 2026 21:51
@ricardobclricardobcl self-assigned this Aug 23, 2026

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the Transactions and Travel Rule API documentation to better match current backend behavior, focusing on scope/authorization semantics, Travel Rule interactions, beneficiary handling, and response/field shapes.

Changes:

  • Updates Travel Rule endpoint docs to state missing-scope failures return 400 invalid_scope (instead of 403).
  • Revises Transactions docs for create/commit scope requirements, Travel Rule requirement fields, reserve transaction authentication, and several transaction/beneficiary/validation details.
  • Prunes and refreshes examples/tables to reflect the public masking behavior and current supported transaction networks/destinations.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

FileDescription
_travelrule.mdUpdates auth error semantics for insufficient scopes to 400 invalid_scope across Travel Rule endpoints.
_transactions.mdBroad documentation refresh: scopes, commit/create behavior, Travel Rule/beneficiary sections, filtering, reserve endpoints, and example payloads.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread_transactions.md Outdated
Comment thread_transactions.md Outdated
@ricardobcl
ricardobclforce-pushed the support/update-transactions-documentation branch from a132641 to 72eeae3CompareAugust 23, 2026 22:37
Sign up for freeto 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.

2 participants

@ricardobcl