Skip to content

Ticket Types ​

A Ticket Type is a node in the Graph that defines a custom type key, plus items and relationships with other nodes. For instance, custom types include Support, Complaints, and Warranty Tickets.

To create a new Ticket type, define the type key in a YAML file using the path /registry/actors/custom/ticket/types/<TICKET TYPE>

Ticket types are Custom Actors with specific type definition schema.

Example: Create a Return Ticket Type ​

Create a New Return Ticket Type This example creates a new Return Ticket custom type. It includes `refund` and `exchange` as items, and a relationship with the order node. 1. Define Return in a YAML file.
filtrera
// newTicketType.yaml
uri: /registry/actors/custom/ticket/types/return
spec:
  value:
    graphSetName: return
    itemEdgeName: head
    defaultNumberPrefix: "RE"
    items:
      refund:
        graphSetName: refundTicket
        edgeName: refundEdge
        relations:
          orders:
            node: 'order'
            cardinality: single
      exchange:
        graphSetName: exchangeTicket
        edgeName: exchangeEdge
        relations:
          orders:
            node: 'order'
            cardinality: single
  1. Apply it to the Registry via the CLI using h_ manage apply
h_ manage apply .\newTicketType.yaml -s demo-ecom

Response

  Updated registry keys:
- actors/ticket/types/return
  - Old: undefined
  - New: {"graphSetName":"return","itemEdgeName":"head","defaultNumberPrefix":"RE","items":{"refund":{"graphSetName":"refundTicket","edgeName":"refundEdge","relations":{"orders":{"node":"order","cardinality":"single"}}},"exchange":{"graphSetName":"exchangeTicket","edgeName":"exchangeEdge","relations":{"orders":{"node":"order","cardinality":"single"}}}}}

Choose unique names for asset type definitions because existing types are overwritten, which wipes out any previously existing relations. Once you’ve gotten a response, use h_ manage signals to ensure there were no asset type creation errors.

TIP

Always run h_ manage signals after applying a Type definition. It lists changes including any type definition errors.

Example: Query the Return Ticket ​

Query open Return Tickets Let's query the Graph for open Return Tickets. Most specifically, we will get all open exchange Return tickets and the dynamic message field. Send a `POST` request to `/resources/graph` with a JSON body containing the `rootEdgeName` or `graphSetName` of the node. In this case, from the type definition, it is `return`. **Request**
```json [{ "edge": "return", "filter": " ticketState == 'open' ", "node": { "fields": ["ticketId", "ticketNumber", "ticketState"], "navigate": [{ "edge": "exchangeEdge", "node": { "fields": ["ticketItemId", " dynamic->'message' "]}}]}}] ```

Response

HTTP/1.1 200 OK
...
{
  "return": {
    "nodes": [
      {
        "ticketId": "0199a9b6-8608-7360-b98b-d2f9adeb2848",
        "ticketNumber": "RE100011",
        "ticketState": "open",
        "exchangeEdge": {
          "nodes": [
            {
              "ticketItemId": "0199a9b6-860d-703a-bd17-9ef5451e577f",
              "dynamic": {
                "message": "pls exchange this item"
              },
              "cursor": "WyIwMTk5YTliNi04NjBkLTcwM2EtYmQxNy05ZWY1NDUxZTU3N2YiXQ=="
            }
          ],
          "firstCursor": "WyIwMTk5YTliNi04NjBkLTcwM2EtYmQxNy05ZWY1NDUxZTU3N2YiXQ==",
          "lastCursor": "WyIwMTk5YTliNi04NjBkLTcwM2EtYmQxNy05ZWY1NDUxZTU3N2YiXQ=="
        },
        "cursor": "WyIwMTk5YTliNi04NjA4LTczNjAtYjk4Yi1kMmY5YWRlYjI4NDgiXQ=="
      },
      {
        "ticketId": "0199aa3f-31d0-7dd8-bf32-3a5fd3fd2627",
        "ticketNumber": "RE100015",
        "ticketState": "open",
        "exchangeEdge": {
          "nodes": [
            {
              "ticketItemId": "0199aa3f-31ea-7cec-931f-9fb9f6bd5381",
              "dynamic": {
                "message": "exchange this product"
              },
              "cursor": "WyIwMTk5YWEzZi0zMWVhLTdjZWMtOTMxZi05ZmI5ZjZiZDUzODEiXQ=="
            }
          ],
          "firstCursor": "WyIwMTk5YWEzZi0zMWVhLTdjZWMtOTMxZi05ZmI5ZjZiZDUzODEiXQ==",
          "lastCursor": "WyIwMTk5YWEzZi0zMWVhLTdjZWMtOTMxZi05ZmI5ZjZiZDUzODEiXQ=="
        },
        "cursor": "WyIwMTk5YWEzZi0zMWQwLTdkZDgtYmYzMi0zYTVmZDNmZDI2MjciXQ=="
      }
    ],
    "firstCursor": "WyIwMTk5YTliNi04NjA4LTczNjAtYjk4Yi1kMmY5YWRlYjI4NDgiXQ==",
    "lastCursor": "WyIwMTk5YWEzZi0zMWQwLTdkZDgtYmYzMi0zYTVmZDNmZDI2MjciXQ=="
  }
}

Check out how to customize graph queries to make them more specific.

TIP

Run GET /resources/graph before a query. It returns all existing graph nodes and edges so you can correctly query the graph for specific resources.

© 2026 Hantera AB. Org. no.: 559242-9582