Private beta: this contract may change before launch. Join the waitlist
Hijinks
Hijinks Webhook API

Events Hijinks sends to your bridge. Every one is a signed POST to the one bridge URL you set in the dashboard; the type field in the body says which event it is. Answer any 2xx within 5 seconds.


Post a message to a channel

POST
<your bridge URL>
 (type: message.create)

Post message in channel and remember the mapping from message.id to your chat's own message id: a later message.update names the same message.id.

Retried at +1 s and +4 s when the bridge does not answer 2xx within 5 seconds, then dropped. A retry carries the same id.

Post a message to a channel › Headers

Hijinks-Signature
​string · pattern: ^t=\d+(,v1=[0-9a-fA-… · required

t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Several v1= entries are allowed; any one matching is enough.

Hijinks-Event-Id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

The envelope's id. Unchanged across retries; dedupe on it.

Unique per event and unchanged across its retries; dedupe on it.

Hijinks-Workspace
​WorkspaceId · uuid · required

The envelope's workspace, for routing before the body is parsed.

The Hijinks workspace, as shown in the dashboard.

Post a message to a channel › Request Body

id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

Unique per event and unchanged across its retries; dedupe on it.

type
​const · required
Const value: message.create
workspace
​WorkspaceId · uuid · required

The Hijinks workspace, as shown in the dashboard.

sequence
​Sequence · int64 · min: 1 · required

Strictly increasing per workspace, so events that arrive out of order can be put back in order (an older message.update than one already applied can be skipped). Not contiguous. Taken from Hijinks' clock in microseconds, so it keeps increasing across Hijinks restarts and deploys. Below 2^53, so it fits a JSON number in every language.

createdAt
​CreatedAt · date-time · required

When Hijinks created the event (ISO 8601, UTC).

expiresAt
​ExpiresAt · date-time · required

When the event goes stale (ISO 8601, UTC): past it, drop the event unapplied. 60 seconds after createdAt for message.ephemeral and ping; 10 minutes for a live game's messages and the answers to commands; null — never stale — for prompts and results that stay valid for hours (self-paced rounds, word games with their own end, icebreakers, digests). Compare it with your own clock.

channel
​OutboundChannel · minLength: 1 · required

A channel id your bridge sent in an inbound event — or dm:<user id> on a message.update of a message first sent by dm.create.

​Message · required

Post a message to a channel › Responses

Delivered. Any other answer, or none within 5 seconds, is a failure.

No data returned

Replace a message Hijinks created

POST
<your bridge URL>
 (type: message.update)

Replace the text, buttons and image of the message you posted for message.id. channel is the channel of the original message.create — or dm:<user id> when the original was a dm.create.

A live game keeps one message: the game_start card is created, and every question, answer count, reveal and the final board arrive as updates of it. So an update can be the only copy of a question — handle kind: question here, not only on create.

An update that starts a phase (question, gotcha_bait, gotcha_reveal, time_up, game_end) is retried at +1 s and +4 s like a create, with the same id. Any other update (an answer count, a tally) is never retried: the next one supersedes it. Apply updates in sequence order, skipping one older than the last you applied. An update for an id you have not mapped may have overtaken its create's retry: hold it for up to 5 seconds, then ignore it (its create was dropped).

Replace a message Hijinks created › Headers

Hijinks-Signature
​string · pattern: ^t=\d+(,v1=[0-9a-fA-… · required

t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Several v1= entries are allowed; any one matching is enough.

Hijinks-Event-Id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

The envelope's id. Unchanged across retries; dedupe on it.

Unique per event and unchanged across its retries; dedupe on it.

Hijinks-Workspace
​WorkspaceId · uuid · required

The envelope's workspace, for routing before the body is parsed.

The Hijinks workspace, as shown in the dashboard.

Replace a message Hijinks created › Request Body

id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

Unique per event and unchanged across its retries; dedupe on it.

type
​const · required
Const value: message.update
workspace
​WorkspaceId · uuid · required

The Hijinks workspace, as shown in the dashboard.

sequence
​Sequence · int64 · min: 1 · required

Strictly increasing per workspace, so events that arrive out of order can be put back in order (an older message.update than one already applied can be skipped). Not contiguous. Taken from Hijinks' clock in microseconds, so it keeps increasing across Hijinks restarts and deploys. Below 2^53, so it fits a JSON number in every language.

createdAt
​CreatedAt · date-time · required

When Hijinks created the event (ISO 8601, UTC).

expiresAt
​ExpiresAt · date-time · required

When the event goes stale (ISO 8601, UTC): past it, drop the event unapplied. 60 seconds after createdAt for message.ephemeral and ping; 10 minutes for a live game's messages and the answers to commands; null — never stale — for prompts and results that stay valid for hours (self-paced rounds, word games with their own end, icebreakers, digests). Compare it with your own clock.

channel
​OutboundChannel · minLength: 1 · required

A channel id your bridge sent in an inbound event — or dm:<user id> on a message.update of a message first sent by dm.create.

​Message · required

Replace a message Hijinks created › Responses

Delivered.

No data returned

Reply that only one member should see

POST
<your bridge URL>
 (type: message.ephemeral)

A reply to the member who ran a command (help, settings, a leaderboard) or pressed a button — or a note for one member alone that no request asked for: their recap when a game ends, whether their guess-who guess was right. Show it to user alone in channel if your chat can; otherwise DM it, or post it.

message.id is minted for the reply but never updated.

Retried at +1 s and +4 s, then dropped.

Reply that only one member should see › Headers

Hijinks-Signature
​string · pattern: ^t=\d+(,v1=[0-9a-fA-… · required

t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Several v1= entries are allowed; any one matching is enough.

Hijinks-Event-Id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

The envelope's id. Unchanged across retries; dedupe on it.

Unique per event and unchanged across its retries; dedupe on it.

Hijinks-Workspace
​WorkspaceId · uuid · required

The envelope's workspace, for routing before the body is parsed.

The Hijinks workspace, as shown in the dashboard.

Reply that only one member should see › Request Body

id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

Unique per event and unchanged across its retries; dedupe on it.

type
​const · required
Const value: message.ephemeral
workspace
​WorkspaceId · uuid · required

The Hijinks workspace, as shown in the dashboard.

sequence
​Sequence · int64 · min: 1 · required

Strictly increasing per workspace, so events that arrive out of order can be put back in order (an older message.update than one already applied can be skipped). Not contiguous. Taken from Hijinks' clock in microseconds, so it keeps increasing across Hijinks restarts and deploys. Below 2^53, so it fits a JSON number in every language.

createdAt
​CreatedAt · date-time · required

When Hijinks created the event (ISO 8601, UTC).

expiresAt
​ExpiresAt · date-time · required

When the event goes stale (ISO 8601, UTC): past it, drop the event unapplied. 60 seconds after createdAt for message.ephemeral and ping; 10 minutes for a live game's messages and the answers to commands; null — never stale — for prompts and results that stay valid for hours (self-paced rounds, word games with their own end, icebreakers, digests). Compare it with your own clock.

channel
​OutboundChannel · minLength: 1 · required

A channel id your bridge sent in an inbound event — or dm:<user id> on a message.update of a message first sent by dm.create.

user
​MemberId · minLength: 1 · required

A member's user.id, as your bridge sent it.

​Message · required

Reply that only one member should see › Responses

Delivered.

No data returned

Send a member a private message

POST
<your bridge URL>
 (type: dm.create)

Open (or reuse) a direct conversation with user and post message there: async rounds, Know Your Team prompts, reminders. Map message.id as for message.create; a later message.update for it arrives with channel: "dm:<user id>". Send button presses and typed messages in the DM back as action and message events with that same channel: "dm:<user id>" (the member's own user.id), so Hijinks knows they came from the DM: replies go back to the DM, and a typed message there answers the prompt waiting in it, with or without replyTo.

Retried at +1 s and +4 s, then dropped.

Send a member a private message › Headers

Hijinks-Signature
​string · pattern: ^t=\d+(,v1=[0-9a-fA-… · required

t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Several v1= entries are allowed; any one matching is enough.

Hijinks-Event-Id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

The envelope's id. Unchanged across retries; dedupe on it.

Unique per event and unchanged across its retries; dedupe on it.

Hijinks-Workspace
​WorkspaceId · uuid · required

The envelope's workspace, for routing before the body is parsed.

The Hijinks workspace, as shown in the dashboard.

Send a member a private message › Request Body

id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

Unique per event and unchanged across its retries; dedupe on it.

type
​const · required
Const value: dm.create
workspace
​WorkspaceId · uuid · required

The Hijinks workspace, as shown in the dashboard.

sequence
​Sequence · int64 · min: 1 · required

Strictly increasing per workspace, so events that arrive out of order can be put back in order (an older message.update than one already applied can be skipped). Not contiguous. Taken from Hijinks' clock in microseconds, so it keeps increasing across Hijinks restarts and deploys. Below 2^53, so it fits a JSON number in every language.

createdAt
​CreatedAt · date-time · required

When Hijinks created the event (ISO 8601, UTC).

expiresAt
​ExpiresAt · date-time · required

When the event goes stale (ISO 8601, UTC): past it, drop the event unapplied. 60 seconds after createdAt for message.ephemeral and ping; 10 minutes for a live game's messages and the answers to commands; null — never stale — for prompts and results that stay valid for hours (self-paced rounds, word games with their own end, icebreakers, digests). Compare it with your own clock.

user
​MemberId · minLength: 1 · required

A member's user.id, as your bridge sent it.

​Message · required

Send a member a private message › Responses

Delivered.

No data returned

Test event

POST
<your bridge URL>
 (type: ping)

Sent when someone presses "Send test event" in the dashboard. Answer 2xx; the dashboard shows the status code and latency. Never retried.

Test event › Headers

Hijinks-Signature
​string · pattern: ^t=\d+(,v1=[0-9a-fA-… · required

t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Several v1= entries are allowed; any one matching is enough.

Hijinks-Event-Id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

The envelope's id. Unchanged across retries; dedupe on it.

Unique per event and unchanged across its retries; dedupe on it.

Hijinks-Workspace
​WorkspaceId · uuid · required

The envelope's workspace, for routing before the body is parsed.

The Hijinks workspace, as shown in the dashboard.

Test event › Request Body

id
​EventId · pattern: ^evt_[0-9A-HJKMNP-TV… · required

Unique per event and unchanged across its retries; dedupe on it.

type
​const · required
Const value: ping
workspace
​WorkspaceId · uuid · required

The Hijinks workspace, as shown in the dashboard.

sequence
​Sequence · int64 · min: 1 · required

Strictly increasing per workspace, so events that arrive out of order can be put back in order (an older message.update than one already applied can be skipped). Not contiguous. Taken from Hijinks' clock in microseconds, so it keeps increasing across Hijinks restarts and deploys. Below 2^53, so it fits a JSON number in every language.

createdAt
​CreatedAt · date-time · required

When Hijinks created the event (ISO 8601, UTC).

expiresAt
​ExpiresAt · date-time · required

When the event goes stale (ISO 8601, UTC): past it, drop the event unapplied. 60 seconds after createdAt for message.ephemeral and ping; 10 minutes for a live game's messages and the answers to commands; null — never stale — for prompts and results that stay valid for hours (self-paced rounds, word games with their own end, icebreakers, digests). Compare it with your own clock.

Test event › Responses

Reachable.

No data returned