Delivery Approval (Deprecated) (v1)

Validate recipients in your 3rd party system before content gets sent

Since this extension point is being deprecated, this guide will only serve to demonstrate the differences between v1 and v2. Overlap in design / intent / functionality are not documented here

❗️

Deprecated

This extension point is currently still usable and we continue to support apps that are already configured with this version. In the future this extension point will no longer be available for new configurations.

Authentication

How can your app validate this call is being made from a valid Seismic user?

This v1 extension point supports a few different methods for authentication, which are controlled via the extension point settings within your app. The details of your Authentication method are include in a header field: "authorization"

Custom Header

This is a hard-coded field that you will receive in the header to validate this request

  • Extension configuration fields:
    • "Auth Type is either 'basic', 'clientcert', or 'header'"
      • Enter "header"
    • "When AuthType is set to 'header' enter a header key is required"
      * enter any string value
      When receiving the call from Seismic the header field: "authorization" contains the value that you've input in the field: "When AuthType is set to 'header' enter a header key is required".
    • Sample: authorization: "abcd1234"

Basic Auth

This is hard-coding the user credentials that you will receive in the header to validate this request

  • Extension configuration fields:
    • "Auth Type is either 'basic', 'clientcert', or 'header'"
      • Enter "basic"
    • "Basic auth's user name"
      • Enter the username to receive
    • "Basic auth's password"
      * Enter the password to receive
      When receiving the call from Seismic the header field: "authorization" contains "Basic "+the base 64 encoded credentials you have input above.
  • Sample: authorization: "Basic dGVzdEVtYWlsQHNlaXNtaWMuY29tOnRlc3RwYXNzd29yZA"
744744

The v1 configuration page

Payload

The payloads between v1 and v2 are nearly identical.

  • The v1 extension point is missing the field "appId"
  • "extensionPoint" : "delivery-approval-v1"
{
    "extensionPoint": "delivery-approval-v1",
    "tenantName": "jurassicpark",
    "tenant": "2438562c-da5f-4b58-b724-d9d7e22cfbf2",
    "occurredAt": "2018-02-04T01:23:17Z",
    "data": {
       "user": {
            "id": "57a0479900-504cb3ab4a1f-626d174d2d"
       },
       "delivery": {
            "type": "email",
            "details": {
                // these will be different based on delivery type
                "containsAttachments": false,
            },
            "formInformation": {
               // anything
            },
            "recipients": [{
                "id": "309ee150-d8ce-40a6-986a-e5efbc109728",
                "firstName": "Joe",
                "lastName": "Demo",
                "emailAddress": "[email protected]",
                 // context that only applies to this recipient
                 "context": [{
                    "systemType": "salesforce",
                    "systemId": null, // this always null for now
                    "contextType": "opportunity",
                    "contextName": "my opportunity",
                    "contextId": "some identifier",
                    "fields": {
                      // flat list of key values configured for this tenant, delivery type, and context type
                    }
                  }]
            }],
            "content": [{
                "repository": "doccenter",
                "type": "file",
                "name": "Brand Values",
                "libraryContent": {
                    "teamsiteId": "b9d85988-17f4-4994-82db-1ea46886046a",
                    "id": "3c3ffbb2-86ad-44d7-b692-b32c9b743ec7",
                    "versionId": "94bb9bd9-4e5e-4ee2-99f0-749a9ce422d2"
                },
                "contentProfileId": "b9d85988-17f4-4994-82db-1ea46886046a",
                "contentProfilePath": ["by Industry", "Non-Profit"]
            }, {
                "repository": "library",
                "type": "template",
                "name": "Brand Values",
                "teamsiteId": "b9d85988-17f4-4994-82db-1ea46886046a",
                "id": "b9d85988-17f4-4994-82db-1ea46886046a",
                "versionId": "b9d85988-17f4-4994-82db-1ea46886046a"
            }, {
                "repository": "workspace",
                "type": "file",
                "name": "Brand Values",
                "id": "b9d85988-17f4-4994-82db-1ea46886046a",
                "versionId": "b9d85988-17f4-4994-82db-1ea46886046a"
            }],
            // context that applies to the whole interaction
            "context": [{
                "systemType": "salesforce",
                "systemId": null, // this always null for now
                "contextType": "opportunity",
                "contextName": "my opportunity",
                "contextId": "some identifier",
                "fields": {
                  // flat list of key values configured for this tenant, delivery type, and context type
                }
          }]
       },
        "clientDetails": {
            "sessionId": "",
            "ipAddress": "74.62.18.18",
            "productArea": "doccenter",
            "deviceType": "pc",
            "browser": "chrome",
            "browserVersion": "",
            "operatingSystem": "windows",
            "operatingSystemVersion": "",
            "locale": ""
        }
    }
}

How to configure

Configure the UI Extension Point

  • From your app settings within App Registration, navigate to the Extension Points page
    • Click +Add
    • Select Delivery Approval (Deprecated) from the list
  • Fill out the fields
    • Extension Instance Name - A Name that references this usage of this extension point within your app
    • The URL of the Delivery Approval Consent Provider - The URL that we will post the payload to
    • Auth Type - supports a value of 'basic', 'clientcert', or 'header'
    • Basic auth's user name - when using 'basic' auth type, provide the user name to be used in conjunction with this functionality
    • Basic auth's password - password for the user provided in 'Basic auth user name'
    • When AuthType is set to 'header' enter a header key is required - this is for the Custom header authorization described above
    • Click Save Changes

Enable the DeliveryApprovalV2 Extension Point

  • After your extension point is created and saved, enable it by clicking the slider under Extension Points > Is Enabled?
  • Click Save Changes

Security & Authentication

It is recommended that you validate the Signing Secret in the POST request that Seismic is making to your URL.

📘

v2 Changelog

The v1 Delivery Approval extension supported a custom header and basic auth modes. These have been retired in favor of the Signing Secret auth pattern

Payloads

Outbound payload from Seismic to your endpoint

{
    "extensionPoint": "delivery-approval-v2",
    "tenantName": "jurassicpark",
    "tenant": "2438562c-da5f-4b58-b724-d9d7e22cfbf2",
    "occurredAt": "2018-02-04T01:23:17Z",
    "data": {
       "user": {
            "id": "57a0479900-504cb3ab4a1f-626d174d2d"
       },
       "delivery": {
            "type": "email",
            "details": {
                // these will be different based on delivery type
                "containsAttachments": false,
            },
            "formInformation": {
               // anything
            },
            "recipients": [{
                "id": "309ee150-d8ce-40a6-986a-e5efbc109728",
                "firstName": "Joe",
                "lastName": "Demo",
                "emailAddress": "[email protected]",
                 // context that only applies to this recipient
                 "context": [{
                    "systemType": "salesforce",
                    "systemId": null, // this always null for now
                    "contextType": "opportunity",
                    "contextName": "my opportunity",
                    "contextId": "some identifier",
                    "fields": {
                      // flat list of key values configured for this tenant, delivery type, and context type
                    }
                  }]
            }],
            "content": [{
                "repository": "doccenter",
                "type": "file",
                "name": "Brand Values",
                "libraryContent": {
                    "teamsiteId": "b9d85988-17f4-4994-82db-1ea46886046a",
                    "id": "3c3ffbb2-86ad-44d7-b692-b32c9b743ec7",
                    "versionId": "94bb9bd9-4e5e-4ee2-99f0-749a9ce422d2"
                },
                "contentProfileId": "b9d85988-17f4-4994-82db-1ea46886046a",
                "contentProfilePath": ["by Industry", "Non-Profit"]
            }, {
                "repository": "library",
                "type": "template",
                "name": "Brand Values",
                "teamsiteId": "b9d85988-17f4-4994-82db-1ea46886046a",
                "id": "b9d85988-17f4-4994-82db-1ea46886046a",
                "versionId": "b9d85988-17f4-4994-82db-1ea46886046a"
            }, {
                "repository": "workspace",
                "type": "file",
                "name": "Brand Values",
                "id": "b9d85988-17f4-4994-82db-1ea46886046a",
                "versionId": "b9d85988-17f4-4994-82db-1ea46886046a"
            }],
            // context that applies to the whole interaction
            "context": [{
                "systemType": "salesforce",
                "systemId": null, // this always null for now
                "contextType": "opportunity",
                "contextName": "my opportunity",
                "contextId": "some identifier",
                "fields": {
                  // flat list of key values configured for this tenant, delivery type, and context type
                }
          }]
       },
        "clientDetails": {
            "sessionId": "",
            "ipAddress": "74.62.18.18",
            "productArea": "doccenter",
            "deviceType": "pc",
            "browser": "chrome",
            "browserVersion": "",
            "operatingSystem": "windows",
            "operatingSystemVersion": "",
            "locale": ""
        }
    }
}

❗️

Content Properties

Content selected through the 'Paper Airplane' icon does not include content properties in the payload, whereas content that is added from the "+Add" button does have content properties in the payload. We are currently investigating a path forward.
Until this is addressed your app should not rely on Content Properties at this time