Personal tax details

personalTax.shareholder.addPerson

As a freshly verified company administrator, save a known verified associated person's real shareholder details in this exact company without switching workspaces. Requires ownerUserId, real holder fields, optional explicit existingHolderId, current register and target association fingerprints. Notifies the selected person and responsible company administrators through the verified notice and email queue. Preserves all other people, classes, holdings and officers. Never invent ownership, submit a tax number, create a setup request or approve personal sharing. Use the native reviewed person form.

POST/api/v1/accounting/personalTax.shareholder.addPerson

Permissions

accounting:readaccounting:writeaccounting:admin

Who can call it

admin, finance, contributor, accountant

Retries

Idempotency key required

MCP

Not offered over MCP: Saving another verified person's shareholder details requires fresh administrator access in the explicitly selected company and accounting:admin OAuth consent. A broad personal-action role policy never grants that company permission.

Reaches outside Oatmilk

It emails people or calls another service.

Fields

  • organizationIdstringRequired

    The company to work in, for people who belong to more than one. API keys belong to one company.

    1–200 characters

  • ownerUserIdstringRequired

    1–200 characters

  • existingHolderIdstring

    Matches ^[a-z0-9][a-z0-9-]{7,39}$

  • holderobjectRequired

    No other fields

  • expectedRegisterRevisionintegerRequired

    The related record's current revision, from the last time you read it.

    0 to 1000000000

  • expectedAssociationFingerprintstringRequired

    SHA-256 hash as 64 lowercase hex characters

  • idempotencyKeystringRequired

    Any unique text you generate once per intended change, so a retried request only happens once. Send it as the Idempotency-Key header instead if you prefer; if you send both they must match.

    8–200 characters

Example

curl https://app.getoatmilk.com/api/v1/accounting/personalTax.shareholder.addPerson \
  -H "Authorization: Bearer $OATMILK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "organizationId": "example",
  "ownerUserId": "example",
  "holder": {
    "legalName": "Synthetic Ventures Inc.",
    "email": "finance@example.com",
    "residency": "canada",
    "address": {
      "line1": "example",
      "line2": "example",
      "city": "example",
      "region": "example",
      "postalCode": "example",
      "country": "CA"
    }
  },
  "expectedRegisterRevision": 3,
  "expectedAssociationFingerprint": "9f2b5c1d7e3a4b6c8d0e2f4a6b8c0d2e4f6a8b0c2d4e6f8a0b2c4d6e8f0a2b4c"
}'
Response
{
  "data": { … }
}

Try it

Try it

Checks your input with this action’s real schema and answers like the API, with synthetic data. No key needed, and nothing changes.

POST/api/v1/accounting/personalTax.shareholder.addPerson
curl https://app.getoatmilk.com/api/v1/accounting/personalTax.shareholder.addPerson \
  -H "Authorization: Bearer $OATMILK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "organizationId": "example",
  "ownerUserId": "example",
  "holder": {
    "legalName": "Synthetic Ventures Inc.",
    "email": "finance@example.com",
    "residency": "canada",
    "address": {
      "line1": "example",
      "line2": "example",
      "city": "example",
      "region": "example",
      "postalCode": "example",
      "country": "CA"
    }
  },
  "expectedRegisterRevision": 3,
  "expectedAssociationFingerprint": "9f2b5c1d7e3a4b6c8d0e2f4a6b8c0d2e4f6a8b0c2d4e6f8a0b2c4d6e8f0a2b4c"
}'

More in Personal tax details.