Skip to main content
Webhook Integrations Setup

Use the Sine Webhook integration to push data to your favourite service.

Robert Sterling avatar
Written by Robert Sterling
Updated over a week ago

Accessing Integration Settings

1. Select Locations from the side-menu.

2. Select the Site you wish to integrate.

3. Select the Integrations tab at the bottom of the sidebar

4. The Integrations page will appear. When you have no integrations configured, it will appear the same as the picture below:

Adding a WebHook

Click on the blue "Add integration" button and select the Webhook option.

The Webhook configuration page will appear.

Note: If you need more information on webhooks, either click on the ‘?’ button in the top-right or read the information provided below.

Configuration

  • Name: Used to identify the integration on rejected passes and the integrations page.

  • External ID: This field can be used to match up sites in the external system.

  • URL: The publicly accessible endpoint that Sine will call out to. We recommend using HTTPS.

  • API Key: Provide an identifier that Sine will pass through in the x-sine-auth header on requests. Use this key to verify that requests are coming from Sine.

  • Rejection Message: Users may set a rejection message in the case that the check-in attempt was unsuccessful. This will display on the iPad in the case that their details do not correspond to the WebHook server, preventing them from checking in. Customize this message from the Rejection message box from the Configuration page.(Optional): You can leave this field blank to display the default rejection message that your web-hook returns (for example, “You have been rejected by a Sine service.”). Alternatively, you can insert %EXTERNAL_REJECTION_MESSAGE% into the message, and the web-hook will automatically replace this with your default rejection message. An example of this is %EXTERNAL_REJECTION_MESSAGE% Please see the front desk for assistance. which will display something along the lines of Access card denied. Please see the front desk for assistance.

  • Visitor Types: Select the desired visitor types that you want to capture events for. An example would be ‘Contractor’ only if using this WebHook for inductions.

  • Events: Select at least one event that you want this integration to run.
    No event type is reliant on another event type.
    Check-in Request Triggered before a Pass is created. Allows the integration to reject a pass with a rejection message or optionally add additional information to accepted passes. This is normally the most useful event for integrations.
    Check-in Success: Triggered after a pass has successfully been created. An integration can not mutate a pass off this event. This event will include answers to any entry forms configured on the site.
    Check-out Success: Triggered when a pass is checked out or expires. An integration cannot mutate a pass off this event. This event will include answers to any exit forms configured on the site.

    Check-in Rejected: Triggered after a pass is rejected. An integration can not mutate a pass off this event. The event will include details depending on integrations set up at Check-in Request or Check-in Request with Details (read below) and will pass through the rejection reason.

  • Events (Enterprise Plans only)
    Check-in Request with Details Triggered before a Pass is created. Allows the integration to reject a pass with a rejection message or optionally add additional information to accepted passes. This contains additional Check-in details.
    Check-in Approval Pending Triggered before a Pass is created and where an approval is in Pending.
    Invitation Create Triggered when an invitation is created for a Visitor.
    Invitation Update Triggered when an invitation is updated for a Visitor.
    Invitation Delete Triggered when an invitation is deleted for a Visitor.

  • Status: whether the integration is active or not.

Request Specification

The following applies to all events:

  • Request will always be a POST.

  • Request will be application/json.

  • Responses must be application/json.

  • Responses must be a 200.

  • Sine is a cloud based service running on AWS. Integration endpoints must be open to the internet and use the x-sine-auth header for authentication.

Check-in Request Event

This is a real time integration. The check-in process will be interrupted until the integration request has received a response. If the response to the integration request is anything other than a 200, the check-in process will be aborted.

Request Format

{
"event": "signin_before",
"date": "2024-07-30T01:43:34Z",
"data": {
"firstName": "Jane",
"lastName": "Doe",
"email": "[email protected]",
"mobile": "+61400000000",
"inviteId": null,
"company": "Acme Co",
"site": {
"id": "fb8c6a41-990f-49d3-a5a6-8dba8ae4b075",
"name": "Acme Corp"
},
"visitorType": {
"id": "d77d4e33-5532-4666-a1ae-e059afd96a48",
"name": "Visitor"
}
},
"externalId": "abc-123"
}

Expected Rejected Response Format

HTTP/1.1 200 OK 
Content-Type: application/json
{
"code": "REJECTED",
"rejectionMessage": "A message shown in place of %EXTERNAL_REJECTION_MESSAGE%"
}

Expected Success Response Format

HTTP/1.1 200 OK 
Content-Type: application/json
{
"code": "SUCCESS",
"adminNotes": "If specified, this will be added to admin notes",
"visitorNotes": "If specified, this will be added to visitor notes"
}

Check-in Success Event

Request Format

{
"event": "signin_after",
"date": "2024-07-30T01:53:08Z",
"data": {
"id": "6efe4bff-81d5-4d0b-91e8-c768bc03db5f",
"startDate": "2024-07-30T01:49:27.069Z",
"expiresDate": "2024-07-30T09:49:27.069Z",
"firstName": "Jane",
"lastName": "Doe",
"email": "[email protected]",
"mobile": "+61400000000",
"mobileVerified": false,
"emailVerified": false,
"photoURL": "https://sine-signed-url-to-profile-picture",
"status": "active",
"autoExpired": false,
"formResponses": {
"id": "d77d4e33-5532-4666-a1ae-e059afd96a48",
"responses": [
{
"id": "00e37f14-7b22-40bd-9be6-cc3b1b35c10e",
"type": "multiplechoice",
"value": "Contractor Works"
},
{
"id": "30db22b9-97f0-4a2c-a673-90430c45ea4a",
"type": "booleanSwitch",
"value": true
}
],
"prefillDate": "2024-07-30T01:49:27.085Z"
},
"formResponsesSignOut": null,
"inviteId": null,
"host": {
"id": "efc62530-22b8-4415-a53a-8ae760f2c941",
"email": "[email protected]",
"mobile": "+61400000001",
"company": null,
"lastName": "test",
"photoURL": null,
"firstName": "test",
"hostGroup": "fb8c6a41-990f-49d3-a5a6-8dba8ae4b075",
"hostGroupName": "Automation"
},
"company": "test",
"site": {
"id": "c0566aee-3ccd-4f04-9a8c-85e50a2f9f61",
"name": "Automation"
},
"visitorType": {
"id": "60f2f816-886d-4f22-9af4-c056920220f7",
"name": "Visitor"
}
},
"externalId": "abc-123"
}

Note: If the check-in was related to an invitation, the inviteId will be referenced in this event.

Check-in Reject event

Request Format

{
"event":"signin_rejected",
"date":"2022-08-26T00:51:04Z",
"data":{
"id":"fe9e32c4-a635-4059-a013-bcc85e8c1e80",
"startDate":"2022-08-26T00:51:03.895Z",
"expiresDate":"2022-08-26T00:51:03.895Z",
"firstName":"first name",
"lastName":"last name",
"email":"[email protected]",
"mobile":"+6142645098",
"mobileVerified":false,
"emailVerified":false,
"photoURL":null,
"status":"rejected",
"autoExpired":false,
"formResponses":{
"id":"94fb2b93-0123-4c89-a4a8-3fe11316c76a",
"responses":[
{
"id":"c301d376-4ad4-49b0-8873-322693eb997d",
"type":"multiplechoice",
"value":"Meeting / Interview"
}
],
"prefillDate":"2022-08-26T00:51:03.151Z"
},
"formResponsesSignOut":null,
"inviteId":null,
"company":"Acme Inc",
"site":{
"id":"d7468acd-43ed-4386-8e15-ae50a10a056a",
"name":"example site"
},
"visitorType":{
"id":"8db48499-05fe-4bdb-ab60-8c3be9bf1ac0",
"name":"Visitor"
},
"rejectionReasons":[
{
"name":"Workflow integration",
"reason":"We couldn't find a valid Workflow response. We've sent you an SMS or email with more information."
},
],
},
"externalId":"123123"
}

Note: If the integration only runs on Check-in Request, then the Check-in Reject event will not include photo url, form responses or hosts.

If the rejection is a host rejection, the name of the rejectionReason will be null.

  "rejectionReasons":[
{
"name": null,
"reason":"The pass has been rejected by host"
}
],

Check-out Success Event

Request Format

{
"event": "signout_after",
"date": "2024-07-30T01:55:11Z",
"data": {
"id": "60f2f816-886d-4f22-9af4-c056920220f7",
"startDate": "2024-07-30T01:49:27.069Z",
"expiresDate": "2024-07-30T01:55:11.012Z",
"firstName": "Jane",
"lastName": "Doe",
"email": "[email protected]",
"mobile": "+61400000000",
"mobileVerified": false,
"emailVerified": false,
"photoURL": null,
"status": "expired",
"autoExpired": false,
"formResponses": {
"id": "6efe4bff-81d5-4d0b-91e8-c768bc03db5f",
"responses": [
{
"id": "00e37f14-7b22-40bd-9be6-cc3b1b35c10e",
"type": "multiplechoice",
"value": "Contractor Works"
},
{
"id": "30db22b9-97f0-4a2c-a673-90430c45ea4a",
"type": "booleanSwitch",
"value": true
}
],
"prefillDate": "2024-07-30T01:49:27.085Z"
},
"formResponsesSignOut": null,
"inviteId": null,
"host": {
"id": "c0566aee-3ccd-4f04-9a8c-85e50a2f9f61",
"firstName": "John",
"lastName": "Doe",
"email": "[email protected]",
"mobile": "+61400000001",
"company": null,
"photoURL": null,
"hostGroup": "efc62530-22b8-4415-a53a-8ae760f2c941",
"hostGroupName": "Reception Staff"
},
"company": "test",
"site": {
"id": "fb8c6a41-990f-49d3-a5a6-8dba8ae4b075",
"name": "Acme Corp"
},
"visitorType": {
"id": "d77d4e33-5532-4666-a1ae-e059afd96a48",
"name": "Visitor"
}
},
"externalId": "abc-123"
}

Invitation Events

Request Format

{
"event": "invitation_created",
"inviteId": "7f1460df-7d59-4088-b28e-b3738260e782",
"date": "2024-07-30T01:56:57Z",
"externalId": "test",
"adminNotes": "",
"host": {
"id": "c0566aee-3ccd-4f04-9a8c-85e50a2f9f61",
"email": "[email protected]",
"mobile": "+61400000001",
"company": null,
"lastName": "Doe",
"photoURL": null,
"firstName": "John",
"hostGroup": "efc62530-22b8-4415-a53a-8ae760f2c941",
"hostGroupName": "Automation"
},
"site": {
"id": "fb8c6a41-990f-49d3-a5a6-8dba8ae4b075",
"name": "Acme Corp",
"timezone": "Australia/Adelaide"
},
"visitorType": {
"id": "d77d4e33-5532-4666-a1ae-e059afd96a48",
"name": "Visitor"
},
"user": {
"id": "74d0ce62-af4d-4f43-b9a2-18ce16a7ca63",
"firstName": "Jane",
"lastName": "Doe",
"email": "[email protected]"
},
"visitorInfo": {
"firstName": "Jane",
"lastName": "Doe",
"email": "[email protected]",
"mobile": "+61400000000",
"company": "Acme Co",
"subject": "webhook",
"startDate": "2024-07-30T02:30:00.000Z",
"endDate": "2024-07-30T03:30:00.000Z",
"validFrom": "2024-07-30T02:15:00.000Z",
"validTo": "2024-07-30T03:30:00.000Z",
"guestMessage": "",
"fastTrackCode": null
}
}

Testing

The webhook responses can be easily tested using the following method:

  1. Go to https://webhook.site/ and it will provide you with a URL that you can use, then paste that URL in to the Integration URL field.

  2. Enter any value into the External ID and API Key fields for now.

  3. Create an invitation or Check-in with Sine. You will see the response on the webhook.site page.
    (Note, some webhook events are only available in Enterprise plans).

Note: Make sure the content type is application/json and the response body is:

{
"code":"SUCCESS"
}

IP Ranges

Requests will come from the following addresses:

  • 13.55.216.196

  • 52.63.2.142

  • 3.105.152.200

  • 13.55.196.118

  • 13.55.33.1

  • 3.105.192.233

  • 13.237.31.4

  • 13.236.199.231

Did this answer your question?