Documentation

Field Types & Validation

The type and format each field expects, what the API accepts, and how validation errors are reported.

Every write endpoint type-checks its request body before anything is saved. A field with the wrong type is rejected with 400 and a message naming the field, what it expected, and what you actually sent - the whole request fails, so you never end up with a half-written record.

{
  "error": "Invalid request body",
  "details": [
    "'track' must be a whole number (received the string \"Main Stage\").",
    "'date' is not a real calendar date (received the string \"2026-02-30\")."
  ]
}

Fields to check before your first write

Most fields are plain text. These few take a number or a particular format, so they are worth confirming when you build your payload.

Field Object Type What it actually is
track session integer The position of the track in your event’s track list, counting from 0. Put the stage or room name in location.
tintColor session integer The session colour. Send a hex string such as "#3366FF", or a 32-bit ARGB integer if you already have one (4294967295 is white).
tier sponsor integer The position of the tier in your event’s sponsor-tier list, counting from 0. Tier names are set under Event Settings.
tags session, speaker string One tag, or several separated by commas. An array is accepted too.
representativeEmails sponsor string One address, or several separated by commas. An array is accepted too.
ticketRedemption session string The ticket tier that can be redeemed at this session. Leave empty for none.

Accepted formats

The API is deliberately forgiving where the intent is unambiguous, so you rarely have to match the internal storage format exactly.

Type Accepted Stored as
integer 150, "150" 150 - decimals and non-numeric strings are rejected
boolean true, "true", "yes", 1 / false, "false", "no", 0 true / false
colour 4281558783, "#3366FF", "#FF3366FF", "0xFF3366FF" ARGB integer - a 6-digit hex gets a fully opaque alpha
tag list "ai, keynote" or ["ai", "keynote"] "ai, keynote" - trimmed, blanks dropped, duplicates removed
email list "[email protected], [email protected]" or ["[email protected]", "[email protected]"] "[email protected],[email protected]" - each address is validated
email " [email protected] " "[email protected]" - trimmed and lowercased
date "2026-09-14" Same. Must be a real calendar date; "" clears it
time "09:00", "9:00" "09:00" - 24-hour; "" clears it
rich text Delta JSON string, or plain text Same - malformed Delta JSON is rejected. See Rich Text Format

Two more rules worth knowing:

  • Omitted means unchanged. On an edit, only the fields you send are written. To clear a field send "", 0, or false - not null, which is rejected.
  • The body must be a JSON object. Send Content-Type: application/json. A bare string or array is rejected with 400.

Warnings and ignored fields

Not everything that looks wrong is fatal. When a write succeeds but something is worth a second look, the 200 response carries extra keys:

Key Meaning
warnings The value was saved, but probably isn’t what you meant - a link that isn’t an absolute http(s) URL, or a timeEnd before its timeStart.
ignoredFields Body keys that are not writable on that endpoint and were dropped. Near-misses get a suggestion, e.g. "unlisted (did you mean 'unListed'?)".
{
  "status": "success",
  "sessionId": "aB3xY...",
  "created": true,
  "warnings": ["'handOutLink' does not look like an absolute http(s) URL (\"www.example.com/deck.pdf\"); it may not open as a link in the app or website widgets."],
  "ignoredFields": ["speakers", "unlisted (did you mean 'unListed'?)"]
}

Both keys are omitted entirely when there is nothing to report, so a clean request gets the same response shape it always did. ignoredFields is the quickest way to catch a read-modify-write loop that is sending back fields the API derives itself - a session’s speakers array, for example, is built from its content sections and can’t be set directly.

Cloudflare vs. the API

api.event-vault.com sits behind Cloudflare, which rejects unrecognised user agents before the request reaches the API. Always send a normal User-Agent header.

Tell the two apart by the response body: a 403 with a JSON body is a genuine permission or scope failure from the API; a 403 with an HTML body or an error code: 1010 is Cloudflare.