MaintainX Subscriptions & Webhooks API

Webhooks in MaintainX What are Webhooks? Webhooks are HTTP callbacks that allow different systems to communicate with each other in real-time. They're like automated messengers that deliver information when something happens, rather than requiring you to ask for it. In the context of MaintainX, webhooks are a way for our system to automatically notify your application when specific events occur in your account. Instead of your application repeatedly checking our API for updates (a process known as "polling"), webhooks allow you to receive real-time notifications about important events like: Work order status changes New work orders being created Asset updates And more... When an event occurs, MaintainX sends an HTTP POST request to the endpoint you specify. The request contains details about the event. It allows your application to react immediately to changes in MaintainX. Set Up Webhooks You can configure webhooks the following ways: From the MaintainX Web Application For a quick setup, you can configure webhooks in the MaintainX web application: From the sidebar, select Settings > Integrations. Then, on the Integrations page, select Webhooks Click + New Webhook Configure a webhook endpoint and select the events you want to receive Save the configuration Via the REST API You can configure webhooks using our REST API if you want to integrate with MaintainX in a programmatic way. The API allows you to: Create new webhook subscriptions. Update webhook configurations. Delete webhook subscriptions. Retrieve webhook secrets. ⚠️ Warning Webhooks that don't get a successful response from your application over long periods of time might be deleted. A webhook call will timeout after 10 seconds. When a webhook is deleted, we send an email to the address linked to the user account that made the request. Security and Verification To verify that webhook requests come from MaintainX and haven't been tampered with, we include security signatures in each webhook request. This section explains how to verify these signatures. Verify Webhook Signatures All webhook HTTP requests sent by MaintainX include two headers containing a timestamp and an HMAC signature that must be validated by your application: x-maintainx-webhook-body-signature x-maintainx-webhook-uri-signature ℹ️ Note When creating a webhook, you'll receive a secret that should be securely stored on your end. This secret is essential for signature verification and can also be accessed later through the MaintainX interface if needed. The timestamp is prefixed by t=. Each signature is prefixed by a scheme version. Scheme versions start with v, followed by an integer. The only valid live signature version is v1. x-maintainx-webhook-body-signature: t=<timestamp>,v1=<signature> Signature Verification Process MaintainX generates signatures using a hash-based message authentication code (HMAC) with SHA-256. Here are the steps to verify a webhook signature: Extract the timestamp and signatures from the header Split the header, using the , character as the separator, to get a list of elements. Split each element, using the = character as the separator, to get a prefix and value pair. The value for the prefix t corresponds to the timestamp, and v1 corresponds to the signature. You can discard all other elements. To prepare the signed payload string, concatenate the following: The timestamp (as a string) The character . The actual JSON payload (that is, the request body, or the full URI) <timestamp>.<stringified payload> Determine the expected signature Retrieve the secret for your endpoint. Visit [https://app.getmaintainx.com/settings/integrations](https://app.getmaintainx.com/settings/integrations), find the endpoint you want, and select Copy secret. Compute an HMAC with the SHA256 hash function. Use the endpoint's signing secret as the key. Use the signed_payload string as the message. crypto.createHmac("sha256", secret).update('<timestamp>.<stringified payload>', "utf8").digest("hex") Compare the signatures Compare the signature in the header to the expected signature. For an equality match, compute the difference between the current timestamp and the received timestamp. Decide whether the difference is within your tolerance. We recommend a tolerance of 5 minutes to allow for clock drift and processing delays. Webhooks with timestamps older than your tolerance window should be rejected to prevent replay attacks. Best Practices Always verify webhook signatures to ensure requests are genuine (see Security and Verification section above). Return a 2xx status code as quickly as possible to acknowledge receipt (our webhooks will timeout after 10 seconds). Process webhook events asynchronously after acknowledging receipt. Implement proper error handling for failed webhook deliveries. Implement retry logic in your application to handle temporary failures. Implement idempotency in your webhook handler to prevent duplicate processing of the same event. Set up monitoring for your webhook endpoint to detect failures. Consider using a webhook testing tool during development to simulate events. Limitations Webhook URLs are currently limited to a maximum of 512 characters Need Help? If you need help implementing webhooks or troubleshooting, contact our Support team from the MaintainX web application. From the sidebar, select Support, then select Contact Support.

OpenAPI Specification

maintainx-subscriptions-webhooks-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  description: Welcome to the MaintainX API documentation!<br/><br/>You can use the MaintainX API to programmatically interact with all the entities in MaintainX. Use it to retrieve and manage data of Work Orders, Work Requests, Assets, and more!<br/><br/>To get started, in your MaintainX account go to <a href="https://app.getmaintainx.com/settings/integrations/apiKeys">"Settings &gt; Integrations"</a> and click "&plus; New Key" button to generate a new Rest API key.<br/><br/><b>Missing something?</b><br/>Don't hesitate to reach out <a href="mailto:support@getmaintainx.com">support@getmaintainx.com</a><br/><br/>
  version: '1'
  title: MaintainX Asset Criticalities Subscriptions & Webhooks API
  contact:
    url: https://www.getmaintainx.com/
    name: Support
    email: support@getmaintainx.com
  x-logo:
    url: https://maintainx-static.s3-us-west-2.amazonaws.com/img/default-org-logo.png
    backgroundColor: '#FFFFFF'
    altText: MaintainX logo
servers:
- url: https://api.getmaintainx.com/v1
  description: Endpoint
security:
- Bearer: []
tags:
- name: Subscriptions & Webhooks
  description: "\n  <h1>Webhooks in MaintainX</h1>\n\n<h2>What are Webhooks?</h2>\n<p>Webhooks are HTTP callbacks that allow different systems to communicate with each other in real-time. They're like automated messengers that deliver information when something happens, rather than requiring you to ask for it.</p>\n\n<p>In the context of MaintainX, webhooks are a way for our system to automatically notify your application when specific events occur in your account. Instead of your application repeatedly checking our API for updates (a process known as \"polling\"), webhooks allow you to receive real-time notifications about important events like:</p>\n<ul>\n  <li>Work order status changes</li>\n  <li>New work orders being created</li>\n  <li>Asset updates</li>\n  <li>And more...</li>\n</ul>\n\n<p>When an event occurs, MaintainX sends an HTTP POST request to the endpoint you specify. The request contains details about the event. It allows your application to react immediately to changes in MaintainX.</p>\n\n<h2>Set Up Webhooks</h2>\n<p>You can configure webhooks the following ways:</p>\n\n<h3>From the MaintainX Web Application</h3>\n<p>For a quick setup, you can configure webhooks in the MaintainX web application:</p>\n<ol>\n  <li>From the sidebar, select <code>Settings > Integrations</code>. Then, on the Integrations page, select <code>Webhooks</code></li>\n  <li>Click <b>+ New Webhook</b></li>\n  <li>Configure a webhook endpoint and select the events you want to receive</li>\n  <li>Save the configuration</li>\n</ol>\n\n<h3>Via the REST API</h3>\n<p>You can configure webhooks using our REST API if you want to integrate with MaintainX in a programmatic way. The API allows you to:</p>\n<ul>\n  <li>Create new webhook subscriptions.</li>\n  <li>Update webhook configurations.</li>\n  <li>Delete webhook subscriptions.</li>\n  <li>Retrieve webhook secrets.</li>\n</ul>\n\n<div class=\"warning-box\">\n  <strong>⚠️ Warning</strong>\n\n  Webhooks that don't get a successful response from your application over long periods of time might be deleted. A webhook call will timeout after 10 seconds.\n  When a webhook is deleted, we send an email to the address linked to the user account that made the request.\n</div>\n\n<h2>Security and Verification</h2>\n<p>To verify that webhook requests come from MaintainX and haven't been tampered with, we include security signatures in each webhook request. This section explains how to verify these signatures.</p>\n\n<h3>Verify Webhook Signatures</h3>\n<p>All webhook HTTP requests sent by MaintainX include two headers containing a timestamp and an HMAC signature that must be validated by your application:</p>\n<ul>\n  <li><code>x-maintainx-webhook-body-signature</code></li>\n  <li><code>x-maintainx-webhook-uri-signature</code></li>\n</ul>\n\n<div class=\"note-box\">\n  <strong>ℹ️ Note</strong>\n  <p>When creating a webhook, you'll receive a secret that should be securely stored on your end. This secret is essential for signature verification and can also be accessed later through the MaintainX interface if needed.</p>\n</div>\n\n<p>The timestamp is prefixed by <code>t=</code>. Each signature is prefixed by a scheme version. Scheme versions start with <code>v</code>, followed by an integer. The only valid live signature version is <code>v1</code>.</p>\n\n<pre>x-maintainx-webhook-body-signature: t=<b>&lt;timestamp&gt;</b>,v1=<b>&lt;signature&gt;</b></pre>\n\n<h3>Signature Verification Process</h3>\n<p>MaintainX generates signatures using a hash-based message authentication code (HMAC) with SHA-256. Here are the steps to verify a webhook signature:</p>\n\n<ol>\n  <li><b>Extract the timestamp and signatures from the header</b>\n    <ol>\n      <li>Split the header, using the <code>,</code> character as the separator, to get a list of elements.</li>\n      <li>Split each element, using the <code>=</code> character as the separator, to get a prefix and value pair.\n      The value for the prefix <code>t</code> corresponds to the timestamp, and <code>v1</code> corresponds to the signature.\n      You can discard all other elements.</li>\n    </ol>\n  </li>\n\n  <li><b>To prepare the signed payload string, concatenate the following:</b>\n    <ol>\n      <li>The timestamp (as a string)</li>\n      <li>The character <code>.</code></li>\n      <li>The actual JSON payload (that is, the request body, or the full URI)</li>\n    </ol>\n    <pre><b>&lt;timestamp&gt;</b>.<b>&lt;stringified payload&gt;</b></pre>\n  </li>\n\n  <li><b>Determine the expected signature</b>\n    <ol>\n      <li>Retrieve the secret for your endpoint. Visit [https://app.getmaintainx.com/settings/integrations](https://app.getmaintainx.com/settings/integrations), find the endpoint you want, and select <b>Copy secret</b>.</li>\n      <li>Compute an HMAC with the SHA256 hash function.</li>\n      <li>Use the endpoint's signing secret as the key.</li>\n      <li>Use the <code>signed_payload</code> string as the message.</li>\n    </ol>\n    <pre>crypto.createHmac(\"sha256\", secret).update('<b>&lt;timestamp&gt;</b>.<b>&lt;stringified payload&gt;</b>', \"utf8\").digest(\"hex\")</pre>\n  </li>\n\n  <li><b>Compare the signatures</b>\n    <ol>\n      <li>Compare the signature in the header to the expected signature.</li>\n      <li>For an equality match, compute the difference between the current timestamp and the received timestamp.</li>\n      <li>Decide whether the difference is within your tolerance. We recommend a tolerance of 5 minutes to allow for clock drift and processing delays. Webhooks with timestamps older than your tolerance window should be rejected to prevent replay attacks.</li>\n    </ol>\n  </li>\n</ol>\n\n<h2>Best Practices</h2>\n<ul>\n  <li>Always verify webhook signatures to ensure requests are genuine (see Security and Verification section above).</li>\n  <li>Return a 2xx status code as quickly as possible to acknowledge receipt (our webhooks will timeout after 10 seconds).</li>\n  <li>Process webhook events asynchronously after acknowledging receipt.</li>\n  <li>Implement proper error handling for failed webhook deliveries.</li>\n  <li>Implement retry logic in your application to handle temporary failures.</li>\n  <li>Implement idempotency in your webhook handler to prevent duplicate processing of the same event.</li>\n  <li>Set up monitoring for your webhook endpoint to detect failures.</li>\n  <li>Consider using a webhook testing tool during development to simulate events.</li>\n</ul>\n\n<h2>Limitations</h2>\n<ul>\n  <li>Webhook URLs are currently limited to a maximum of 512 characters</li>\n</ul>\n\n<h2>Need Help?</h2>\n<p>If you need help implementing webhooks or troubleshooting, contact our Support team from the MaintainX web application. From the sidebar, select <strong>Support</strong>, then select <strong>Contact Support</strong>.</p>\n\n<style>\n  .info-box {\n    padding: 10px 15px;\n    margin: 15px 0;\n    background-color: #eef9fc;\n    border-left: 4px solid #4bb3d4;\n    color: #193c47;\n    border-radius: 4px;\n  }\n</style>\n\n<style>\n  .note-box {\n    padding: 10px 15px;\n    margin: 15px 0;\n    background-color: #fdfdfe;\n    border-left: 4px solid #d4d5d8;\n    color: #474748;\n    border-radius: 4px;\n  }\n</style>\n\n<style>\n  .tip-box {\n    padding: 10px 15px;\n    margin: 15px 0;\n    background-color: #e6f5e6;\n    border-left: 4px solid #009400;\n    color: #013100;\n    border-radius: 4px;\n  }\n</style>\n\n<style>\n  .warning-box {\n    padding: 10px 15px;\n    margin: 15px 0;\n    background-color: #fff8e6;\n    border-left: 4px solid #e6a700;\n    color: #4d3800;\n    border-radius: 4px;\n  }\n</style>\n\n<style>\n  .danger-box {\n    padding: 10px 15px;\n    margin: 15px 0;\n    background-color: #ffebec;\n    border-left: 4px solid #e13238;\n    color: #4b1013;\n    border-radius: 4px;\n  }\n</style>\n"
  x-traitTag: false
paths:
  /subscriptions:
    post:
      summary: Create new subscription
      requestBody:
        description: Subscription to create
        required: true
        content:
          application/json:
            schema:
              type: object
              oneOf:
              - title: API Token Created
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - API_TOKEN_CREATED
                    example: API_TOKEN_CREATED
                  url:
                    type: string
                    example: https://example.com
              - title: API Token Revoked
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - API_TOKEN_REVOKED
                    example: API_TOKEN_REVOKED
                  url:
                    type: string
                    example: https://example.com
              - title: Asset Status Change
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - ASSET_STATUS_CHANGE
                    example: ASSET_STATUS_CHANGE
                  url:
                    type: string
                    example: https://example.com
                  filters:
                    type: object
                    description: Possible filters.
                    properties:
                      oneOfAssetStatusTypes:
                        type: array
                        description: Asset status types that will trigger the webhook
                        items:
                          title: Status
                          type: string
                          enum:
                          - IGNORE
                          - OFFLINE
                          - ONLINE
                      oneOfCustomAssetStatusesIds:
                        type: array
                        description: Custom status ids that will trigger the webhook
                        items:
                          type: number
              - title: Connector Token Revoked
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - CONNECTOR_TOKEN_REVOKED
                    example: CONNECTOR_TOKEN_REVOKED
                  url:
                    type: string
                    example: https://example.com
              - title: Data Export Initiated
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - DATA_EXPORT_INITIATED
                    example: DATA_EXPORT_INITIATED
                  url:
                    type: string
                    example: https://example.com
              - title: Invite Link Archived
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - INVITE_LINK_ARCHIVED
                    example: INVITE_LINK_ARCHIVED
                  url:
                    type: string
                    example: https://example.com
              - title: Invite Link Created
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - INVITE_LINK_CREATED
                    example: INVITE_LINK_CREATED
                  url:
                    type: string
                    example: https://example.com
              - title: Invite Link Updated
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - INVITE_LINK_UPDATED
                    example: INVITE_LINK_UPDATED
                  url:
                    type: string
                    example: https://example.com
              - title: Meter Trigger Status Change
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - METER_TRIGGER_STATE_CHANGE
                    example: METER_TRIGGER_STATE_CHANGE
                  url:
                    type: string
                    example: https://example.com
                  filters:
                    type: object
                    description: Possible filters.
                    properties:
                      oneOfStates:
                        type: array
                        description: States that will trigger the webhook.
                        items:
                          title: State
                          type: string
                          enum:
                          - INACTIVE
                          - INSUFFICIENT_DATA
                          - PENDING
                          - STABLE
                          - TRIGGERED
              - title: New Asset
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_ASSET
                    example: NEW_ASSET
                  url:
                    type: string
                    example: https://example.com
                  options:
                    type: object
                    description: Possible options
                    properties:
                      serializeEntity:
                        type: boolean
                        description: If true, the webhook will receive the Asset data
              - title: New Category on Work Order
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_CATEGORY_ON_WORK_ORDER
                    example: NEW_CATEGORY_ON_WORK_ORDER
                  url:
                    type: string
                    example: https://example.com
                  filters:
                    type: object
                    description: Possible filters.
                    properties:
                      oneOfCategories:
                        type: array
                        description: At least one of those categories should be on the work order to trigger the webhook.
                        items:
                          oneOf:
                          - title: Name
                            type: string
                            description: Category name
                          - title: ID
                            type: integer
                            description: Global ID of a category
              - title: New Comment on Work Order
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_COMMENT_ON_WORK_ORDER
                    example: NEW_COMMENT_ON_WORK_ORDER
                  url:
                    type: string
                    example: https://example.com
              - title: New Location
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_LOCATION
                    example: NEW_LOCATION
                  url:
                    type: string
                    example: https://example.com
              - title: New Part
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_PART
                    example: NEW_PART
                  url:
                    type: string
                    example: https://example.com
                  options:
                    type: object
                    description: Possible options
                    properties:
                      serializeEntity:
                        type: boolean
                        description: If true, the webhook will receive the Part data
              - title: New Purchase Order
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_PURCHASE_ORDER
                    example: NEW_PURCHASE_ORDER
                  url:
                    type: string
                    example: https://example.com
                  options:
                    type: object
                    description: Possible options
                    properties:
                      serializeEntity:
                        type: boolean
                        description: If true, the webhook will receive the Purchase Order data
                      includeOAuthTokensInPayload:
                        type: boolean
                        description: 'If true, the webhook payload will include the OAuth tokens of the user whose action triggered the webhook. Warning: these tokens are sensitive and should only be included when the webhook is sent to a trusted source. Only available when OIDC login is enabled for the organization.'
              - title: New Request
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_WORK_REQUEST
                    example: NEW_WORK_REQUEST
                  url:
                    type: string
                    example: https://example.com
              - title: New Slash Command
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_SLASH_COMMAND
                    example: NEW_SLASH_COMMAND
                  url:
                    type: string
                    example: https://example.com
                  filters:
                    type: object
                    description: Possible filters.
                    properties:
                      command:
                        type: string
                        description: Specify the required keyword to trigger the Webhook.
                        example: jira
              - title: New Vendor
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_VENDOR
                    example: NEW_VENDOR
                  url:
                    type: string
                    example: https://example.com
              - title: New Work Order
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - NEW_WORK_ORDER
                    example: NEW_WORK_ORDER
                  url:
                    type: string
                    example: https://example.com
                  options:
                    type: object
                    description: Possible options
                    properties:
                      serializeEntity:
                        type: boolean
                        description: If true, the webhook will receive the Work Order data
              - title: Part Change
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - PART_CHANGE
                    example: PART_CHANGE
                  url:
                    type: string
                    example: https://example.com
                  options:
                    type: object
                    description: Possible options
                    properties:
                      serializeEntity:
                        type: boolean
                        description: If true, the webhook will receive the part data
                      onlySerializeFilteredProperties:
                        type: boolean
                        description: If true and serializeEntity is also set to true, only the filtered properties will be returned on update.
                  filters:
                    type: object
                    description: Possible filters.
                    properties:
                      oneOfPartProperties:
                        type: array
                        description: Properties that will trigger the webhook. <br>*If no properties are selected, the webhook will be triggered on every change
                        items:
                          title: Properties
                          type: string
                          enum:
                          - AREA
                          - ASSETS
                          - AVAILABLE_QUANTITY
                          - BARCODE
                          - DESCRIPTION
                          - EXTRA_FIELDS
                          - LOCATION
                          - LOCATIONS
                          - MAXIMUM_QUANTITY
                          - MINIMUM_QUANTITY
                          - NAME
                          - PART_TYPES
                          - TEAMS
                          - UNIT_COST
                          - VENDORS
              - title: Part Delete
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - PART_DELETE
                    example: PART_DELETE
                  url:
                    type: string
                    example: https://example.com
                  options:
                    type: object
                    description: Possible options
                    properties:
                      serializeEntity:
                        type: boolean
                        description: If true, the webhook will receive the part data
              - title: Part Quantity Changed
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - PART_QUANTITY_CHANGE
                    example: PART_QUANTITY_CHANGE
                  url:
                    type: string
                    example: https://example.com
              - title: Part Transfer
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - PART_TRANSFER
                    example: PART_TRANSFER
                  url:
                    type: string
                    example: https://example.com
              - title: Purchase Order Change
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - PURCHASE_ORDER_CHANGE
                    example: PURCHASE_ORDER_CHANGE
                  url:
                    type: string
                    example: https://example.com
                  options:
                    type: object
                    description: Possible options
                    properties:
                      serializeEntity:
                        type: boolean
                        description: If true, the webhook will receive the purchase order data
                      onlySerializeFilteredProperties:
                        type: boolean
                        description: If true and serializeEntity is also set to true, only the filtered properties will be returned on update.
                  filters:
                    type: object
                    description: Possible filters.
                    properties:
                      oneOfPurchaseOrderProperties:
                        type: array
                        description: Properties that will trigger the webhook. <br>*If no properties are selected, the webhook will be triggered on every changes
                        items:
                          title: Properties
                          type: string
                          enum:
                          - ATTACHMENTS
                          - BILLING_ADDRESS
                          - COSTS
                          - DUE_DATE
                          - EXTRA_FIELDS
                          - ITEMS
                          - NOTE
                          - OVERRIDE_NUMBER
                          - SHIPPING_ADDRESS
                          - STATUS
                          - TITLE
                          - VENDOR
                          - VENDOR_CONTACTS
              - title: Purchase Order Status Change
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - PURCHASE_ORDER_STATUS_CHANGE
                    example: PURCHASE_ORDER_STATUS_CHANGE
                  url:
                    type: string
                    example: https://example.com
                  options:
                    type: object
                    description: Possible options
                    properties:
                      serializePurchaseOrder:
                        type: boolean
                        description: If true, the webhook will receive the purchase order data
                      omitSendToVendorPopup:
                        type: boolean
                        description: If true, if the state change was done from the UI, the UI will not prompt the user to send the purchase order to the vendor. It will be assumed that the webhook took care of it.
                  filters:
                    type: object
                    description: Possible filters.
                    properties:
                      oneOfStatuses:
                        type: array
                        description: Statuses that will trigger the webhook
                        items:
                          title: Status
                          type: string
                          enum:
                          - APPROVED
                          - CANCELED
                          - COMPLETED
                          - DECLINED
                          - PARTIALLY_FULFILLED
                          - PENDING
                          - REQUESTED
                      vendors:
                        type: array
                        description: Vendors id that will trigger the webhook
                        items:
                          type: number
              - title: Role Archived
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - ROLE_ARCHIVED
                    example: ROLE_ARCHIVED
                  url:
                    type: string
                    example: https://example.com
              - title: Role Created
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - ROLE_CREATED
                    example: ROLE_CREATED
                  url:
                    type: string
                    example: https://example.com
              - title: Role Updated
                type: object
                required:
                - type
                - url
                properties:
                  type:
                    type: string
                    description: Type of event subscribed to
                    enum:
                    - ROLE_UPDATED
                    example: ROLE_UPDATED
                  url:
                    type: string
                    example: https://example.com
              - title: SSO Configuration Changed
                type: object
                required:
                - type
                - url
           

# --- truncated at 32 KB (247 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/maintainx/refs/heads/main/openapi/maintainx-subscriptions-webhooks-api-openapi.yml