81trust / 100

Holdings Diff

by U2A in Markets & finance

x402 APIPassing, checked 4 h ago

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.

POST https://www.u2a.com.au/api/mcp/holdings-diff

Last 30 days

All checks passedSome failedAll failedNot checked
Uptime
100%
Response time
169 ms typical, 169 ms slowest 5%
Last check
4 h ago
Next check
any minute now

How to call it

# See the payment challenge (nothing is charged)
curl -i -X POST "https://www.u2a.com.au/api/mcp/holdings-diff" \
  -H "content-type: application/json" \
  -d '{"compareFields":["quantity","market_value"],"keys":["ticker"],"newRecords":[{"market_value":1375,"quantity":125,"ticker":"ABC"}],"oldRecords":[{"market_value":1000,"quantity":100,"ticker":"ABC"}],"quantityField":"quantity","valueField":"market_value"}'
import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const client = new x402Client().register(
  "eip155:8453",
  new ExactEvmScheme(privateKeyToAccount(process.env.AGENT_KEY)),
);
const pay = wrapFetchWithPayment(fetch, client);

// Not sure it's safe to pay? Preflight it first for $0.005:
// GET https://toolvet.app/api/v1/check?url=https%3A%2F%2Fwww.u2a.com.au%2Fapi%2Fmcp%2Fholdings-diff
const res = await pay("https://www.u2a.com.au/api/mcp/holdings-diff", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({"compareFields":["quantity","market_value"],"keys":["ticker"],"newRecords":[{"market_value":1375,"quantity":125,"ticker":"ABC"}],"oldRecords":[{"market_value":1000,"quantity":100,"ticker":"ABC"}],"quantityField":"quantity","valueField":"market_value"}),
});
console.log(await res.json());

Example input

{
  "compareFields": [
    "quantity",
    "market_value"
  ],
  "keys": [
    "ticker"
  ],
  "newRecords": [
    {
      "market_value": 1375,
      "quantity": 125,
      "ticker": "ABC"
    }
  ],
  "oldRecords": [
    {
      "market_value": 1000,
      "quantity": 100,
      "ticker": "ABC"
    }
  ],
  "quantityField": "quantity",
  "valueField": "market_value"
}

Example output

{
  "id": null,
  "jsonrpc": "2.0",
  "result": {
    "closed_positions": [],
    "decreased_positions": [],
    "field_changes": [
      {
        "field": "quantity",
        "key": [
          "ABC"
        ],
        "new_value": 125,
        "old_value": 100
      }
    ],
    "increased_positions": [
      {
        "key": [
          "ABC"
        ],
        "market_value_change": 375,
        "new_market_value": 1375,
        "new_quantity": 125,
        "new_record": {
          "market_value": 1375,
          "quantity": 125,
          "ticker": "ABC"
        },
        "new_weight_pct": 100,
        "old_market_value": 1000,
        "old_quantity": 100,
        "old_weight_pct": 100,
        "percentage_change": 25,
        "quantity_change": 25,
        "weight_change_pct": 0
      }
    ],
    "keys": [
      "ticker"
    ],
    "opened_positions": [],
    "summary": {
      "closed": 0,
      "decreased": 0,
      "increased": 1,
      "new": {
        "positions": 1,
        "rows_without_value": 0,
        "total_market_value": 1375
      },
      "old": {
        "positions": 1,
        "rows_without_value": 0,
        "total_market_value": 1000
      },
      "opened": 0,
      "unchanged": 0
    },
    "unchanged_positions": []
  }
}

Security scan

  • No findings. We scan names, descriptions and tool definitions for hidden instructions and other prompt-injection patterns.

Recent checks

WhenResultHTTPTimePrice
4 h agoPassed402169 ms$0.01