Developers › API reference › User-defined fields

PUT /api/v1/udf/{table}/records/{key}

Set user-defined values of one record (If-Match).

  • Scope reference:write
  • If-Match
  • operationId referenceSetUdfValues

The token needs the scope reference:write, and the person or service account behind it needs the matching privileges and account permissions, exactly as on the screens. See Scopes.

If-Match. Send If-Match with the ETag of your latest GET. If someone changed the resource since, you get 412 precondition_failed and nothing changes: GET it again, re-apply your change and retry.

Request

PUT /api/v1/udf/{table}/records/{key}

Path parameters

NameDescriptionExample
tableThe reference table: securities, issuers, accounts, account_groups, brokers, models, benchmarks, desks or list_entries.securities
keyThe record's key (a symbol, an account code…).AAPL

Headers

HeaderRequiredValue
AuthorizationyesBearer <token>: an OAuth access token (vat_…) or a personal access token (vpt_…). Get a token
If-MatchyesThe ETag of your latest GET of this resource. ETags
Content-Typeyesapplication/json

Body: UdfValuesIn

FieldTypeRequiredDescription
valuesobjectyesValues by field name (or udf_N); null clears one.

Decimals (money, prices, quantities, percentages) are sent as strings, ids as strings, times as ISO 8601 UTC.

Examples

Keep the token in an environment variable (VESTORIS_TOKEN), never in the script.

curl

curl -X PUT "https://vestoris.com/api/v1/udf/securities/records/AAPL" \
  -H "Authorization: Bearer $VESTORIS_TOKEN" \
  -H 'If-Match: "3f1a9c0e5b7d2a4c8e6f0b1d3a5c7e9f"' \
  -H "Content-Type: application/json" \
  -d '{"values":{"Internal rating":"BB"}}'

Python (requests)

import os, requests

r = requests.put(
    "https://vestoris.com/api/v1/udf/securities/records/AAPL",
    headers={
        "Authorization": f"Bearer {os.environ['VESTORIS_TOKEN']}",
        "If-Match": "\"3f1a9c0e5b7d2a4c8e6f0b1d3a5c7e9f\"",
    },
    json={
        "values": {
            "Internal rating": "BB"
        }
    },
    timeout=30,
)
r.raise_for_status()  # errors are application/problem+json with a stable "code"
print(r.json())

JavaScript (fetch)

const res = await fetch("https://vestoris.com/api/v1/udf/securities/records/AAPL", {
  method: "PUT",
  headers: {
    Authorization: `Bearer ${process.env.VESTORIS_TOKEN}`,
    "If-Match": "\"3f1a9c0e5b7d2a4c8e6f0b1d3a5c7e9f\"",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "values": {
          "Internal rating": "BB"
      }
  }),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.code}: ${data.detail}`); // problem+json
console.log(data);

Response

200 OK, application/json: UdfValues. With an ETag header. Rate-limit headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset.

Response fields
FieldTypeDescription
tablestringThe reference table: securities, issuers, accounts, account_groups, brokers, models, benchmarks, desks, list_entries.
keystringThe record's natural key (e.g. a symbol or account code).
valuesobjectValues by field name.

Example response

HTTP/1.1 200 OK
Content-Type: application/json
ETag: "3f1a9c0e5b7d2a4c8e6f0b1d3a5c7e9f"

{
    "table": "securities",
    "key": "AAPL",
    "values": {
        "Internal rating": "BB"
    }
}

Example values. Your values depend on your firm's data; prices, orders and fills are simulated.

Status codes and errors

Errors are application/problem+json (RFC 9457) with a stable code to program against; the detail says what to fix. See Errors.

StatusWhenProblem codes
200Success
400The request is malformedinvalid_request invalid_json
401No token, or it is invalid or expiredinvalid_token
403The token lacks the scope, or the person or service account behind it lacks the privilege or account permissioninsufficient_scope forbidden ip_not_allowed
404Not found, or not visible to you (the API never confirms what you may not see)not_found
409Not possible in the current stateinvalid_transition conflict
412The resource changed since your GET: get it again and retry with the new ETagprecondition_failed
422Validation failed (the detail says which field), or blockedvalidation_failed
428A required header is missingprecondition_required
429Rate limited: wait for Retry-After secondsrate_limited
{
    "type": "https://vestoris.com/developers/errors#validation_failed",
    "title": "Validation failed",
    "status": 422,
    "detail": "Quantity must be greater than zero.",
    "code": "validation_failed",
    "instance": "/api/v1/udf/securities/records/AAPL"
}

On the screens

The same thing in the app is explained in: