The message routes take HTML only; there is no attachment field. To include a file:
getOrganizationUploadUrl, then createAssetItem), or with the MCP server's upload_attachment and attach_uploaded_file tools.<p><a href="https://media.devstride.com/…/invoice.pdf">invoice.pdf</a></p>.The ticket's conversation shows it as a link, exactly as attachments on an emailed reply appear.
How a partner that owns the customer's inbox and portal uses everything together:
Customer emails your support address
└─ your processor → POST /service-desk/requests (sentAt, externalId)
└─ DevStride opens the ticket, starts SLA clocks
└─ webhook item.created → your systems
Staff reply in DevStride (or your tool → POST …/staff-replies)
└─ webhook comment.created (visibility public, commentId) → your tool
└─ your tool emails the customer
└─ POST /service-desk/comments/{commentId}/delivery-receipt (sent | failed)
└─ staff see "Delivered by your support tool" under the reply
Customer replies to your email
└─ your processor → POST …/items/{itemNumber}/requester-replies (sentAt, externalId)
└─ next-response clock restarts; webhook comment.created → your systems
Your portal shows the ticket
└─ GET /work-items/{itemNumber}?includeCustomerStatus=true
└─ GET /item-comments?itemNumber=…&visibility=public
Use the externalId of each message in your own system on every write, so a retry never posts twice.
Reading Tickets and Threads
Show customers their tickets in your own portal: the customer-visible conversation, the status label they would see, and ticket lists by requester or company.
Overview
The developer guide's path from a Mac with nothing on it to your first merged story: what you will have at the end, how long it takes, and where you are needed.