Setting up Webhooks

Webhooks allow you to create integrations that subscribe to certain events in Pipe. When one of those events happens, we’ll trigger a webhook that’ll send (POST) the event data to the webhook’s URL. Pipe allows webhook URLs with up to 200 characters in length.

Webhooks can be used to receive & save information about new recordings to your database, trigger a copy action to your own storage, or execute any other code.

Multiple webhooks can be set on each environment and each webhook can be triggered on multiple events.

Setting up your first webhook

Go to your account and click on the Webhooks tab. To add a new webhook simply click on the Add New Webhook button. You will be taken to the webhook setup page:

Setting up a webhook in Pipe account dashboard

Webhook Events

There are 6 events in a recording’s timeline you can subscribe to with each webhook:

  • video_recorded: sent as soon as a new recording is finished, saved to our database, and a virtual worker has been assigned to process it (recording is not yet processed or pushed to storage).
  • video_converted: sent right after a recording is converted to .mp4. If the mp4 output is disabled in the Transcoding Engine, this webhook will not be sent.
  • video_copied_pipe_s3: sent right after a recording is successfully pushed to Pipe’s complimentary long-term storage (Amazon S3 or Scaleway).
  • video_copied_ftp: sent right after a recording is successfully pushed to your SFTP or FTP(S) storage.
  • video_copied_s3: sent right after a recording is successfully pushed to your S3 storage.
  • video_copied_dbox sent right after a recording is successfully pushed to your Dropbox account.

Data Sent

Data can be sent with one of the two following Content-Type headers:

  • application/json: the JSON data will be sent directly as the body of the POST request. This is great if you wish to integrate with services like AWS Lambda.
  • application/x-www-form-urlencoded: a payload parameter containing the JSON data about the event will be sent through POST.

Application/JSON

With every webhook event, JSON encoded data will be sent through POST to the specified URL as the request’s body with the Content-Type header set to application/json. Here are a few examples of what you can expect:

video_recorded

{
    "version":"1.0",
    "event":"video_recorded",
    "data":{
        "videoName":"STREAM_NAME",
        "audioCodec":"Opus",
        "videoCodec":"H.264",
        "type":"webm",
        "id":34746075,
        "payload":"your payload data string",
        "httpReferer":"http://site_from_where_video_was_recorded.com",
        "cam_name":"Logitech HD Pro Webcam C920 (046d:082d)",
        "mic_name":"Default",
        "ip":"91.16.93.181",
        "ua":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Mobile Safari/537.36",
        "dateTime":"2016-03-03 15:51:44",
        "timeZone":"Europe/Bucharest"
    }
}

video_converted

{
    "version":"1.0",
    "event":"video_converted",
    "data":{
        "videoName":"STREAM_NAME",
        "duration":"7.56",
        "audioCodec":"AAC",
        "videoCodec":"H.264",
        "type":"mp4",
        "size":194373,
        "width":"320",
        "height":"240",
        "orientation":"landscape",
        "id":34745986,
        "payload":"your payload data string",
        "dateTime": "2015-10-10 16:00:36",
        "timeZone":"Europe/Bucharest"
    }
}

video_copied_pipe_s3:

{
    "version":"1.0",
    "event":"video_copied_pipe_s3",
    "data":{
        "storedStatus":"stored successful",
        "videoName":"STREAM_NAME",
        "size":194373,
        "checksum_md5":"968302a32f7c7ed67523274aa8a92717",
        "checksum_sha1":"b733ec235ea57119172c8b044220e793446063fe",
        "id":123,
        "url":"https://addpipevideos.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.mp4",
        "rawRecordingUrl":"https://addpipevideos.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_raw.EXTENSION",
        "snapshotUrl":"https://addpipevideos.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.jpg",
        "filmstripUrl":"https://addpipevideos.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_filmstrip.jpg",
        "cdn":{"cdnRecordingUrl":"https://recordings-eu.addpipe.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.mp4",
            "cdnRawRecordingUrl":"https://recordings-eu.addpipe.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_raw.EXTENSION",
            "cdnSnapshotUrl":"https://recordings-eu.addpipe.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.jpg",
            "cdnFilmstripUrl":"https://recordings-eu.addpipe.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_filmstrip.jpg"},
        "bucket":"eu1-addpipe",
        "region":"eu-central-1",
        "payload":"your payload data string",
    }
}

video_copied_ftp

{
    "version":"1.0",
    "event":"video_copied_ftp",
    "data":{
        "ftpUploadStatus":"upload success",
        "protocol":"ftp",
        "videoName":"STREAM_NAME",
        "type":"mp4",
        "size":493534,
        "checksum_md5":"968302a32f7c7ed67523274aa8a92717",
        "checksum_sha1":"b733ec235ea57119172c8b044220e793446063fe",
        "id":34746576,
        "payload":"your payload data string"
    }
}

video_copied_s3:

{
    "version":"1.0",
    "event":"video_copied_s3",
    "data":{
        "s3UploadStatus":"upload success",
        "videoName":"STREAM_NAME",
        "type":"mp4",
        "size":493534,
        "checksum_md5":"968302a32f7c7ed67523274aa8a92717",
        "checksum_sha1":"b733ec235ea57119172c8b044220e793446063fe",
        "id":123,
        "url":"https://bucketname.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.mp4",
        "rawRecordingUrl":"https://bucketname.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_raw.EXTENSION",
        "snapshotUrl":"https://bucketname.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.jpg",
        "filmstripUrl":"https://bucketname.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_filmstrip.jpg",
        "bucket":"bucketname",
        "region":"us-east-1",
        "acl":"public-read",
        "payload":"your payload data string"
    }
}

video_copied_dbox:

{
    "version":"1.0",
    "event":"video_copied_dbox",
    "data":{
        "dboxUploadStatus":"upload success",
        "videoName":"STREAM_NAME",
        "type":"mp4",
        "size":493534,
        "checksum_md5":"968302a32f7c7ed67523274aa8a92717",
        "checksum_sha1":"b733ec235ea57119172c8b044220e793446063fe",
        "id":123,
        "payload":"your payload data string"
    }
}

Application/x-www-from-urlencoded

With every webhook event, a variable named payload will be sent (POST-ed) to the specified URL with the Content-Type header set to application/x-www-form-urlencoded. The value of the payload variable will be different for each event type. Here are a few examples of what you can expect:

video_recorded

payload={
    "version":"1.0",
    "event":"video_recorded",
    "data":{
        "videoName":"STREAM_NAME",
        "audioCodec":"Opus",
        "videoCodec":"H.264",
        "type":"webm",
        "id":34746075,
        "payload":"your payload data string",
        "httpReferer":"http://site_from_where_video_was_recorded.com",
        "cam_name":"Logitech HD Pro Webcam C920 (046d:082d)",
        "mic_name":"Default",
        "ip":"91.16.93.181",
        "ua":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Mobile Safari/537.36",
        "dateTime":"2016-03-03 15:51:44",
        "timeZone":"Europe/Bucharest"
    }
}

video_converted

payload={
    "version":"1.0",
    "event":"video_converted",
    "data":{
        "videoName":"STREAM_NAME",
        "duration":"7.56",
        "audioCodec":"AAC",
        "videoCodec":"H.264",
        "type":"mp4",
        "size":194373,
        "width":"320",
        "height":"240",
        "orientation":"landscape",
        "id":34745986,
        "payload":"your payload data string",
        "dateTime": "2015-10-10 16:00:36",
        "timeZone":"Europe/Bucharest"
    }
}

video_copied_pipe_s3

payload={
    "version":"1.0",
    "event":"video_copied_pipe_s3",
    "data":{
        "storedStatus":"stored successful",
        "videoName":"STREAM_NAME",
        "size":194373,
        "checksum_md5":"968302a32f7c7ed67523274aa8a92717",
        "checksum_sha1":"b733ec235ea57119172c8b044220e793446063fe",
        "id":123,
        "url":"https://addpipevideos.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.mp4",
        "rawRecordingUrl":"https://addpipevideos.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_raw.EXTENSION",
        "snapshotUrl":"https://addpipevideos.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.jpg",
        "filmstripUrl":"https://addpipevideos.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_filmstrip.jpg",
        "cdn":{"cdnRecordingUrl":"https://recordings-eu.addpipe.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.mp4",
            "cdnRawRecordingUrl":"https://recordings-eu.addpipe.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_raw.EXTENSION",
            "cdnSnapshotUrl":"https://recordings-eu.addpipe.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.jpg",
            "cdnFilmstripUrl":"https://recordings-eu.addpipe.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_filmstrip.jpg"},
        "bucket":"eu1-addpipe",
        "region":"eu-central-1",
        "payload":"your payload data string",
    }
}

video_copied_ftp

payload={
    "version":"1.0",
    "event":"video_copied_ftp",
    "data":{
        "ftpUploadStatus":"upload success",
        "protocol":"ftp",
        "videoName":"STREAM_NAME",
        "type":"mp4",
        "size":493534,
        "checksum_md5":"968302a32f7c7ed67523274aa8a92717",
        "checksum_sha1":"b733ec235ea57119172c8b044220e793446063fe",
        "id":34746576,
        "payload":"your payload data string"
    }
}

video_copied_s3

payload={
    "version":"1.0",
    "event":"video_copied_s3",
    "data":{
        "s3UploadStatus":"upload success",
        "videoName":"STREAM_NAME",
        "type":"mp4",
        "size":493534,
        "checksum_md5":"968302a32f7c7ed67523274aa8a92717",
        "checksum_sha1":"b733ec235ea57119172c8b044220e793446063fe",
        "id":123,
        "url":"https://bucketname.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.mp4",
        "rawRecordingUrl":"https://bucketname.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_raw.EXTENSION",
        "snapshotUrl":"https://bucketname.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME.jpg",
        "filmstripUrl":"https://bucketname.s3.amazonaws.com/b8e2f5bfd04a93b434bd8c740bff744d/STREAM_NAME_filmstrip.jpg",
        "bucket":"bucketname",
        "region":"us-east-1",
        "acl":"public-read",
        "payload":"your payload data string"
    }
}

video_copied_dbox

payload={
    "version":"1.0",
    "event":"video_copied_dbox",
    "data":{
        "dboxUploadStatus":"upload success",
        "videoName":"STREAM_NAME",
        "type":"mp4",
        "size":493534,
        "checksum_md5":"968302a32f7c7ed67523274aa8a92717",
        "checksum_sha1":"b733ec235ea57119172c8b044220e793446063fe",
        "id":123,
        "payload":"your payload data string"
    }
}

Handling the Data

Application/JSON

With application/json the webhook will deliver the JSON data directly as the body of the POST request.

PHP

In PHP, for example, you can retrieve the raw JSON data with php://input:

$data = file_get_contents("php://input");
$jsonData = json_decode($data, true);

Here’s a more extensive PHP example

//we get the JSON data from the POST, that is being sent as is
$body = file_get_contents("php://input");

//the data is JSON encoded, so we must decode it in an associative array
$jsonData = json_decode($body, true);

//you can get the webhook type by accessing the event element in the array
$event_type = $jsonData["event"];

//if you wish to get the name of the recording you simply access it like this
$recordingName = $jsonData["data"]["videoName"]

Decoding the JSON data of the video_converted webhook, like in the example above, will make it easily accessible in an associative array similar to the one shown here:

Array
(
    [version] => 1.0
    [event] => video_converted
    [data] => Array
        (
            [videoName] => vsrtc1501002174_491
            [duration] => 3.48
            [audioCodec] => AAC
            [videoCodec] => H.264
            [type] => MP4
            [size] => 442101
            [width] => 1280
            [height] => 720
            [orientation] => landscape
            [id] => 451464
            [dateTime] => 2017-07-25 20:03:05
            [timeZone] => Europe/Bucharest
            [payload] => {"userId":"55a95eeb936dd30100e0aff6","jobId":"55a7e6555f1bdc010014d6a1", "email":"asdasd@adasdae.com", "link":"https://www.amazon.com/D-G-P-4-W/dp/ref=as_li_ss_tl?ie=UTF8"}
        )

)

.NET

In .NET Request.InputStream retrieves the raw JSON data.

Ruby

In Ruby on Rails request.raw_post can retrieve the raw JSON data.

Application/x-www-form-urlencoded

With application/x-www-form-urlencoded the data is URL encoded in transit. This means that depending on the specific function of the programming language you are using, you will either be working with the raw URL-encoded data or the URL-decoded data. Also, keep in mind, with this content type, the JSON data will be sent as the value of a form parameter called payload.

Some examples:

PHP

In PHP, if you are using php://input for receiving the data, you will be working with the raw URL encoded data, but if you are using $_POST["payload"] for receiving the data, it will automatically be URL decoded.

//we get the URL encoded payload data from POST
$payload = $_POST["payload"];

//the data is JSON encoded, so we must decode it in an associative array
$jsonData = json_decode($payload, true);

//you can get the webhook type by accessing the event element in the array
$event_type = $jsonData["event"];

//if you wish to get the name of the recording you simply access it like this
$recordingName = $jsonData["data"]["videoName"]

The JSON data is sent with the video_converted webhook as the value of the payload POST parameter. Getting and decoding the data like in the example above, will make it easily accessible in an associative array similar to the one shown here:

Array
(
    [version] => 1.0
    [event] => video_converted
    [data] => Array
        (
            [videoName] => vsrtc1501002174_491
            [duration] => 3.48
            [audioCodec] => AAC
            [videoCodec] => H.264
            [type] => MP4
            [size] => 442101
            [width] => 1280
            [height] => 720
            [orientation] => landscape
            [id] => 451464
            [dateTime] => 2017-07-25 20:03:05
            [timeZone] => Europe/Bucharest
            [payload] => {"userId":"55a95eeb936dd30100e0aff6","jobId":"55a7e6555f1bdc010014d6a1", "email":"asdasd@adasdae.com", "link":"https://www.amazon.com/D-G-P-4-W/dp/ref=as_li_ss_tl?ie=UTF8"}
        )

)

.NET

In .NET Request.InputStream will receive the raw URL encoded data while Request.Form["payload"] will automatically URL decode the data.

Ruby

In Ruby on Rails request.raw_post will receive the raw URL encoded data while params["payload"] will automatically URL decode the data.

Here’s an example of the video_recorded event data being received in two possible ways.

Raw POST data (URL encoded)

payload%7B%22version%22%3A%221.0%22%2C%22event
%22%3A%22video_recorded%22%2C%22data%22%3A%7B%22
videoName%22%3A%22vs1457013120534_862
%22%2C%22audioCodec%22%3A%22NellyMoser%20ASAO
%22%2C%22videoCodec%22%3A%22H.264%22%2C%22
type%22%3A%22FLV%22%2C%22id%22%3A%22123%22%2C%22d
ateTime%22%3A%222016-03-03%2015%3A51%3A44%22%2C%22
timeZone%22%3A%22Europe%2FBucharest%22%2C%22
payload%22%3A%22your%20payload%20data%20string%22%2C%22
httpReferer%22%3A%22http%3A%2F%2F
your_site.com%22%7D%7D

Value of payload var (URL decoded)

{
    "version":"1.0",
    "event":"video_recorded",
    "data":{
        "videoName":"vs1457013120534_862",
        "audioCodec":"NellyMoser ASAO",
        "videoCodec":"H.264",
        "type":"FLV",
        "id":123,
        "dateTime":"2016-03-03 15:51:44",
        "timeZone":"Europe/Bucharest",
        "payload":"your payload data string",
        "httpReferer":"http://your_site.com"
    }
}

Every Parameter Explained

Let’s talk about the information sent by these webhooks

version contains the current version of the Pipe’s webhook API.

event contains the name of the event that triggered this call

videoName contains the name of the recording

duration contains the duration in seconds with two decimals

audioCodec contains the audio codec used in the original video (video_recorded) or in the final video (video_converted)

videoCodec contains the video codec used in the original video (video_recorded) or in the final video (video_converted). For an audio-only recording, it will have the value “no_video”.

type

  • For the video_recorded event, it is the original recording file type.
  • For the video_converted event, it is the processed recording file type (mp4).
  • For the remaining webhook events (storage webhooks), it is the processed recording file type (mp4). If the mp4 output is disabled in the Transcoding Engine, the value is the original recording type.

type is the original recording file type. This can give you a clue on where this recording is coming from. For example, an iPhone will produce .mov files through the Mobile Native Recording Client while the Desktop Recording Client will produce .webm files when capturing directly from the camera.

size is the size in bytes

checksum_md5 contains the 32 characters md5 hash checksum of the final processed mp4 recording file. If the mp4 output is disabled in the Transcoding Engine, the value will be for the original recording.

checksum_sha1 contains the 40 characters sha-1 hash checksum of the final processed mp4 recording file. If the mp4 output is disabled in the Transcoding Engine, the value will be for the original recording.

width and height represent the size of the original recording. This can also give you a clue about the device the recording is coming from. For an audio-only recording, they will have the value 0.

orientation represents the orientation of the device when the recording was made. This could be either “landscape”, “portrait”, or “none”. For an audio-only recording, it will have the value “none”.

id is the ID of the recording as you will find it in your Pipe account dashboard and as it is stored in our database.

dateTime is the date and time relative to your set timezone at which the recording has been inserted in the database (video_recorded) or has finished converting (video_converted).

timeZone represents your selected time zone in the account settings.

url

  • For the video_copied_pipe_s3 event, it is the full path to where the MP4 recording is located on our S3 storage. If the MP4 output is not enabled this field will be an empty string.

For the video_copied_s3 event, it is the full path to where the MP4 recording is located on your S3 bucket. If the MP4 output is not enabled this field will be an empty string.

rawRecordingUrl

  • For the video_copied_pipe_s3 event, it is the full path to where the original recording is located on our S3 storage. If the original recording output is not enabled this field will be an empty string.

  • For the video_copied_s3 event, it is the full path to where the original recording is located on your S3 bucket. If the original recording output is not enabled this field will be an empty string.

snapshotUrl

  • For the video_copied_pipe_s3 event, it is the full path to where the snapshot is located on our S3 storage. If the snapshot output is not enabled this will be an empty string. For an audio-only recording, it will have the value “audio_file”.

  • For the video_copied_s3 event, it is the full path to where the snapshot is located on your S3 bucket. If the snapshot output is not enabled this will be an empty string. For an audio-only recording, it will have the value “audio_only”.

filmstripUrl

  • For the video_copied_pipe_s3 event, it is the full path to where the filmstrip is located on our S3 storage. If the filmstrip output is not enabled this will be an empty string. For an audio-only recording, it will have the value “audio_file”.

  • For the video_copied_s3 event, it is the full path to where the filmstrip is located on your S3 bucket. If the filmstrip output is not enabled this will be an empty string. For an audio-only recording, it will have the value “audio_only”.

cdn is the object containing all the CDN URLs for each of the recording outputs. Depending on the S3 origin region, the CDN links will have different specific subdomains: recordings-eu.addpipe.com (EU1), recordings-us.addpipe.com (US1) or recordings-us2.addpipe.com (US2). The URLs are in sync with the S3 (origin) URLs. The CDN URLs for each output are named as follows: cdnRecordingUrl, cdnRawRecordingUrl, cdnSnapshotUrl, and cdnFilmstripUrl.

payload is the payload data in string format that can attached to each embedded recording client. Find out more in the attaching custom data section. If no payload is attached, the value will be an empty string.

storedStatus is the status of the upload to Pipe’s complimentary storage.

ftpUploadStatus is the status of the upload through SFTP or FTP(S).

s3UploadStatus is the status of the S3 upload.

bucketname is the name of the S3 bucket.

region is the region of the S3 bucket.

acl is the Amazon S3 Canned Access Control List.

dboxUploadStatus is the status of the Dropbox upload.

httpReferer is the link to the site from which the recording was made.

protocol can take two values: ftp or sftp.

Webhook Schedule

The Webhook schedule section shows the list of events we’ve sent data for. Events from the last 72 hours are shown for accounts with Standard subscriptions and from the last 30 days for accounts with PRO subscriptions.

If you have a webhook configured to fire for more than one event, each event will show up in this section. Events are added to this list as the recording goes through our processing pipeline.

If the first attempt of firing the webhook for an event runs into an issue/problem, you can always use this section to re-send the webhook for that particular event. You can also re-send webhooks if you just need them to be sent more than once. For each firing of a webhook, a log entry will be created in the webhook logs section.

The following information is available in the webhook schedule table:

Recording IDThe ID of the recording for which the webhook was scheduled
Date & timeThe date and time the first attempt was made
Event typeThe event that triggered the webhook
Last HTTP statusThe status of the last webhook firing
URLThe URL of your webhook handler
Request Headers & Request BodyThe request headers and request body that were sent when the webhook was fired
RetryA retry button for the particular webhook
AttemptsThe number of firing attempts that were made for the particular webhook

Webhook Logs

The Webhook logs section shows the logs associated with events from the last 72 hours (accounts with Standard subscriptions) or 30 days (accounts with PRO subscription). Each attempt to push data to your webhook URL for a particular event has an entry here.

For example, a recording was converted and the video_converted webhook that you have set up has been immediately scheduled and fired but for some reason, your webhook code fails to run correctly and it ends up responding with a 500 Internal Error HTTP status. You manually re-send the webhook from the schedule section. This time, your webhook handling code correctly processes the data.

In the above example, a total of 2 log entries will be created for the same webhook event:

  1. a log for the initial attempt that failed
  2. a log for the 2nd attempt that resulted in a successful execution of your code.

The following information is available in the webhook logs table:

Date & timeThe date and time at which the log entry was created
Recording IDThe ID of the recording for which the webhook was fired and logged
Connection statusThe initial webhook call status. A ✓ will be shown if everything was successful, otherwise, an error code will be shown.
SSL statusThe verification status for the certificate of the server to which the webhook call is made. A ✓ will be shown if everything was successful, otherwise, an SSL status code will be shown.
HTTP statusThe HTTP status resulted from the webhook firing
URLThe URL of your webhook handler
Response timeThe time (in milliseconds ) it took for your webhook handler to respond to the webhook firing
Event typeThe event that triggered the webhook
Request Headers & Request BodyThe request headers and request body that were sent when the webhook was fired
Response Headers & Response BodyThe response headers and response body that were received from your webhook handler

SSL Status Codes

The table in the webhook logs section has a column named “SSL status”. This is what the numeric status codes in that column (if any) mean:

Error CodeError Description
0ok the operation was successful
2unable to get issuer certificate
3unable to get certificate CRL
4unable to decrypt the certificate’s signature
5unable to decrypt CRL’s signature
6unable to decode issuer public key
7certificate signature failure
8CRL signature failure
9the certificate is not yet valid
10certificate has expired
11CRL is not yet valid
12CRL has expired
13format error in the certificate’s notBefore field
14format error in the certificate’s notAfter field
15format error in CRL’s lastUpdate field
16format error in CRL’s nextUpdate field
17out of memory
18self-signed certificate
19self-signed certificate in the certificate chain
20unable to get local issuer certificate
21unable to verify the first certificate
22certificate chain too long
23certificate revoked
24invalid CA certificate
25path length constraint exceeded
26unsupported certificate purpose
27certificate not trusted
28certificate rejected
29subject issuer mismatch
30authority and subject key identifier mismatch
31authority and issuer serial number mismatch
32key usage does not include certificate signing
50application verification failure

Integrating with AWS Lambda

A recent update to the Pipe webhook system made it possible to send webhooks with a content-type of application/json, enabling effortless integration with serverless platforms like AWS Lambda.

A tutorial on how to integrate the Pipe Platform with a AWS Lambda using webhooks is available on the blog.