WebSked machine-readable events
This page details the two options available to developers to receive and process WebSked events in an automated machine-readable way: Webhook and IFX. If instead you want to receive human-readable notifications, you can configure a Slack, Microsoft Teams, or email notification.
Webhook integrations are similar to Slack, Microsoft Teams, and email in that the user configures the notification from the Arc XP WebSked website and then receives events when successfully configured. Conversely, for IFX, the WebSked system continually pushes events without any prior configuration within WebSked. As a developer, you must configure a reader to subscribe, receive, and take further action on the events.
The payload for both systems is identical and is detailed in this article.
Receiving events through webhook notifications
- To create a WebSked webhook notification subscription, the subscriber must enter an endpoint (where the webhook payload is to be
POST
ed) and asecret
value that the receiving application uses to verify the webhook request is from WebSked. - WebSked encrypts the
secret
and stores it in our database under the notification subscription. The encryption uses an environment variable encryption key specific to our application. - When the notification sends, WebSked decrypts the encrypted secret, hashes (HmacSHA256) the payload of the request, and sets it in a custom header (
x-websked-signature
) on thePOST
. - To verify the sender, the receiving application receives the request and performs its own hash using its (known)
secret
value and the payload of the request. It then compares that hash to thex-websked-signature
header. - For the old-style webhook format (
jsonPayload
false/null), the hash is computed using the string in the request body. For the new-style format, the hash is computed using the no-whitespace string encoding of the body. (Note that these are actually the same thing)
Receiving events via IFX
- First, create an integration (see Create and manage integrations with IFX)
- Then, subscribe to the event (see IFX Events).
Payload
WebSked webhooks and IFX integrations both send data in the same structure. All data fits into the following schema.
Generic Schema
{ "type": "[STRING]", "orgId": "[STRING]", "story": { "plannedDate": "[STRING]", "headline": "[STRING]", "id" : "[STRING]", "url": "[STRING]", "webskedUrl": "[STRING]" }, "stories": [ { "plannedDate": "[STRING]", "headline": "[STRING]", "id" : "[STRING]", "url": "[STRING]", "webskedUrl": "[STRING]" } ], "storyIds": [ "[STRING]" ], "task": { "assignedGroup": "[STRING]", "assignedUser": "[STRING]", "claimedBy": "[STRING]", "deadline": "[LONG]", "note": "[STRING]", "priority": "[INTEGER]", "type": "[STRING]", "url": "[STRING]" }, "tasks" : [ { "story": { "headline": "[STRING]", "id" : "[STRING]" }, "task": { "deadline": "[LONG]", "url": "[STRING]" } } ], "pitch": { "breaking": boolean, "pitchedBy": "[STRING]", "platforms": [ "[STRING]" ], "status": "[STRING]", "updatedBy": "[STRING]", "note": "[STRING]" }, "publicationPitch": { "status": "[STRING]", "pitchedBy": "[STRING]", "note": "[STRING]", "publication": { "name": "[STRING]", "publicationSetId": "[STRING]", "publicationId": "[STRING]", "editionId": "[STRING]", "editionTime": "[LONG]", "editionUrl": "[STRING]", "storyIds": [ "[STRING]" ] } }}
Story Publish
Webhook only. Use Content events for IFX.
{ "type": "story_publish", "orgId": "[STRING]", "story": { "headline": "[STRING]", "id" : "[STRING]", "url": "[STRING]", "webskedUrl": "[STRING]" }, "pitch": { "breaking": boolean, "pitchedBy": "[STRING]", "status": "[STRING]", "note": "[STRING]" }, "publicationPitch": { "status": "[STRING]", "pitchedBy": "[STRING]", "note": "[STRING]", "publication": { "publicationId": "[STRING]", "editionId": "[STRING]", "editionTime": "[LONG]" } }}
Story Deadline
Webhook only. Use Content events for IFX
{ "type": "story_deadline", "orgId": "[STRING]", "stories": [ { "plannedDate": "[LONG]", "headline": "[STRING]", "id" : "[STRING]", "webskedUrl": "[STRING]" }, { "plannedDate": "[LONG]", "headline": "[STRING]", "id" : "[STRING]", "webskedUrl": "[STRING]" }, { "plannedDate": "[LONG]", "headline": "[STRING]", "id" : "[STRING]", "webskedUrl": "[STRING]" } ]}
Task Create
{ "type": "task_create", "orgId": "[STRING]", "story": { "headline": "[STRING]", "id" : "[STRING]", "webskedUrl": "[STRING]" }, "task": { "assignedGroup": "[STRING]", "assignedUser": "[STRING]", "deadline": "[LONG]", "note": "[STRING]", "priority": "[INTEGER]", "url": "[STRING]", "type": "[STRING]" }}
Task Assign
{ "type": "task_assign", "orgId": "[STRING]", "story": { "headline": "[STRING]", "id" : "[STRING]", "webskedUrl": "[STRING]" }, "task": { "assignedUser": "[STRING]", "assignedGroup": "[STRING]", "priority": "[INTEGER]", "type": "[STRING]", "url": "[STRING]" }}
Task Claim
{ "type": "task_claim", "orgId": "[STRING]", "story": { "headline": "[STRING]", "id" : "[STRING]", "webskedUrl": "[STRING]" }, "task": { "claimedBy": "[STRING]", "priority": "[STRING]", "type": "[STRING]", "url": "[STRING]" }}
Task Deadline
{ "type": "task_deadline", "orgId": "[STRING]", "tasks" : [ { "story": { "headline": "[STRING]", "id" : "[STRING]" }, "task": { "deadline": "[LONG]", "url": "[STRING]" } }, { "story": { "headline": "[STRING]", "id" : "[STRING]" }, "task": { "deadline": "[LONG]", "url": "[STRING]" } }, { "story": { "headline": "[STRING]", "id" : "[STRING]" }, "task": { "deadline": "[LONG]", "url": "[STRING]" } } ]}
Task Complete
{ "type": "task_complete", "orgId": "[STRING]", "story": { "headline": "[STRING]", "id" : "[STRING]", "webskedUrl": "[STRING]" }, "task": { "note": "[STRING]", "type": "[STRING]", "url": "[STRING]" }}
Pitch Create
{ "type": "pitch_create", "orgId": "[STRING]", "story": { "headline": "[STRING]", "id" : "[STRING]", "url": "[STRING]", "webskedUrl": "[STRING]" }, "pitch": { "breaking": boolean, "pitchedBy": "[STRING]", "platforms": [ "[STRING]" ] "note": "[STRING]" }}
Publication Pitch Create
{ "type": "publication_pitch_create", "orgId": "[STRING]", "story": { "headline": "[STRING]", "id" : "[STRING]", "url": "[STRING]", "webskedUrl": "[STRING]" }, "publicationPitch": { "pitchedBy": "[STRING]", "note": "[STRING]", "publications": [ { "name": "[STRING]", "publicationId": "[STRING]", "publicationSetId": "[STRING]", "editionUrl": "[STRING]", "editionId": "[STRING]", "editionTime": "[LONG]" }, { "name": "[STRING]", "publicationId": "[STRING]", "publicationSetId": "[STRING]", "editionUrl": "[STRING]", "editionId": "[STRING]", "editionTime": "[LONG]" }, { "name": "[STRING]", "publicationId": "[STRING]", "publicationSetId": "[STRING]", "editionUrl": "[STRING]", "editionId": "[STRING]", "editionTime": "[LONG]" } ] }}
Edition Finalize
{ "type": "edition_finalize", "orgId": "[STRING]", "publication": { "name": "[STRING]", "publicationId": "[STRING]", "publicationSetId": "[STRING]", "editionId": "[STRING]", "editionTime": "[LONG]", "editionUrl": "[STRING]", "storyIds": [ "[STRING]" ] }}
Publication Pitch Update
{ "type": "publication_pitch_update", "orgId": "[STRING]", "story": { "headline": "[STRING]", "id" : "[STRING]", "webskedUrl": "[STRING]" }, "publicationPitch": { "status": "[STRING]", "pitchedBy": "[STRING]", "note": "[STRING]", "publication": { "name": "[STRING]", "publicationId": "[STRING]", "publicationSetId": "[STRING]", "editionId": "[STRING]", "editionTime": "[LONG]", "editionUrl": "[STRING]" } }}