Create Intake Ticket
POST/api/support/intake/tickets
Opens a ticket on the production desk for a person on your environment. The requester is the address in X-Support-Requester-Email — attached to the SKU.io account holding it when one does, and carried as an address and name when none does. The ticket lands on the tenant your origin tenant maps to (none, for an internal test account), is created open with SLA due dates from the policy for its priority, and the request body becomes its first public message.
Called by another SKU environment (beta, demo, dev) on behalf of its users: authenticate with that environment's intake token and the origin headers described below — not with a Personal Access Token or a session.
The ticket is stamped with where it came from: environment (beta, demo or dev), origin_tenant_id, and origin_host from X-Support-Origin-Host; its source is intake.
Request body — send as multipart/form-data when including files
subject(required, string, max 255)body(required, string, max 65000) — becomes the opening messagetype(optional, string) — one of: bug, question, feature_request, billingpriority(optional, string, defaultmedium) — one of: low, medium, high, urgentvisibility(optional, string, defaulttenant) —tenant(everyone at the company sees it) orrequester(only the requester, plus participants and agents)context(optional, object) — where the ticket was raised from. A fixed schema; unknown keys are dropped:context.route(string, max 255),context.url(string, max 2048) — the pagecontext.record_type(string, max 100),context.record_id(string, 1-64 characters: letters, digits,_,-) — the record on that page. A recognisedrecord_type(for examplesales_order,purchase_order,product,customer,inbound_shipment) adds arecordlink to the ticket automaticallycontext.browser(string, max 512),context.viewport("WIDTHxHEIGHT"or{width, height}),context.build(string, max 120)context.tenant_id(string, max 100),context.pod(string, max 100),context.user({id, email, name})context.recent_errors[](array, max 10) — each{at (max 40), method (max 10), url (max 2048), status (100-599), message (max 1000)}context.sentry_event_ids[](array, max 20, each max 64 characters)context.breadcrumbs[](array, max 200) — the trail of what the person did just before opening the ticket, oldest first. Each entry is{t (string, max 40 — when it happened), kind (required, one ofroute,click,xhr,error), label (string, max 200), detail (string, max 200, optional)}. Unknown keys are dropped, an unrecognisedkindis rejected, and when more than 200 entries survive cleaning the newest 200 are keptcontext.screenshot_attachment_id(integer, nullable),context.screenshot(boolean)context.origin_hostis set from theX-Support-Origin-Hostheader; anything you send in it is replaced
cc[](optional, array, max 20 emails) — additional people to notify on repliesattachments[](optional, array of files, max 10, each up to the desk's attachment size limit)
The response is the new ticket, identical to the production customer response plus the three origin fields.
Authentication: the environment token as Authorization: Bearer, plus the X-Support-* identity headers described on the Intake folder. There is no session and no tenant context. An unknown token, or a token presented with another environment, is refused with 403; incomplete identity headers are 422.
Request
Responses
- 201
- 401
- 403
- 422
- 429
Created
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden
Response Headers
Unprocessable Content
Response Headers
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.