Hub / Design Docs / TSANET-2026-002
TSANET-2026-002 DRAFT

Case attachments and the direct-push model

File transfer on TSANet Connect is a direct push between members: the platform brokers the exchange but never stores the file. That single design choice determines everything an integrator has to build, and it is the reason attachments require setup on both sides before they work at all. This document specifies the model, the responsibilities it leaves to the connector, and what to expect while enablement is still rolling out.

Date2026-09-13
Version0.3
AudienceMember integrators
Verified againstConnect API OpenAPI spec — the published attachment surface

1The model in one paragraph

When a member forwards a file, the platform looks up the other party's registered storage endpoint and delivers the bytes straight to it. TSANet Connect does not keep a copy. There is no attachment store to read from later, and no server-side endpoint that lists the files on a case — if your integration needs a history, it keeps its own.

Consequence Attachments are not a feature you enable in your own connector alone. The receiving side must have somewhere for files to land, registered in advance. Until that exists for a given member, forwards to them cannot succeed.

The design guidance around this model — the sending paths, the receiver patterns, and the operational decisions a receiving member has to make — is the subject of the companion topic page, Moving files between members. This document stays at the specification level.

Related The case every endpoint here hangs off, and the token that scopes them, are specified in TSANET-2026-001. Behavioural guidance is on Working with the Connect API.

2The four endpoints

EndpointPurpose
GET .../attachments/configRead the attachment configuration for the case — returns a submitter and a receiver config
POST .../attachments/config/https/analyzeSubmit arbitrary JSON and get a proposed normalized configuration back without saving it
PUT .../attachments/config/httpsRegister or update the caller's normalized HTTPS receive configuration for the case
POST .../attachmentsForward files — multipart, with a description and a file array

All four are scoped to a collaboration request by token: this is the per-case layer. The baseline receiving configuration is registered per member with TSANet at onboarding (see the constraint in 2.1 and the companion topic); a token-scoped registration overrides it for that one case.

2.1 What a receive configuration declares

The normalized HTTPS configuration requires domain, httpsPort, httpsPath, password and an expiration. In other words: where to deliver, on what port and path, with what credential, valid until when. Anything you register has to be an endpoint you actually operate and can receive on.

Constraint Registering a receive configuration is not the same as being enabled. Enablement is arranged with TSANet during connector onboarding, and involves your own IT because it means standing up a reachable endpoint. Start that conversation early — it is the long pole, not the code.

3Delivery reaches both parties

A forward is not one delivery, it is two. The result object reports a receiverStatus and a submitterStatus, along with completeSuccess when both landed and partialSuccess when exactly one did. The sending member gets a copy of what they sent, delivered to their own registered endpoint.

Constraint If you send files but have never registered a receive configuration of your own, every forward you make will report submitterStatus: CONFIG_MISSING. Nothing is broken — but you are keeping no copy of what you sent. Registering a receive endpoint is worth doing even for an integration that only ever sends.

3.1 Per-file statuses

Each file in a forward carries its own status on each side, drawn from a fixed set:

StatusMeaning for that side
SUCCESSDelivered
CONFIG_MISSINGThat party has no registered receive configuration
CONFIG_INVALIDA configuration exists but is not usable
FORWARD_FAILEDDelivery was attempted and did not succeed
CONTENT_ERRORThe file itself could not be processed
UNKNOWNOutcome could not be determined

Treat partialSuccess as a first-class outcome in your UI rather than folding it into success or failure. An engineer who sees "sent" when only one side received the file will find out later, in the worst way.

Your connector forward: files + description Connect API stores nothing writes no case note Partner's endpoint receiverStatus Your own endpoint CONFIG_MISSING?
Figure 1 — One forward, two deliveries. If your own receive endpoint is unregistered, the lower path reports CONFIG_MISSING and you keep no copy of what you sent.

4What the platform does not do for you

Two responsibilities sit with the connector, and both are easy to assume are handled.

4.1 No case note is created

Forwarding a file does not add anything to the case timeline. If an engineer on the other side should know a file arrived, your connector has to post the note saying so. The description you send with the forward is not what surfaces it.

4.2 No attachment history is kept

There is no endpoint that lists the files previously forwarded on a case, because there is nothing server-side holding them. Any "attachments on this case" view is something your integration maintains from its own record of what it sent and received.

Documentation drift The published API reference currently shows description as a query parameter on the forward call. In the canonical specification it is part of the multipart form and is required, with a maximum length of 500. Where the reference and the specification disagree, the specification is authoritative — this is worth checking against a live call before you build around either.

5Current state and planning guidance

Attachment receive capability is being rolled out per member rather than switched on platform-wide, and members are at different stages. Common storage arrangements — object storage in the member's own cloud account being the usual shape — are converging, so a member coming to this now should ask TSANet what the current recommended arrangement is rather than designing one from scratch.

Practical guidance while that continues:

6Revision history

VersionDateChange
0.32026-09-13Add the Verified against cell in place of a second status cell; state that token-scoped configuration is the per-case override over the per-member registration; cross-reference TSANET-2026-001.
0.22026-08-25Cross-link the companion topic page (Moving files between members), which carries the design guidance around this specification.
0.12026-08-15Initial draft covering the published attachment surface and the connector-side responsibilities it implies.