Hoppa till innehållet

Tickets

Support cases the customer opens from their own pages, with the message thread and attachments. Cases land in the same queue as those created inside the ERP and from the support mailbox.

7 calls GET POST PATCH Base URL https://api.erp.fluit.cloud/ecom

Authentication, error codes, rate limits, idempotency and pagination apply to every call and are documented once under Getting started.

GET /portal/tickets

List tickets

Returns the authenticated contact's tickets. Contacts with the ViewAllTickets permission see every ticket belonging to their company.

Query parameters

Field Type
page integer
pageSize integer
status string
openOnly boolean
search string

Responses

200 PortalTicketListResponse
Field Type
items PortalTicketSummary[] · nullable
page integer
pageSize integer
seesAllCompanyTickets boolean
totalCount integer
429 Rate limit exceeded. Wait the number of seconds given in Retry-After. The body is problem-shaped application/json, not application/problem+json. This API sends no X-RateLimit-* headers — the quota is discovered here.
  • Retry-After — Seconds to wait before retrying.

Standard errors: 401 403 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/ecom/portal/tickets" \
  -H "Authorization: Bearer $SESSION_TOKEN" \
  -H "X-Tenant-Id: $FLUIT_TENANT_ID" \
  -H "X-Channel: web"
Response 200
{
  "items": [
    {
      "attachmentCount": 42,
      "commentCount": 42,
      "createdDate": "2026-06-11T09:24:13.418",
      "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
      "lastActivityAt": "2026-06-11T09:24:13.418",
      "priority": "string",
      "reportedByContactName": "Anna Svensson",
      "status": "string",
      "ticketNumber": "TIC-2026-0104",
      "title": "string",
      "type": "string"
    }
  ],
  "page": 1,
  "pageSize": 50,
  "seesAllCompanyTickets": true,
  "totalCount": 137
}

Base URL https://api.erp.fluit.cloud/ecom. The response example is generated from the schema: the shape is right, the values are made up.

POST /portal/tickets

Create ticket

Creates a support ticket for the authenticated customer and contact. Order and order line are optional; when given they are verified against the session's customer and the item is taken from the order line.

Body required

Field Type
description string · nullable
firmwareVersion string · nullable
hardwareRevision string · nullable
orderId string(uuid) · nullable
orderLineId string(uuid) · nullable
serialNumber string · nullable
title string · nullable
type string · nullable

Responses

201 SubmitPortalTicketResponse
Field Type
ticketId string(uuid)
ticketNumber string · nullable
429 Rate limit exceeded. Wait the number of seconds given in Retry-After. The body is problem-shaped application/json, not application/problem+json. This API sends no X-RateLimit-* headers — the quota is discovered here.
  • Retry-After — Seconds to wait before retrying.

Standard errors: 400 401 403 Errors

Examples

curl
curl -X POST "https://api.erp.fluit.cloud/ecom/portal/tickets" \
  -H "Authorization: Bearer $SESSION_TOKEN" \
  -H "X-Tenant-Id: $FLUIT_TENANT_ID" \
  -H "X-Channel: web" \
  -H "Content-Type: application/json" \
  -d @body.json
Response 201
{
  "ticketId": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
  "ticketNumber": "TIC-2026-0104"
}

Base URL https://api.erp.fluit.cloud/ecom. The response example is generated from the schema: the shape is right, the values are made up.

GET /portal/tickets/{id}

Get ticket

Returns one ticket with its attachments and customer-visible messages. Internal notes are never included.

Path parameters

Field Type
id Required string(uuid)

Responses

200 PortalTicketDetail
Field Type
attachments PortalTicketAttachment[] · nullable
canReply boolean
closedAt string(date-time) · nullable
createdDate string(date-time)
description string · nullable
id string(uuid)
messages PortalTicketMessage[] · nullable
priority string · nullable
product PortalTicketProduct
reportedByContactName string · nullable
resolutionNotes string · nullable
resolvedAt string(date-time) · nullable
status string · nullable
ticketNumber string · nullable
title string · nullable
type string · nullable
429 Rate limit exceeded. Wait the number of seconds given in Retry-After. The body is problem-shaped application/json, not application/problem+json. This API sends no X-RateLimit-* headers — the quota is discovered here.
  • Retry-After — Seconds to wait before retrying.

Standard errors: 401 403 404 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/ecom/portal/tickets/{id}" \
  -H "Authorization: Bearer $SESSION_TOKEN" \
  -H "X-Tenant-Id: $FLUIT_TENANT_ID" \
  -H "X-Channel: web"
Response 200
{
  "attachments": [
    {
      "contentType": "image/jpeg",
      "createdDate": "2026-06-11T09:24:13.418",
      "fileName": "widget-a-front.jpg",
      "fileSize": 42,
      "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
    }
  ],
  "canReply": true,
  "closedAt": "2026-06-11T09:24:13.418",
  "createdDate": "2026-06-11T09:24:13.418",
  "description": "string",
  "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
  "messages": [
    {
      "authorName": "Acme AB",
      "content": "string",
      "createdDate": "2026-06-11T09:24:13.418",
      "id": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44",
      "isFromCustomer": true
    }
  ],
  "priority": "string",
  "product": {
    "firmwareVersion": "string",
    "hardwareRevision": "string",
    "itemName": "Widget A",
    "itemNumber": "WIDGET-A",
    "serialNumber": "ABC-001"
  },
  "reportedByContactName": "Anna Svensson",
  "resolutionNotes": "string",
  "resolvedAt": "2026-06-11T09:24:13.418",
  "status": "string",
  "ticketNumber": "TIC-2026-0104",
  "title": "string",
  "type": "string"
}

Base URL https://api.erp.fluit.cloud/ecom. The response example is generated from the schema: the shape is right, the values are made up.

POST /portal/tickets/{id}/attachments

Upload ticket attachment

Uploads one file to the ticket. Multipart form data with the file in the 'file' field.

Path parameters

Field Type
id Required string(uuid)

Responses

201 AddPortalTicketAttachmentResponse
Field Type
attachmentId string(uuid)
429 Rate limit exceeded. Wait the number of seconds given in Retry-After. The body is problem-shaped application/json, not application/problem+json. This API sends no X-RateLimit-* headers — the quota is discovered here.
  • Retry-After — Seconds to wait before retrying.

Standard errors: 400 401 403 404 Errors

Examples

curl
curl -X POST "https://api.erp.fluit.cloud/ecom/portal/tickets/{id}/attachments" \
  -H "Authorization: Bearer $SESSION_TOKEN" \
  -H "X-Tenant-Id: $FLUIT_TENANT_ID" \
  -H "X-Channel: web" \
  -H "Content-Type: application/json" \
  -d @body.json
Response 201
{
  "attachmentId": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
}

Base URL https://api.erp.fluit.cloud/ecom. The response example is generated from the schema: the shape is right, the values are made up.

GET /portal/tickets/{id}/attachments/{attachmentId}

Download ticket attachment

Downloads one attachment from a ticket the contact is allowed to see.

Path parameters

Field Type
id Required string(uuid)
attachmentId Required string(uuid)

Responses

200 Empty body.
429 Rate limit exceeded. Wait the number of seconds given in Retry-After. The body is problem-shaped application/json, not application/problem+json. This API sends no X-RateLimit-* headers — the quota is discovered here.
  • Retry-After — Seconds to wait before retrying.

Standard errors: 401 403 404 Errors

Examples

curl
curl "https://api.erp.fluit.cloud/ecom/portal/tickets/{id}/attachments/{attachmentId}" \
  -H "Authorization: Bearer $SESSION_TOKEN" \
  -H "X-Tenant-Id: $FLUIT_TENANT_ID" \
  -H "X-Channel: web"

Base URL https://api.erp.fluit.cloud/ecom.

POST /portal/tickets/{id}/comments

Reply on ticket

Adds a customer-visible message to the ticket thread.

Path parameters

Field Type
id Required string(uuid)

Body required

Field Type
content string · nullable

Responses

201 AddPortalTicketCommentResponse
Field Type
commentId string(uuid)
429 Rate limit exceeded. Wait the number of seconds given in Retry-After. The body is problem-shaped application/json, not application/problem+json. This API sends no X-RateLimit-* headers — the quota is discovered here.
  • Retry-After — Seconds to wait before retrying.

Standard errors: 400 401 403 404 Errors

Examples

curl
curl -X POST "https://api.erp.fluit.cloud/ecom/portal/tickets/{id}/comments" \
  -H "Authorization: Bearer $SESSION_TOKEN" \
  -H "X-Tenant-Id: $FLUIT_TENANT_ID" \
  -H "X-Channel: web" \
  -H "Content-Type: application/json" \
  -d @body.json
Response 201
{
  "commentId": "0f8b2c1e-4d3a-4b7e-9f10-2a6c5d8e1b44"
}

Base URL https://api.erp.fluit.cloud/ecom. The response example is generated from the schema: the shape is right, the values are made up.

PATCH /portal/tickets/{id}/product

Supply product details on ticket

Lets the customer fill in serial number, firmware and hardware revision. The completion is added to the ticket thread so the agent sees it arrive.

Path parameters

Field Type
id Required string(uuid)

Body required

Field Type
firmwareVersion string · nullable
hardwareRevision string · nullable
serialNumber string · nullable

Responses

204 Empty body.
429 Rate limit exceeded. Wait the number of seconds given in Retry-After. The body is problem-shaped application/json, not application/problem+json. This API sends no X-RateLimit-* headers — the quota is discovered here.
  • Retry-After — Seconds to wait before retrying.

Standard errors: 400 401 403 404 Errors

Examples

curl
curl -X PATCH "https://api.erp.fluit.cloud/ecom/portal/tickets/{id}/product" \
  -H "Authorization: Bearer $SESSION_TOKEN" \
  -H "X-Tenant-Id: $FLUIT_TENANT_ID" \
  -H "X-Channel: web" \
  -H "Content-Type: application/json" \
  -d @body.json

Base URL https://api.erp.fluit.cloud/ecom.

Schemas

The objects this group's calls refer to. The field tables above go one level deep and link here rather than repeating the same schema on every endpoint.

PortalTicketAttachment

PortalTicketAttachment
Field Type
contentType string · nullable
createdDate string(date-time)
fileName string · nullable
fileSize integer
id string(uuid)

PortalTicketMessage

PortalTicketMessage
Field Type
authorName string · nullable
content string · nullable
createdDate string(date-time)
id string(uuid)
isFromCustomer boolean

PortalTicketProduct

PortalTicketProduct
Field Type
firmwareVersion string · nullable
hardwareRevision string · nullable
itemName string · nullable
itemNumber string · nullable
serialNumber string · nullable

PortalTicketSummary

PortalTicketSummary
Field Type
attachmentCount integer
commentCount integer
createdDate string(date-time)
id string(uuid)
lastActivityAt string(date-time) · nullable
priority string · nullable
reportedByContactName string · nullable
status string · nullable
ticketNumber string · nullable
title string · nullable
type string · nullable