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:
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 thePOST
request. This is great if you wish to integrate with services like AWS Lambda.application/x-www-form-urlencoded
: apayload
parameter containing the JSON data about the event will be sent throughPOST
.
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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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,
"envCode":"dyLms4",
"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
[envCode] => dyLms4
[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
[envCode] => dyLms4
[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%22
envCode%22%3A%22dyLms4%22%2C%0A%20%20%20%20%20%20%20%20%22
dateTime%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,
"envCode":"dyLms4",
"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.
envCode
is the unique alphanumeric string identifier of the environment where the recording was made. You can find this in your Pipe account dashboard in the environment settings.
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 or active trial period.
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 ID | The ID of the recording for which the webhook was scheduled |
Date & time | The date and time the first attempt was made |
Event type | The event that triggered the webhook |
Last HTTP status | The status of the last webhook firing |
URL | The URL of your webhook handler |
Request Headers & Request Body | The request headers and request body that were sent when the webhook was fired |
Retry | A retry button for the particular webhook |
Attempts | The number of firing attempts that were made for the particular webhook |
The entries in the scheduled webhooks table (and the associated webhook logs) are kept for 30 days.
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 or active trial period). 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:
- a log for the initial attempt that failed
- 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 & time | The date and time at which the log entry was created |
Recording ID | The ID of the recording for which the webhook was fired and logged |
Connection status | The initial webhook call status. A ✓ will be shown if everything was successful, otherwise, an error code will be shown. |
SSL status | The 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 status | The HTTP status resulted from the webhook firing |
URL | The URL of your webhook handler |
Response time | The time (in milliseconds ) it took for your webhook handler to respond to the webhook firing |
Event type | The event that triggered the webhook |
Request Headers & Request Body | The request headers and request body that were sent when the webhook was fired |
Response Headers & Response Body | The 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 Code | Error Description |
---|---|
0 | ok the operation was successful |
2 | unable to get issuer certificate |
3 | unable to get certificate CRL |
4 | unable to decrypt the certificate’s signature |
5 | unable to decrypt CRL’s signature |
6 | unable to decode issuer public key |
7 | certificate signature failure |
8 | CRL signature failure |
9 | the certificate is not yet valid |
10 | certificate has expired |
11 | CRL is not yet valid |
12 | CRL has expired |
13 | format error in the certificate’s notBefore field |
14 | format error in the certificate’s notAfter field |
15 | format error in CRL’s lastUpdate field |
16 | format error in CRL’s nextUpdate field |
17 | out of memory |
18 | self-signed certificate |
19 | self-signed certificate in the certificate chain |
20 | unable to get local issuer certificate |
21 | unable to verify the first certificate |
22 | certificate chain too long |
23 | certificate revoked |
24 | invalid CA certificate |
25 | path length constraint exceeded |
26 | unsupported certificate purpose |
27 | certificate not trusted |
28 | certificate rejected |
29 | subject issuer mismatch |
30 | authority and subject key identifier mismatch |
31 | authority and issuer serial number mismatch |
32 | key usage does not include certificate signing |
50 | application verification failure |
Webhook logs are deleted, together with their associated scheduled webhook entry, after 30 days.
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.