1. Support
  2. Submit a Support Request

Support

Submit a Support Request

POST
`/v1/support`

Submits a support request and returns the resulting record. Requires authentication, but no particular permission.

A request is a subject and a plain-text message. The email PackageX sends is formatted for you, so you do not need to supply HTML.

reply_to string (required)
Where support should reply. Always send the address that should receive the answer.
subject string (required)
Up to 512 characters.
body string (required)
The message, as plain text. Up to 50,000 characters. Line breaks are preserved.
attachments string[] (optional)
Up to 10 object_path values from the upload step below.
categories string[] (optional)
Up to 10 labels for grouping requests in delivery reporting.
sandbox boolean (optional)
Validate without delivering. Defaults to false.

There is no to, cc, bcc, from or from_name. A support request always comes from PackageX and always goes to PackageX support, so neither end is yours to set. reply_to is the one address you control.

Attaching files

POST
`/v1/support/attachments`

Files are uploaded directly to storage rather than being sent through this API, so a large screen recording is not limited by request or email size.

filename string (required)
The name the support agent sees. Cannot contain path separators.
content_type string (optional)
The file's content type, such as video/mp4.
size_bytes number (optional)
File size. Up to 500MB.

The response returns an object_path, an upload_url and a required_headers map. Upload the file to that URL with a PUT, then pass the object_path in attachments when you submit the request. The upload URL is valid for one hour, and we confirm the file actually arrived when you submit.

The response also returns required_headers. Send every one of them on your PUT, exactly as given, including x-goog-content-length-range even for a small file. They are signed into the upload URL, so a request that omits one is rejected with a 403 signature error rather than a helpful message. Files larger than 500MB are rejected either by the upload itself or when you submit the request.

        # 1. Request an upload slot
curl -X POST https://api.packagex.io/v1/support/attachments \
  -H "x-api-key: $PX_API_KEY" -H "Content-Type: application/json" \
  -d '{ "filename": "screen-recording.mp4", "content_type": "video/mp4" }'

# 2. Upload the file to the returned upload_url
curl -X PUT "$UPLOAD_URL" --upload-file screen-recording.mp4 \
  -H "Content-Type: video/mp4" \
  -H "x-goog-content-length-range: 0,524288000"

# 3. Submit the request
curl -X POST https://api.packagex.io/v1/support \
  -H "x-api-key: $PX_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "reply_to": "requester@customer.example",
    "subject": "App crashes when scanning a label",
    "body": "It closes as soon as the camera opens. Recording attached.",
    "attachments": ["support-emails/org_1a2b3c/sup_att_a1b2c3/screen-recording.mp4"]
  }'

      

Attached files appear in the delivered email as links, which stay valid for 90 days. They download rather than open in the browser, and anyone holding the link can use it within that window.

Errors

400
The request was invalid: a missing subject or body, or an attachment that was never uploaded.
401
Not authenticated.
429
Too many requests. data.retry_after_ms indicates how long to wait.
502
The request could not be handed off for delivery. Safe to retry.

A rejected request is still recorded, with a failed status and the reason in errors.