Skip to content
Product Documentation

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 POSTed) and a secret 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 the POST.
  • 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 the x-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

  1. First, create an integration (see Create and manage integrations with IFX)
  2. 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]"
}
}
}