# U2A Holdings Diff

> U2A Holdings Diff is a paid API for AI agents from www.u2a.com.au, paid per call via x402, $0.01/call, status unknown (last checked 2026-10-12).

Compares two portfolio or SEC-style holdings datasets and returns opened, closed, increased, decreased, and field-level changed positions identified by CUSIP, ticker, ISIN, or internal ID.

## Facts

- Endpoint: POST https://www.u2a.com.au/api/mcp/holdings-diff?utm_source=zero.xyz
- Price: $0.01/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-12
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/u2a-holdings-diff-61cf94cb
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_tYUCM1s_e7h_Z8Ptr2jSn

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability u2a-holdings-diff-61cf94cb -d '<json body>'
```

Example prompt: Compare my old and new holdings files — use CUSIP and ticker as the keys, quantity in the 'shares' field, value in the 'market_value' field — and tell me which positions were opened, closed, increased, or decreased, and flag any other field-level changes.

## When to prefer this

Use this endpoint when you need a structured, field-level diff of two holdings or portfolio datasets identified by financial identifiers like CUSIP, ticker, or ISIN — especially when you need to categorize changes as opened, closed, increased, or decreased. Prefer it over generic record-diff tools when dealing with SEC-style or fund portfolio data formats, or when you need quantity and market-value aware comparison alongside field-level change detection.

## Known failure modes

- Missing required 'keys' field returns a validation error
- newRecords or oldRecords exceeding 2000 items each may be rejected
- Unrecognized or absent key fields in records produce unmatched rows
- Non-existent valueField or quantityField names result in null comparisons or errors
- Malformed record objects (non-array or missing properties) cause parsing failures

## How this service works

Compare any two portfolio or SEC-style holdings datasets (up to 1000 rows each) by CUSIP, ticker, ISIN, or internal identifier. Return opened, closed, increased, decreased, and field-level changed positions with totals and weight changes.

## Output

Returns a structured diff object categorizing each position as opened (in new but not old), closed (in old but not new), increased (quantity/value grew), decreased (quantity/value shrank), or changed (field-level differences in specified compareFields), with before/after values for each affected record.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "keys": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "minItems": 1,
   "description": "Field name(s) that identify a row in both datasets, e.g. [\"cusip\"] or [\"ticker\",\"putCall\"]."
  },
  "newRecords": {
   "type": "array",
   "items": {
    "type": "object"
   },
   "maxItems": 1000,
   "description": "Holdings at the later date, same field names as oldRecords (max 1000)."
  },
  "oldRecords": {
   "type": "array",
   "items": {
    "type": "object"
   },
   "maxItems": 1000,
   "description": "Holdings at the earlier date (one object per position; max 1000)."
  },
  "valueField": {
   "type": "string",
   "description": "Field containing the position market value."
  },
  "compareFields": {
   "type": "array",
   "items": {
    "type": "string"
   },
   "description": "Fields to compare for changes. Default: every field present in both datasets except the keys."
  },
  "quantityField": {
   "type": "string",
   "description": "Field containing the position quantity or share count."
  },
  "includeRecords": {
   "type": "boolean",
   "default": true,
   "description": "Include the new source row (new_record) on each position. Old rows are never echoed back. Set false for the smallest response."
  },
  "aggregateDuplicates": {
   "type": "boolean",
   "default": false,
   "description": "Sum quantity and value for rows sharing a key (e.g. 13F rows split by sub-manager) instead of rejecting duplicates."
  },
  "caseInsensitiveKeys": {
   "type": "boolean",
   "default": false,
   "description": "Treat \"abc\" and \"ABC\" as the same key."
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/u2a-holdings-diff-61cf94cb/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from www.u2a.com.au](https://www.zero.xyz/host/www.u2a.com.au/llms.txt)
