Webhooks

A variety of webhooks are available to extend the functionality of SQLPad.

To enable a specific webhook, set SQLPAD_WEBHOOK_ENABLED to true, and provide a URL for the event you would like to subscribe to. HTTP and HTTPS URLs are supported. This URL will be sent an HTTP POST with a payload of relevant information when the event occurs.

To ensure a webhook call can be trusted, SQLPAD_WEBHOOK_SECRET may be configured, and validated on every webhook call.

The webhook POST will contain the following headers:

  • Content-Type: application/json
  • SQLPad-Secret: SQLPAD_WEBHOOK_SECRET value

The request body sent to the URL varies by event. Every body will have an action field with the name of the action, as well as sqlpadUrl, which will contain the URL to the SQLPad instance that sent the action (if PUBLIC_URL is configured).

User Created

The user created webhook is sent whenever a user is added via the users API/UI or auto user creation (if enabled and supported via authentication configured). This hook can be used to automate user invites, sending a message to users inviting them to sign up (if using local user/password authentication) or sign in (if using a single sign on).

Env: SQLPAD_WEBHOOK_USER_CREATED_URL

Payload Body:

{
  "action": "user_created",
  "sqlpadUrl": "http://mysqlpad.com:9000/sqlpad",
  "user": {
    "id": "a57acb9e-859e-44b7-83a8-42c5cbb809ce",
    "name": "user1",
    "email": "[email protected]",
    "role": "editor",
    "createdAt": "2020-07-19T18:54:18.858Z"
  }
}

Query Created

Fires whenever a query is created (initial query save). This is not fired on query execution (see batch created).

Env: SQLPAD_WEBHOOK_QUERY_CREATED_URL

Payload Body:

{
  "action": "query_created",
  "sqlpadUrl": "http://mysqlpad.com:9000/sqlpad",
  "query": {
    "id": "d0eb347e-864a-4058-bcb2-5456adf5474f",
    "name": "test query",
    "queryText": "SELECT * FROM some_table",
    "tags": ["one", "two"],
    "chart": null,
    "createdByUser": {
      "id": "92185834-42d3-4b63-b0d4-6d81e5e83dfd",
      "name": null,
      "email": "[email protected]"
    },
    "createdAt": "2020-07-19T18:57:14.522Z"
  }
}

Batch Created

Fires whenever a batch is created. A batch is one or more queries, and is the API used to execute queries in the UI.

Env: SQLPAD_WEBHOOK_BATCH_CREATED_URL

Payload Body:

{
  "action": "batch_created",
  "sqlpadUrl": "",
  "batch": {
    "id": "c169c7fc-0b9b-482a-8fe6-c9b3486d2f88",
    "queryId": "2f3e9bb6-cadf-4d52-a0c0-43089353193f",
    "name": null,
    "connectionId": "6ffeeb1d-1142-4004-b9f8-91cef0d15850",
    "connectionClientId": null,
    "status": "started",
    "startTime": "2020-07-19T19:01:09.980Z",
    "stopTime": null,
    "durationMs": null,
    "batchText": "SELECT 1 AS id, 'blue' AS color",
    "selectedText": "SELECT 1 AS id, 'blue' AS color",
    "chart": null,
    "userId": "50076232-f06f-4a80-8a4d-fc6b8b265830",
    "createdAt": "2020-07-19T19:01:09.980Z",
    "updatedAt": "2020-07-19T19:01:09.980Z",
    "statements": [
      {
        "id": "9fc69c47-8fda-4d7d-90a7-8236733e4dbe",
        "batchId": "c169c7fc-0b9b-482a-8fe6-c9b3486d2f88",
        "sequence": 1,
        "statementText": "SELECT 1 AS id, 'blue' AS color",
        "status": "queued",
        "startTime": null,
        "stopTime": null,
        "durationMs": null,
        "columns": null,
        "rowCount": null,
        "resultsPath": null,
        "incomplete": null,
        "error": null,
        "createdAt": "2020-07-19T19:01:09.981Z",
        "updatedAt": "2020-07-19T19:01:09.981Z"
      }
    ]
  },
  "user": {
    "id": "50076232-f06f-4a80-8a4d-fc6b8b265830",
    "name": null,
    "email": "[email protected]",
    "role": "admin",
    "createdAt": "2020-07-19T19:01:09.594Z"
  },
  "connection": {
    "id": "6ffeeb1d-1142-4004-b9f8-91cef0d15850",
    "name": "test connection",
    "driver": "sqlite"
  }
}

Batch Finished

Fires whenever a batch finished running. Payload contains summary information for success, or first error on failure. To receive results, use statement finished hook.

Env: SQLPAD_WEBHOOK_BATCH_FINISHED_URL

Payload Body:

{
  "action": "batch_finished",
  "sqlpadUrl": "",
  "batch": {
    "id": "40cf0e10-2bd1-4a02-92f8-340a99775671",
    "queryId": "026ca49e-491e-4520-9ead-76bcdb287d28",
    "name": null,
    "connectionId": "668489b8-6049-43a8-a7af-0f34abf1984c",
    "connectionClientId": null,
    "status": "finished",
    "startTime": "2020-07-19T19:01:57.696Z",
    "stopTime": "2020-07-19T19:01:57.830Z",
    "durationMs": 15,
    "batchText": "SELECT 1 AS id, 'blue' AS color",
    "selectedText": "SELECT 1 AS id, 'blue' AS color",
    "chart": null,
    "userId": "d49295f7-29b8-4ba5-be10-218638d02af7",
    "createdAt": "2020-07-19T19:01:57.696Z",
    "updatedAt": "2020-07-19T19:01:57.830Z",
    "statements": [
      {
        "id": "396e8043-c766-4fec-b441-82dbcdf16473",
        "batchId": "40cf0e10-2bd1-4a02-92f8-340a99775671",
        "sequence": 1,
        "statementText": "SELECT 1 AS id, 'blue' AS color",
        "status": "finished",
        "startTime": "2020-07-19T19:01:57.815Z",
        "stopTime": "2020-07-19T19:01:57.821Z",
        "durationMs": 6,
        "columns": [
          {
            "datatype": "number",
            "max": 1,
            "min": 1,
            "maxValueLength": 0,
            "name": "id"
          },
          {
            "datatype": "string",
            "max": null,
            "min": null,
            "maxValueLength": 4,
            "name": "color"
          }
        ],
        "rowCount": 1,
        "resultsPath": "results\\396\\396e8043-c766-4fec-b441-82dbcdf16473.json",
        "incomplete": false,
        "error": null,
        "createdAt": "2020-07-19T19:01:57.697Z",
        "updatedAt": "2020-07-19T19:01:57.828Z"
      }
    ]
  },
  "user": {
    "id": "d49295f7-29b8-4ba5-be10-218638d02af7",
    "name": null,
    "email": "[email protected]",
    "role": "admin",
    "createdAt": "2020-07-19T19:01:57.325Z"
  },
  "connection": {
    "id": "668489b8-6049-43a8-a7af-0f34abf1984c",
    "name": "test connection",
    "driver": "sqlite"
  }
}

Statement Created

Fires whenever a statement is created. A statement is an individual SQL statement within a batch.

Env: SQLPAD_WEBHOOK_STATEMENT_CREATED_URL

Payload Body:

{
  "action": "statement_created",
  "sqlpadUrl": "",
  "statement": {
    "id": "cce16e35-5b8f-442f-b7e8-e7fded25d02d",
    "batchId": "e11c9dde-53f8-4528-9b36-a889b90a70b7",
    "sequence": 1,
    "statementText": "SELECT 1 AS id, 'blue' AS color UNION ALL SELECT 2 AS id, 'red' AS color",
    "status": "queued",
    "startTime": null,
    "stopTime": null,
    "durationMs": null,
    "columns": null,
    "rowCount": null,
    "resultsPath": null,
    "incomplete": null,
    "error": null,
    "createdAt": "2020-07-19T22:31:09.050Z",
    "updatedAt": "2020-07-19T22:31:09.050Z"
  },
  "batch": {
    "id": "e11c9dde-53f8-4528-9b36-a889b90a70b7",
    "queryId": "81e68fcc-0876-449e-b2e6-03d4c087a054",
    "name": null,
    "connectionId": "e2b6a29d-4843-4062-8b12-ec1911979af5",
    "connectionClientId": null,
    "status": "started",
    "startTime": "2020-07-19T22:31:09.049Z",
    "stopTime": null,
    "durationMs": null,
    "batchText": "SELECT 1 AS id, 'blue' AS color UNION ALL SELECT 2 AS id, 'red' AS color",
    "selectedText": "SELECT 1 AS id, 'blue' AS color UNION ALL SELECT 2 AS id, 'red' AS color",
    "chart": null,
    "userId": "b478820a-1e0b-408f-8075-0f74baa74192",
    "createdAt": "2020-07-19T22:31:09.049Z",
    "updatedAt": "2020-07-19T22:31:09.049Z"
  },
  "user": {
    "id": "b478820a-1e0b-408f-8075-0f74baa74192",
    "name": null,
    "email": "[email protected]",
    "role": "admin",
    "createdAt": "2020-07-19T22:31:08.704Z"
  },
  "connection": {
    "id": "e2b6a29d-4843-4062-8b12-ec1911979af5",
    "name": "test connection",
    "driver": "sqlite"
  }
}

Statement Finished

Fires whenever a statement finishes running. A statement finished payload contains results for success, an error for failure

Env: SQLPAD_WEBHOOK_STATEMENT_FINISHED_URL

Payload Body (success):

{
  "action": "statement_finished",
  "sqlpadUrl": "",
  "statement": {
    "id": "ab466a92-0282-489b-9222-ff70ba9c846f",
    "batchId": "f35b21e7-1f96-49d0-a4ef-3a3e8e5f3266",
    "sequence": 1,
    "statementText": "SELECT 1 AS id, 'blue' AS color UNION ALL SELECT 2 AS id, 'red' AS color",
    "status": "finished",
    "startTime": "2020-07-19T22:26:06.826Z",
    "stopTime": "2020-07-19T22:26:06.831Z",
    "durationMs": 5,
    "columns": [
      {
        "datatype": "number",
        "max": 2,
        "min": 1,
        "maxValueLength": 0,
        "name": "id"
      },
      {
        "datatype": "string",
        "max": null,
        "min": null,
        "maxValueLength": 4,
        "name": "color"
      }
    ],
    "rowCount": 2,
    "resultsPath": "results\\ab4\\ab466a92-0282-489b-9222-ff70ba9c846f.json",
    "incomplete": false,
    "error": null,
    "createdAt": "2020-07-19T22:26:06.738Z",
    "updatedAt": "2020-07-19T22:26:06.835Z"
  },
  "batch": {
    "id": "f35b21e7-1f96-49d0-a4ef-3a3e8e5f3266",
    "queryId": "b53c73a9-79f9-4239-a6be-22fe1937b909",
    "name": null,
    "connectionId": "c9830ffb-a9f3-4e18-a040-5d4ae9011537",
    "connectionClientId": null,
    "status": "started",
    "startTime": "2020-07-19T22:26:06.736Z",
    "stopTime": null,
    "durationMs": null,
    "batchText": "SELECT 1 AS id, 'blue' AS color UNION ALL SELECT 2 AS id, 'red' AS color",
    "selectedText": "SELECT 1 AS id, 'blue' AS color UNION ALL SELECT 2 AS id, 'red' AS color",
    "chart": null,
    "userId": "2ff31b6d-4519-4e3f-912d-e6c54ad1d8c1",
    "createdAt": "2020-07-19T22:26:06.737Z",
    "updatedAt": "2020-07-19T22:26:06.737Z"
  },
  "user": {
    "id": "2ff31b6d-4519-4e3f-912d-e6c54ad1d8c1",
    "name": null,
    "email": "[email protected]",
    "role": "admin",
    "createdAt": "2020-07-19T22:26:06.433Z"
  },
  "connection": {
    "id": "c9830ffb-a9f3-4e18-a040-5d4ae9011537",
    "name": "test connection",
    "driver": "sqlite"
  },
  "results": [
    [1, "blue"],
    [2, "red"]
  ]
}

Payload Body (error):

{
  "action": "statement_finished",
  "sqlpadUrl": "",
  "statement": {
    "id": "80f4ae01-e804-4962-8e78-239e32ba8d58",
    "batchId": "004df93e-4b78-4896-b929-4e3f9be850f9",
    "sequence": 1,
    "statementText": "SELECT 1 AS id, 'blue' AS color UNION ALL SELECT 2 AS id, 'red' AS color UNION ALL",
    "status": "error",
    "startTime": "2020-07-19T22:29:36.967Z",
    "stopTime": "2020-07-19T22:29:36.972Z",
    "durationMs": 5,
    "columns": null,
    "rowCount": null,
    "resultsPath": null,
    "incomplete": null,
    "error": {
      "title": "SQLITE_ERROR: incomplete input"
    },
    "createdAt": "2020-07-19T22:29:36.859Z",
    "updatedAt": "2020-07-19T22:29:36.973Z"
  },
  "batch": {
    "id": "004df93e-4b78-4896-b929-4e3f9be850f9",
    "queryId": "73d11915-0a8e-4a70-9b14-c11f4bc05573",
    "name": null,
    "connectionId": "ef19eae5-d91c-4d5c-abd9-19841d9f0250",
    "connectionClientId": null,
    "status": "error",
    "startTime": "2020-07-19T22:29:36.857Z",
    "stopTime": "2020-07-19T22:29:36.972Z",
    "durationMs": 5,
    "batchText": "SELECT 1 AS id, 'blue' AS color UNION ALL SELECT 2 AS id, 'red' AS color UNION ALL",
    "selectedText": "SELECT 1 AS id, 'blue' AS color UNION ALL SELECT 2 AS id, 'red' AS color UNION ALL",
    "chart": null,
    "userId": "7a2823c7-fb1e-41ed-841d-fd1ba0a0a1dc",
    "createdAt": "2020-07-19T22:29:36.858Z",
    "updatedAt": "2020-07-19T22:29:36.974Z"
  },
  "user": {
    "id": "7a2823c7-fb1e-41ed-841d-fd1ba0a0a1dc",
    "name": null,
    "email": "[email protected]",
    "role": "admin",
    "createdAt": "2020-07-19T22:29:36.517Z"
  },
  "connection": {
    "id": "ef19eae5-d91c-4d5c-abd9-19841d9f0250",
    "name": "test connection",
    "driver": "sqlite"
  },
  "results": []
}