Template Variables

FireHydrant uses the Liquid templating language. A templating language allows you to set variables/placeholders that are replaced with actual data at execution time.

You can use template variables to reference many types of incident data, such as name and description, milestones, roles, user assignments, and more.

In FireHydrant, you can use template variables to dynamically interpolate FireHydrant incident data into multiple places, including:

As an example, in a Runbook step, you can use an incident's name and description with {{ incident.name }} and {{ incident.description }} in the fields. When the Runbook step executes on a real incident, those placeholders will be filled with the actual name and description of the incident.

To minimize impact to your instance through repeated test incidents, we recommend testing these template variables using the Liquid playground. Additionally, you can check out our liquid template examples in this GitHub repo.

Runbook steps now also feature an output preview, where you can select previous incidents as example data to preview how your templating would have looked:

Liquid/JSON preview on a Runbook step

Liquid/JSON preview on a Runbook step

Incident Fields and Variables

This list includes the properties in the FireHydrant API that are most often used as template variables. To see all available FireHydrant incident properties refer to the IncidentEntity model (for incident data) and PostmortemReportEntity model (for retrospective data).

All left-most fields are accessible under the main incident object with {{ incident.VAR }}, where VAR is the name of the field. Visit the sections in the table of contents to the right to see each section's available variables.

General Incident Fields

KeyTypeDescription
activebooleanWhether the incident is still ongoing (true when in any milestone prior to resolved or post-incident phase)
ai_incident_summarystringAI-generated summary of the incident (requires AI features enabled )
created_atdatetimeUTC time when the incident was created in ISO 8601 format
created_byobjectObject representing the user who declared the incident. For additional
↳ emailstringEmail address of the user who declared
↳ idstringUUID representing the user who declared the incident
↳ namestringName of the user who declared the incident
sourcestringWhere the user declared the incident, for example firehydrant_user (web interface) or slack
customer_impact_summarystringA description or summary of the customer impact
descriptionstringA more detailed description of the incident
idstringUUID representing the incident
incident_urlstringURL for the incident page in the web UI
last_noteobjectObject representing the very latest update and the time it was posted
bodystringMost recent incident update note
created_atdatetimeUTC timestamp of when the latest note was posted
last_updatestringThe same as last_note.body
namestringName of the incident
numberintegerIncident number auto-assigned by FireHydrant. This number automatically increments with each incident created and cannot be changed
organizationobjectObject representing the organization this incident was opened in
idstringUUID representing the organization
namestringName of the organization
organization_idstringThe same as organization.id
private_idstringPrivate ID of the incident's internal status page
report_idstringUUID for the retrospective report. This value is only populated if the incident is resolved.
retro_exportsobject[]Array of objects representing all of the retrospective exports (e.g., Confluence, Google Docs, etc.)
created_atdatetimeUTC time of when the export was created in ISO 8601 format
display_textstringTitle of the exported document
href_urlstringURL of the exported document
icon_urlstringURL of the destination application's icon
idstringUUID for the export
severitystringCurrent severity of the incident
started_atdatetimeUTC time of when an incident was started/declared in ISO 8601 format
tag_liststring[]Array of tags attached to the incident

Milestone Fields

KeyTypeDescription
current_milestonestringCurrent Milestone state of the incident represented by its slug
milestonesobject[]Array of objects representing each time the incident transitioned milestones
created_atdatetimeUTC timestamp of when the milestone was set
durationstringMeasure of the milestone's duration in seconds, printed in the format of P[months]M[days]DT[hours]H[minutes]M[seconds]S
idstringUUID of the milestone transition
occurred_atdatetimeUTC timestamp of the milestone
typestringThe milestone, represented by its slug
updated_atdatetimeUTC timestamp of when the milestone was last updated

Role and User Assignment Fields

KeyTypeDescription
role_assignmentsobject[]Array of objects containing the assigned users and their roles
created_atdatetimeUTC timestamp for when the role was assigned
idstringUUID for the assignment
incident_roleobjectObject representing the incident role that the user was assigned to. For the full list of available parameters, see IncidentRoleEntity
statusstringCurrent status of this role assignment (active or inactive)
updated_atdatetimeUTC timestamp for when the role assignment was updated
userobjectObject representing the user for this assignment. For the full list of available parameters, see UserEntity
team_assignmentsobject[]Array of objects containing the assigned teams
created_atdatetimeUTC timestamp of when the team assignment occurred
idstringUUID for the assignment (not the team's ID)
statusstringCurrent status of the team assignment (active or inactive)
teamobjectObject representing the team that was assigned. For the full list of available parameters, see TeamEntity
updated_atdatetimeUTC timestamp for when the team assignment was last updated

Custom Fields

KeyTypeDescription
custom_fieldsobject{}Object containing custom field objects keyed by their slugs (for example, incident.custom_fields.deployment_silo)
display_namestringThe human-friendly display name for the custom field
field_idstringUUID representing the field
slugstringUnique, humanized identifier for the field
valuestringString value for the field that varies in content.

- If value_type = array, this field will be a string with all array values joined by a comma
- If value_type = string, this will just be the specified string or chosen value
- If value_type = datetime, this will be an ISO 8601 string of the date and time
value_arraystring[]Array of chosen values. Only exists if value_type = array
value_stringstringValue of the custom field. Only exists if value_type = string
value_typestringType of the custom field (string, array, datetime)

Custom field attributes (e.g., display_name, value) can be accessed directly by slug name or can be iterated using Liquid's for loop, which will return each custom field as an object.

## Accessing the value of custom field by slug
{{ incident.custom_fields.slug.value }}

## Iterating over all custom fields to display the name and the value
{% for field in incident.custom_fields %}
  {{ field.name }}
  {{ field.value }}
{% endfor %}

Service Catalog Fields

  • services (array of objects):

    • id: The ID of the impacted service

    • name: The name of the impacted service

    • labels (object): Object containing key-value pairs of all labels

      • {KEY}: Whatever labels you've configured for a service. For example, if you have a label called region then you would access this via *.labels.region or *.labels['region']
  • functionalities (array of objects):

    • id: The ID of the impacted functionality

    • name: The name of the impacted functionality

    • labels (object): Object containing key-value pairs of all labels

      • {KEY}: Whatever labels you've configured for a functionality. For example, if you have a label called region then you would access this via *.labels.region or *.labels['region']
  • environments (array of objects):

    • id: The ID of the impacted environment

    • name: The name of the impacted environment

  • impacts(array of objects):

    • id: Unique ID tracking this particular impact/instance

    • type: "service", "functionality", or "environment"

    • impact(object):

      • id: The ID of the impacted service, functionality, or environment

      • name: The name of the impacted service, functionality, or environment

    • condition(object):

      • id: The ID of the condition (to see the list of conditions and their IDs, visit the API docs)

      • name: The name of the condition

Integrations-Related Fields

  • channel_name: The name of the Slack channel for the incident.

  • channel_reference: The Slack-formatted encoded link for the Slack channel. You can use this reference number in a Slack message to create a link to the incident channel.

  • channel_id: The Slack ID for the channel (not formatted for creating links).

  • channel_status: Indicates whether the Slack channel is operational.

  • private_status_page_url: The url of the private status page for the incident.

  • incident_tickets** (array of objects):

    • id: The incident ticket ID.

    • summary: Summary of information in the ticket.

    • Description: Description of the incident as provided in the ticket.

    • state: State of the ticket: open , in_progress , done , etc.

    • type: Ticket type: Incident , follow_up , or task.

    • assignees: The incident ticket ID.

    • created_by (object)

      • id: ID of the user who created the ticket.

      • name: Name of the user who created the ticket.

      • source: Ticketing source: Slack , PagerDuty , FireHydrant , etc.

      • email: Email address for the user who created the ticket.

    • attachments (array of objects):

      • display_text: The text displayed that links to the ticket.

      • href_url: The URL for the ticket.

      • icon_url: The URL for the icon of the ticketing provider.

      • type: The type of ticket.

📘

Note:

At this time, only the incident ticket is included in this array of objects, not Tasks or Follow-Ups.

Alternatively, you may use ticket, which is the only ticket of type: Incident, and also supports any of the attributes above. This ticket object has the following attributes:

  • ticket (object): Singular object containing the incident ticket

    • link: The reference to a corresponding external integration ticket or issue

      • display_text: The text displayed that links to the ticket.

      • href_url: The URL for the ticket.

      • icon_url: The URL for the icon of the ticketing provider.

      • type: The type of ticket; in this case, it's always "link"

  • conference_bridges (array of objects):

    • id: UUID of the conference object as stored on FireHydrant (not the Zoom/Google Meet ID)

    • attachments (array of objects):

      • type: Attachment type: image, alert, etc.

      • display_text: The text displayed describes the conference bridge.

      • href_url: The URL for the conference bridge (for example, https://us02web.zoom.us/j/1234567890)

      • icon_url: The URL for the icon of the conference bridge provider.

  • incident_channels (array of objects): List of channels attached to the incident

    • id: Slack ID for the channel
    • name: The name of the channel
    • source: The originating source of the channel (e.g. slack)
    • url: The URL for the channel
    • icon_url: URL for the source/channel's icon
  • follow_ups (array of objects): List of follow-ups created on the incident

    • id: FireHydrant UUID for this follow-up
    • summary: Title/summary of the follow-up
    • description: The description of the follow-up
    • state: The current state of the follow-up. Possible values are open, in_progress, cancelled, and done
    • type: Will always be follow_up
    • assignees (array of objects):
      • id: FireHydrant UUID for the user
      • name: User's name
      • source: firehydrant_user, bot_user, or patchy. For Follow-Ups, will basically always be firehydrant_user
      • email: User's email address
    • created_by (object):
      • id: FireHydrant UUID for the user
      • name: User's name
      • source: firehydrant_user, bot_user, or patchy. For Follow-Ups, will basically always be firehydrant_user
      • email: User's email address
    • created_at: ISO 8601 datetime representing when the ticket was created
    • updated_at: ISO 8601 datetime representing when the ticket was last updated
    • tag_list (array of strings): List of ticketing tags (not to be confused with incident tags)
    • incident_id: FireHydrant UUID of the incident this follow-up was created for
    • link: Linked external resource, usually a project ticket for follow-ups
      • id: FireHydrant UUID for the attachment
      • type: Always link
      • display_text: The ticket's code (e.g., "ABC-123")
      • href_url: The URL to the external ticket
      • icon_url: Link to the icon FireHydrant uses for the integration
      • editable: Always false for follow-ups
      • deletable: Always false for follow-ups

Retrospective Fields

The retro data object is only available after an incident has moved to the 'retrospective started' milestone. This object can be directly referenced like an incident, for example,{{ retro.name }}.

  • retro (object):

    • name: The name of the report

    • published_at: When the retro was completed

    • questions (array of objects): An array of custom questions set from the Retrospective Configuration tab

      • title: The title of the question

      • body: The answer to the question

      • updated_at: When the question was last updated

    • contributing_factors (array of objects): An array of the Five Whys section in contributing factors

      • summary: The content of the contributing factor

      • position: The position in the list of Five Whys

    • incident_active_duration: The duration that the incident was in an active state. Active is defined as the Started through Mitigated milestone

    • starred_events (array of objects): An array of the starred events from the incident

      • occurred_at: When the event occurred

      • created_by: Who created the event

      • summary: The content of the contributing factor

      • body: The content of the event

Cookbook

The following section contains examples of using Liquid templating to interpolate incident data.

Slack Channel URL

  • Summary: Get the URL to the Slack channel and display the link using markdown.
  • Usage: Any external comms step, like Notify with Custom Message or Email, etc., where you want to link to the incident Slack channel.
[Incident Channel]({{ incident.incident_channels[0].url }})

Confluence Retro Additions

  • Summary: Display Tags, Labels, and Jira tickets in Confluence export
  • Usage: Add to the Export to Confluence runbook step
### Tags

| Tags      |
|-----------|
{%- for tag in incident.tag_list %}
| {{ tag }} |
{%- endfor %}

### Labels

| Key | Value |
|-----|-------|
{%- for label in incident.labels %}
| {{ label[0] }} | {{ label[1] }} |
{%- endfor %}

### Jira

| Ticket Name | Link |
|-------------|------|
{%- for ticket in incident.incident_tickets[0].attachments %}
| {{ ticket.display_text }} | {{ ticket.href_url }} |
{%- endfor %}

Print Duration of Incident

  • Summary: Return the current or total duration of the incident. Calculates from Resolved milestone or now if the incident is still open.
  • Usage: Custom message to channel or email runbook steps
{% assign started = incident.milestones | where: "type", "started" | first %}
{% assign started_at = started.occurred_at | date: "%s" %}

{% assign resolved = incident.milestones | where: "type", "resolved" | first %}
{% if resolved %}
  {% assign resolved_at_or_now = resolved.occurred_at | date: "%s" %}
{% else %}
  {% assign resolved_at_or_now = "now" | date: "%s" %}
{% endif %}

{% assign SECONDS_PER_MINUTE = 60 %}
{% assign SECONDS_PER_HOUR = SECONDS_PER_MINUTE | times: 60 %}
{% assign SECONDS_PER_DAY = SECONDS_PER_HOUR | times: 24 %}

{% assign remainder = resolved_at_or_now | minus: started_at | modulo: SECONDS_PER_DAY %}
{% assign days = resolved_at_or_now | minus: started_at | divided_by: SECONDS_PER_DAY | floor %}

{% assign hours = remainder | divided_by: SECONDS_PER_HOUR | floor %}
{% assign remainder = remainder | modulo: SECONDS_PER_HOUR %}

{% assign minutes = remainder | divided_by: SECONDS_PER_MINUTE | floor %}
{% assign seconds = remainder | modulo: SECONDS_PER_MINUTE %}

This incident has been active for {{ days }}d {{ hours }}h {{ minutes }}m {{ seconds }}s

Print all responders' names, emails, and roles

  • Summary: Return all responders' information. This information is available in other places today like the Command Center or any Notify messages in Slack, but could be useful in e.g. an email.
  • Usage: The Send an email notification runbook step, in Jira/Confluence step descriptions, etc.
{% for role in incident.role_assignments -%}
  **{{ role.incident_role.name }}**: {{ role.user.name }} \<{{ role.user.email }}\>
{% endfor %}

Print overview message of current information and next update ETA

  • Summary: Using Liquid's built in time mechanics, we do time conversions using simple math and then display with formatting.
  • Usage: Anywhere, but likely Email or Custom Message steps
{% assign started = incident.milestones | where: "type", "started" | first %}

**CURRENT STATUS**: {{ incident.current_milestone }}
**SEVERITY**: {{ incident.severity }}
**DESCRIPTION**: {{ incident.description }}
**START TIME**: {{ started.occurred_at | date: "%s" | minus: 28800 | date: "%Y-%m-%d %H:%M" }}

**LAST UPDATE**:
  - At: {{ incident.last_note.created_at | date: "$s" | minus: 28800 | date: "%Y-%m-%d %H:%M" }}
  - Note: {{ incident.last_note.body }}

**NEXT UPDATE**: {{ incident.last_note.created_at | date: "%s" | minus: 27000 | date: "%Y-%m-%d %H:%M" }}

In the example above, updates are posted in 30-minute intervals and in PST. Dates are stored in UTC, so we first convert them to a date object that Liquid can work with using date, and then we subtract seconds from the time to convert from UTC to PST with minus before formatting the output to print.

Other Resources