Notes & attachments
Two Fields, Rendered Twice
Never copy summary into description
summary is required and capped at 500 characters; description is optional and capped at 5,000. The web UI renders both as separate labelled sections, so posting identical values displays the text twice. It looks like a duplication bug and it is intentional rendering. Present two fields — Subject and Details — and send description only when it has content.
Note content comes back as HTML
Both summary and description return with markup. Strip to plain text before display in a non-HTML surface. The process form's adminNote is the exception — that one renders.
Encrypted content is supposed to come back byte for byte
Requests and notes carry two optional fields, manifest (an opaque Compact JWS) and encrypted (boolean, default false), stored and returned untouched. The sanitizer behind the HTML above does not check the flag, so on create it rewrites " to " in an encrypted problemDescription and note text, which breaks the manifest's digests. Receivers have to decode before verifying until that changes.
Spec-read on Beta and Production; rewrite observed on Development. Details in End-to-end encryption
Note types and direction: in both specifications, probed on Beta only
GET /v1/note-types lists the types a note can carry (on Beta today partner, public, escalation and status; the specification lists none, and Production's set has not been read), and creating a note takes an optional type: {code}. Read notes carry type, companyId and companyName, plus a direction that is relative to you as the reader. Three rules from the specification: the set can grow without a release, so fetch it rather than hard-coding it; a missing or unknown type does not mean public; and the type is not an access-control filter. The specification also stops requiring priority on note create. Until 2026-10-26 this was Beta-only: Production's specification gave notes only companyName and required priority. Since then Production serves the same specification as Beta, so all of it is in Production's too. Until a Production call confirms it, treat a Production note without direction as possible and keep the fallback in TSANET-2026-001.
Spec-read on both environments, 2026-10-28 (Production's spec last modified 2026-10-26); not probed on Production. Full comparison in TSANET-2026-001
Attachments are a two-party setup, and the platform stores nothing
A forward is delivered straight to the other party's registered endpoint — there is no attachment store, and no endpoint that lists files on a case. Delivery also fans out to your own registered endpoint, so an integration that only ever sends still wants one: without it every forward reports submitterStatus: CONFIG_MISSING and you keep no copy of what you sent.
Configuration is per case and readable before you act: GET …/attachments/config returns the submitter and receiver configurations, POST …/attachments/config/https/analyze proposes a normalized configuration without saving it, and PUT …/attachments/config/https registers one. Check it before offering an attachment action rather than discovering CONFIG_MISSING afterwards. Each destination gets one delivery attempt with no automatic retry (source-read; the file-sharing topic has the detail), so build the receiver so that a 2xx means durably stored.
Two things the platform will not do for you: it creates no case note announcing the file, and it keeps no history. Both are yours to build.
Full model in TSANET-2026-002
HTTP 200 on a forward does not mean delivered
The forward call answers 200 whatever happened to the file. A forward that reached neither side still returns 200, with the failure in the body. Read completeSuccess and the per-side submitterStatus and receiverStatus, and never treat the status code as the outcome.
Source-read on both environments
Alpha: a direct-storage receiver refuses the relay
The receiver can register its own storage for Attachment V2. The file then goes straight from sender to storage under a short-lived grant and never passes through TSANet. When the receiver has done that, the v1 forward above can return 409 attachment-direct-path-required, and the sender has to use the V2 grant flow instead. V2 also adds an alpha listing of a case's grants, the first time the platform can enumerate attachment activity on a case. Until 2026-10-26 all of this was in Beta's specification only. Production's specification now carries it too, with every V2 operation still marked alpha, so its shape can change without a deprecation clock. Don't build a production flow on it yet, and handle the 409 wherever you forward attachments.
Spec-read on both environments, 2026-10-28; V2 exercised on Beta only (see Connect SDK), not probed on Production. The Java client's V2 support is described on Connect SDK
Where the reference and the platform disagree
The earlier drift is fixed: the GitBook reference now shows the forward call's description in the multipart/form-data body, required and capped at 500 characters, as the specification does. Two newer drifts ran the other way, with the reference ahead of what was deployed. The first still holds; the second has closed in the specification but is unprobed on Production.
- Secret rotation. The reference documents
POST /v1/webhooks/{id}/secretas a working rotation call, and the v3.2.1 changelog lists it as new. No implementation is behind it. Beta answers 501 with an empty body (probed). See Webhooks for what to do instead. - v2 webhook options. The reference's webhooks-v2 page shows
caseDirectionsandOAUTH2_CLIENT_CREDENTIALS. On 2026-10-20 both were on Beta only. Since 2026-10-26 Production's specification carries both too (spec-read 2026-10-28), so this drift has closed at the specification level. Production has not been probed.
GitBook pages fetched 2026-10-20; compared with openapi.yaml as Production and Beta serve it, re-read 2026-10-28
Note-visibility modelling across three audiences: Zendesk → Note visibility