Intake Upload Links

Generate, list, and revoke shareable upload links for non-technical customers.

Intake upload links let operators create shareable URLs that grant drag-and-drop file upload access to non-technical customers. The link token is the authentication - no API key is exposed to the customer.

Endpoints

Method
Path
Description

POST

/v1/{workspace_id}/intake/links

Create an upload link

GET

/v1/{workspace_id}/intake/links

List upload links

DELETE

/v1/{workspace_id}/intake/links/{link_id}

Revoke an upload link

GET

/v1/{workspace_id}/intake/links/{link_id}/uploads

List uploads for a link

POST /v1/{workspace_id}/intake/links

Generates a new shareable upload link for a customer.

Request Body

Field
Type
Required
Default
Description

customer_slug

string

Yes

-

Customer identifier (slug format)

display_name

string

No

null

Display name shown on the upload page

expires_in_hours

integer

No

168

Hours until the link expires (1-720)

max_uploads

integer

No

100

Maximum number of files that can be uploaded via this link (1-10,000)

Response (201 Created)

Field
Type
Description

id

string (uuid)

Link ID

workspace_id

string (uuid)

Workspace the link belongs to

customer_slug

string

Customer identifier

display_name

string or null

Display name

upload_url

string

Relative URL for the upload page

link_token

string

The token embedded in the upload URL

status

string

One of: active, expired, revoked, exhausted

created_at

string (datetime)

When the link was created

expires_at

string (datetime)

When the link expires

revoked_at

string (datetime) or null

When the link was revoked, if applicable

max_uploads

integer

Maximum upload count

upload_count

integer

Number of files uploaded so far

last_upload_at

string (datetime) or null

When the last file was uploaded

Example

GET /v1/{workspace_id}/intake/links

Returns upload links for the workspace. By default, only active links are returned.

Query Parameters

Parameter
Type
Default
Description

include_expired

boolean

false

Include expired, revoked, and exhausted links

Response (200 OK)

Array of link objects (same schema as the create response).

DELETE /v1/{workspace_id}/intake/links/{link_id}

Revokes an active upload link. Customers who try to use a revoked link will see an error page.

Path Parameters

Parameter
Type
Description

link_id

string (uuid)

The link to revoke

Response

204 No Content on success. Returns 404 if the link does not exist or is already revoked.

GET /v1/{workspace_id}/intake/links/{link_id}/uploads

Returns files uploaded through a specific link.

Path Parameters

Parameter
Type
Description

link_id

string (uuid)

The link to query

Response (200 OK)

Array of upload objects:

Field
Type
Description

id

string (uuid)

Upload ID

customer_slug

string

Customer identifier

filename

string

Original filename

content_type

string

MIME type of the uploaded file

sha256

string

SHA-256 hash of the file contents

size_bytes

integer

File size in bytes

received_at

string (datetime)

When the file was received

scan_status

string

One of: skipped, pending, clean, infected

Download an Upload

GET /v1/{workspace_id}/intake/links/{link_id}/uploads/{upload_id}/download

Returns the raw file bytes with a Content-Disposition: attachment header. The download is scoped through the intake link - only uploads visible on the corresponding upload listing can be downloaded. If the upload or the underlying file no longer exists, the endpoint returns 404.

Downloads are logged as PHI access events in the audit trail. The response includes Cache-Control: private, no-store and X-Content-Type-Options: nosniff headers.

Status
Description

200

File bytes with original content type and filename

404

Link, upload, or underlying file not found

502

Storage backend unavailable

Public Upload Page

The upload page is served at the upload_url returned when creating a link. This page is publicly accessible (no authentication required) and provides:

  • Drag-and-drop file upload

  • Click-to-browse file selection

  • Upload progress indicators

  • Client-side file type and size validation

Upload Endpoint

POST /upload/{link_token}/files

This endpoint is called by the upload page. It accepts the file as the raw request body with metadata in headers.

Request Headers

Header
Required
Description

x-amigo-intake-filename

Yes

Original filename

x-amigo-intake-content-type

Yes

MIME type of the file

Content-Length

No

File size (validated against the 100 MB limit)

Supported File Types

  • application/pdf

  • text/csv

  • image/jpeg

  • image/png

  • application/msword

  • application/vnd.openxmlformats-officedocument.wordprocessingml.document

  • application/vnd.ms-powerpoint

  • application/vnd.openxmlformats-officedocument.presentationml.presentation

Maximum file size: 100 MB. Files are validated against their declared content type using magic byte detection - if the file content does not match the declared type, the upload is rejected with a 422.

Response (201 Created)

When an uploaded file has the same content hash as a previously uploaded file in the same workspace, duplicate_of contains an object with the original upload's id and received_at. The duplicate file is still accepted and stored - this is informational only.

Error Responses

Status
Description

400

Invalid link token

404

Link not found or revoked

410

Link expired

413

File exceeds 100 MB limit

422

Invalid filename or unsupported content type

429

Rate limited or upload limit reached

503

Upload service not configured

Status
Description

active

Link is valid and accepting uploads

expired

The expiration time has passed

revoked

An operator revoked the link

exhausted

The maximum upload count has been reached

Last updated

Was this helpful?