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": 1614278939,
"nonce": "ZOS42U_eGt40GRZC",
"payload": <...>
}
Putting it all together, this is what a full valid request to https://example.com/polymartWebhook might look like, given the webhook secret
7VfIj30CWfuU1Bok
POST /polymartWebhook HTTP/1.1
X-Polymart-Webhook-Version: 1
X-Polymart-Signature: 5fa2ae507acc4b919212dcab5fcf56ed68f08d0f8bb6f9fa71d698741ffdd3a2
Content-Type: application/json
Content-Length: 166
{
"event": "testEvent",
"time": 1614278939,
"nonce": "PIpgusTnEyaCDfHS",
"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": 1614278939,
"nonce": "ruBnaxy6p2NIMoKo",
"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
7VfIj30CWfuU1Bok
, then the signature of this
request will be
5d1d25968aa6f034ea43a3bfc674ebc94c4b60561104c89d00803f58a12a9f0b
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": 1614278939,
"nonce": "IRJSXUZ8rFAB2uIh",
"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": 1614275339,
"size": "716624",
"fileType": "jar",
"branch": "snapshot"
},
"update": {
"version": "3.0",
"id": "107",
"time": 1614278939,
"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
7VfIj30CWfuU1Bok
, then the signature of this
request will be
fbd0e713fef940c656834e8e715d48529f7ba67326fbe55991204f9ef632e0dd
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": 1614278939,
"nonce": "lwuI0awvl8pXZQek",
"payload": {
"product": {
"id": "1",
"title": "CustomItems",
"subtitle": "Design new Custom items and blocks!",
"url": "https://polymart.org/resource/1"
},
"user": {
"id": 114387
}
}
}
If your webhook secret is
7VfIj30CWfuU1Bok
, then the signature of this
request will be
0c33ec8767276b658b6ec0d9f5761b35dfccaf6c913c19452e36181447418ae5
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": 1614278939,
"nonce": "WjgnERjsAKrvcCX5",
"payload": {
"product": {
"id": "1",
"title": "CustomItems",
"subtitle": "Design new Custom items and blocks!",
"url": "https://polymart.org/resource/1"
},
"user": {
"id": 55394
}
}
}
If your webhook secret is
7VfIj30CWfuU1Bok
, then the signature of this
request will be
1b85e9d8ac2e9b664e728ffca277e8b63d6fb31a824213f392040b02e06f1df6
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": 1614278939,
"nonce": "u--PnqfJ7vaJ9NZw",
"payload": {
"product": {
"id": "1",
"title": "CustomItems",
"subtitle": "Design new Custom items and blocks!",
"url": "https://polymart.org/resource/1"
},
"user": {
"id": 62711
}
}
}
If your webhook secret is
7VfIj30CWfuU1Bok
, then the signature of this
request will be
743d138692e3410f9686553cbdb14e6a24fcf748c140f8f78b7d337bfa68c437