You can edit webhooks on your resource by going to your resource page and clicking the "Webhooks" button in the edit section.
Automatic Discord Integration
Polymart automatically integrates with Discord webhooks. However, this doesn't give you nearly as much customization as if you
build your own API for receiving webhooks. If you want to learn more about how to build your own API for receiving webhooks,
keep reading!
Webhook Overview
ping — Sent whenever you click the "ping" button on your resource's webhooks page
product.update — Sent whenever you post an update to your resource
product.user.purchase — Sent when a user purchases your resource
product.user.purchaseRemoved — Sent when a user issues a chargeback or is refunded
product.user.firstDownload — Sent when a user first downloads your resource
About Webhooks
When a webhook event is called, Polymart will send a request to the URL you provide on your resource page. With each request,
the following headers will be sent:
X-Polymart-Webhook-Version: 1
X-Polymart-Signature
will be a signature that verifies that the webhook request is in-fact valid. This is a
SHA256 HMAC hash, where the data is the data that was POSTed, and the key is your webhook secret. Your webhook secret generated when you
create a new webhook.
YOU MUST VALIDATE THAT THIS IS CORRECT. If you do not, attackers will
easily be able to send random, invalid webhooks to your server
The data that is POSTed to your webhook will be in this format
{
"event": <event type>,
"time": <current unix time>,
"nonce": <random nonce>,
"payload": {
<key 1>: <val 1>,
<key 2>: <val 2>,
<...>: <...>
}
}
So, the top-level information might look something like this
{
"event": "product.update",
"time": 1675029169,
"nonce": "odefVU78mRsnppzq",
"payload": <...>
}
Putting it all together, this is what a full valid request to https://example.com/polymartWebhook might look like, given the webhook secret
kIhy5EpNU0WZceSq
POST /polymartWebhook HTTP/1.1
X-Polymart-Webhook-Version: 1
X-Polymart-Signature: 558e42cf66c2884f5b2fa8a665506af270f41772d1fb73c0cf33e1a8f4ea6c20
Content-Type: application/json
Content-Length: 166
{
"event": "testEvent",
"time": 1675029169,
"nonce": "l65Oqjn0lUMHwhG3",
"payload": {
"webhook": "https://example.com/polymartWebhook"
}
}
Use this to test your webhook! This webhook event is called when you click the "send a ping" button on your resource's webhooks page.
Format
{
"event": "ping",
"time": <current unix time>,
"nonce": <random nonce>,
"payload": {
"product": {
"id": <resource id>,
"title": <resource title>,
"subtitle": <resource subtitle>,
"url": <resource url>
},
"webhook": {
"url": <your webhook url>
}
}
}
Example
{
"event": "ping",
"time": 1675029169,
"nonce": "ajuWpi_Y61P3OUhL",
"payload": {
"product": {
"id": "1",
"title": "CustomItems",
"subtitle": "Design new Custom items and blocks!",
"url": "https://polymart.org/resource/1"
},
"webhook": {
"url": "https://example.com/polymartWebhook"
}
}
}
If your webhook secret is
kIhy5EpNU0WZceSq
, then the signature of this
request will be
5ddf2bc19578bae9166d219208612775cca3e01bf91637d81c983b3006676380
This webhook event is called when your resource is updated.
Format
{
"event": "resource.update",
"time": <current unix time>,
"nonce": <random nonce>,
"payload": {
"product": {
"id": <resource id>,
"title": <resource title>,
"subtitle": <resource subtitle>,
"url": <resource url>
},
"previous": {
"version": <old version>,
"id": <old version ID>,
"time": <old version update time>,
"size": <old size>,
"fileType": <old file type>,
"branch": <beta|snapshot|release>
},
"update": {
"version": <new version>,
"id": <new version ID>,
"time": <update time>,
"size": <new size>,
"fileType": <new file type>,
"branch": <beta|snapshot|release>,
"title": <update title>,
"description": <update description>
}
}
}
Example
{
"event": "product.update",
"time": 1675029169,
"nonce": "AEb-iHRRmTaYF2VB",
"payload": {
"product": {
"id": "1",
"title": "CustomItems",
"subtitle": "Design new Custom items and blocks!",
"url": "https://polymart.org/resource/1"
},
"previous": {
"version": "2.19.5",
"id": "91",
"time": 1675025569,
"size": "716624",
"fileType": "jar",
"branch": "snapshot"
},
"update": {
"version": "3.0",
"id": "107",
"time": 1675029169,
"size": "718232",
"fileType": "jar",
"branch": "release",
"title": "Automatic Resource Pack Generation",
"description": "This version adds an automatic resource pack generator to CustomItems!"
}
}
}
If your webhook secret is
kIhy5EpNU0WZceSq
, then the signature of this
request will be
13b0089d53c6a3df8d3847e58c46e41766849e6556a53e1b06bd2493c375beb4
This webhook event is called when a user purchases your resource
Format
{
"event": "product.user.purchase",
"time": <current unix time>,
"nonce": <random nonce>,
"payload": {
"product": {
"id": <resource id>,
"title": <resource title>,
"subtitle": <resource subtitle>,
"url": <resource url>
},
"user": {
"id": <user id>
}
}
}
Example
{
"event": "product.user.purchase",
"time": 1675029169,
"nonce": "uMuRN19QR2XQV-wZ",
"payload": {
"product": {
"id": "1",
"title": "CustomItems",
"subtitle": "Design new Custom items and blocks!",
"url": "https://polymart.org/resource/1"
},
"user": {
"id": 21953
}
}
}
If your webhook secret is
kIhy5EpNU0WZceSq
, then the signature of this
request will be
4c7f026659f47db582eaee24cd41729df541fb1db658ac501ab40b4e5f0fb0d1
This webhook event is called when you issue a refund to a user, or they issue a chargeback. This event may be called more than once for a given user
Format
{
"event": "product.user.purchaseRemoved",
"time": <current unix time>,
"nonce": <random nonce>,
"payload": {
"product": {
"id": <resource id>,
"title": <resource title>,
"subtitle": <resource subtitle>,
"url": <resource url>
},
"user": {
"id": <user id>
}
}
}
Example
{
"event": "product.user.purchaseRemoved",
"time": 1675029169,
"nonce": "GHjZHeKRjFT9U8NA",
"payload": {
"product": {
"id": "1",
"title": "CustomItems",
"subtitle": "Design new Custom items and blocks!",
"url": "https://polymart.org/resource/1"
},
"user": {
"id": 116957
}
}
}
If your webhook secret is
kIhy5EpNU0WZceSq
, then the signature of this
request will be
9c246381bf3f32c4c860597898edc28ecb924517b1d8c1279cd5aded6eafe90a
This webhook event is called when a user downloads your resource for the first time
Format
{
"event": "product.user.firstDownload",
"time": <current unix time>,
"nonce": <random nonce>,
"payload": {
"product": {
"id": <resource id>,
"title": <resource title>,
"subtitle": <resource subtitle>,
"url": <resource url>
},
"user": {
"id": <user id>
}
}
}
Example
{
"event": "product.user.firstDownload",
"time": 1675029169,
"nonce": "UTgS6Am4JopPGk7h",
"payload": {
"product": {
"id": "1",
"title": "CustomItems",
"subtitle": "Design new Custom items and blocks!",
"url": "https://polymart.org/resource/1"
},
"user": {
"id": 121884
}
}
}
If your webhook secret is
kIhy5EpNU0WZceSq
, then the signature of this
request will be
9aa6fbc87a953ffbe1df29ce577b41f21ad28b1f6b43466221e211ce078ca717