Hub / Topics / File sharing

Moving Files Between Members

A file attached to a collaboration case is delivered into the receiving member's own file store — not parked on a portal for someone to fetch. The sender never learns how the receiver stores files, and that one-way ignorance is what makes the system extensible: each member registers how they receive, once, and every partner can send to them without changing anything.

Topic Case attachments Grounded in The live normalized method + the API Audience Members planning file exchange Updated 2026-10-20

The reframe

A Conduit, Not a Drive

It is tempting to picture case attachments as uploads to a shared workspace: the file goes up, and the partner comes to get it. The platform does the opposite. Attaching a file to a collaboration case triggers a delivery — TSANet takes the file and pushes it into the file store the receiving member registered, using that member's own transfer method and credentials. Partner engineers find the file where they already work, not on a second website.

The API is honest about this: there is a call to attach files to a case and calls to manage receiving configuration, and no download endpoint at all. A file, once attached, has exactly one direction of travel — outward, into the parties' stores.

Sending member connector · SDK · REST TSANet Connect delivers per receiver config Receiving member their own file store attach on the case push, member's method copy to the sender's own store, when one is registered
Delivery fans out to the registered stores of both parties on the case — the sender's own store receives a copy of what it sends. Useful for audit, surprising if you did not plan for it.
Attaching a file does thisWhich means
Delivers into the receiver's registered storeThe partner's engineers get the file in their own tooling. There is no portal step and no second login.
Reports the delivery outcome to the callerThe sender learns whether each destination succeeded, in the response body. The HTTP status is 200 whatever happened, so read completeSuccess and the per-side statuses. Nobody else is told automatically.
Creates no case note by itselfAnnouncing the file on the case is the connector's job — see sharp edges.

The sending side

One Call, Three Ways to Make It

Sending is a single API call on the collaboration case: attach one or more files (multipart, with a required description of up to 500 characters in the form body) to the case token you already hold. The platform resolves the receiving side's configuration and does the rest. The official reference is the case attachments documentation.

Delivery is per destination: with two configured stores on a case, each gets its own attempt and the response distinguishes complete from partial success. There is one attempt per destination — no automatic retries (source-read, not probed on this hub) — so a failure is loud for the caller and invisible to everyone else until someone acts on it. "Loud" means the response body: the call answers 200 either way, so a caller that checks only the status code hears nothing.

In development: direct-to-storage delivery (alpha). Both environments' specifications also carry Attachment V2: Beta's first, Production's since 2026-10-26 (spec-read 2026-10-28). The receiver registers its own storage (S3, Azure Blob, or Google Cloud Storage per the specification), and the sender gets a short-lived grant to upload straight into it, so the bytes never pass through TSANet. The conduit model above still holds: nothing comes to rest on the platform. Every V2 operation is still marked alpha, and it has been exercised on Beta only, never on Production. A receiver that has registered V2 storage can refuse the relay call with 409 attachment-direct-path-required. The Connect SDK already carries a V2 client, and TSANET-2026-002 §5.1 has the specification-level summary. Don't build production flows on it yet.

The receiving side

Register How You Receive

Each member registers a receiving configuration with TSANet — per company, set up during onboarding, with per-case overrides possible. The baseline method, live in production today, is the normalized HTTPS push: five fields of configuration, and one request shape your endpoint must answer.

{
  "domain":    "files.example-member.com",
  "httpsPort": 443,
  "httpsPath": "/tsanet/uploads",
  "password":  "<pre-shared secret>",
  "expiration": "2027-01-01T00:00:00Z"
}

With that registered, every case file arrives at your endpoint as:

PUT https://files.example-member.com:443/tsanet/uploads/<fileName>
Authorization: Basic base64(<caseNumber>:<password>)   ← case correlation rides here
Content-Type: <the file's own media type>

<raw file bytes>                                      ← not multipart

Anything that answers this request qualifies as a receiver — it is an afternoon of work in any stack, and a small ingest service in front of object storage (S3, Azure Files, or similar) is the common pattern. Any 2xx you return counts as delivered, which is a sharper contract than it looks: see sharp edges.

When your store cannot answer a PUT. Members with an established file repository that has its own upload protocol do not have to bolt an endpoint onto it — TSANet can implement a member-specific delivery method against the repository's existing interface, configured platform-side. The normalized method is the default; member-specific methods are how established repositories join without changing. They are arranged with TSANet rather than exposed on the API — outside the alpha V2 operations, the published surface registers only the normalized HTTPS configuration. Member-registered storage is coming through Attachment V2, which is alpha in both environments' specifications and exercised on Beta only (see Sending). If yours is in that camp, start the conversation with what your store's upload interface looks like.

Designing yours

The Five Decisions Every Receiving Member Makes

Whichever method you land on, the same five questions decide whether file exchange works quietly for years or generates a support thread a month. They are worth answering in writing before the first test file moves.

DecisionThe questionWhy it bites
Authentication & rotationWhat credential does TSANet hold to reach your store, who rotates it, and how is rotation communicated ahead of time?The configuration declares an expiration. A credential that silently dies makes its first appearance as a failed delivery on a live case.
Case correlationWhich case identifier links an arriving file to the right case, and where does it travel — auth username, upload parameter, filename, path?On the normalized method the case number is the Basic-auth username and nothing else identifies the case. If your ingest drops it, you own a pile of orphaned files.
Filenames & collisionsWhat characters do you accept, and what happens when the same name arrives twice — overwrite, version, or reject?Receivers differ on this today, and silent overwrite is a common object-storage default. Whatever you choose, engineers on both sides should not have to guess.
Size & limitsWhat is your maximum file size and write timeout?Support archives are large. A limit nobody wrote down becomes a mid-transfer failure on the day it matters.
Arrival notificationDoes your system tell the case owner a file landed, or is the case note the only announcement?The platform does not create the note. If neither your store nor your connector announces arrivals, files land in silence.

Sharp edges

What Goes Wrong, in the Order You Will Meet It

Questions about a store or method not covered here — or a repository with an upload interface you think should be supported — belong in Community. The case attachments reference is the authoritative contract, and design doc TSANET-2026-002 specifies the direct-push model, the config endpoints and the per-file delivery statuses in full; this page is the design guidance around both.