API
Zapier
Two ways in
Either way, resell.store sends the event to Zapier the moment it happens, so the Zap runs straight away. Both show under Start a Zap on resell.store/tools/api, next to your own webhook. They don't replace it.
| Webhooks by Zapier | The resell.store app | |
|---|---|---|
| Set up | Paste Zapier's address on resell.store and pick events | Pick resell.store and a trigger in Zapier, sign in with your key |
| Zapier plan | Webhooks by Zapier is a premium app, so it needs a paid plan | Any plan |
| One shop only | Add a Filter step on Shop Slug | Choose the shop on the trigger |
| Fields | Under Data Object, like Data Object Total | Named plainly, like Total and Item |
| Available | Now | Coming soon. Use Webhooks by Zapier until then |
With Webhooks by Zapier
- In Zapier, make a Zap. For the trigger, choose Webhooks by Zapier, then the Catch Hook event. Leave Pick off a Child Key empty.
- Copy the webhook address Zapier shows. It starts with
https://hooks.zapier.com/hooks/catch/. - On resell.store/tools/api, find Start a Zap. Paste the address, choose the events that should start this Zap, and choose Add. We send a sample straight away.
- Back in Zapier, choose Test trigger. The sample shows up with every field. If Zapier didn't catch it, choose Send a sample on resell.store and test again.
- Add your actions and publish the Zap.
One address, several events
listing.sold, offer.received…) to do different things for each. Or make one Zap per event, which is easier to follow later.With the resell.store app
Coming soon
- In Zapier, make a Zap. For the trigger, search for resell.store and choose an event, like New Sale.
- Sign in when Zapier asks. Paste your secret key from resell.store/tools/api (choose Copy next to it). It starts with
rs_live_. No key yet? Choose Make a key there. - Choose a Shop if the Zap is only for one of them. Leave it empty for all your shops.
- Choose Test trigger. Zapier shows your latest real ones, like your last three sales, so you can map real fields. If you have none yet, it shows a made-up one.
- Add your actions and publish. Turning the Zap on connects it, and it shows under Start a Zap on the API page.
Your key is also your scripts' key
What can start a Zap
| Event | In the resell.store app | When |
|---|---|---|
listing.sold | New Sale | Something sold |
offer.received | New Offer | A buyer made an offer |
offer.updated | Updated Offer | A buyer took your counter, turned it down or withdrew |
question.asked | New Buyer Message | A buyer sent a message |
order.completed | Order Completed | A buyer said it arrived and it's all good |
order.problem | Problem Reported | A buyer reported a problem with an order |
order.refunded | Order Refunded | An order was cancelled or refunded |
payout.sent | Payout Sent | Money went to your PayPal |
review.created | New Review | A buyer left a review |
Sales, completed orders, problems, refunds and payouts all carry the order. Offers carry the offer, buyer messages the message, and reviews the review. Each is the same object the API returns.
What the Zap gets
The resell.store app gives the Zap the object itself, with its parts flattened the way Zapier likes. A sale looks like this (shortened):
{
"id": "a71c3e5d-…",
"status": "paid",
"item": 170,
"shipping": 18,
"total": 188,
"listing__title": "Yellow Le Creuset dutch oven, 5.5 qt",
"listing__url": "https://maya.resell.store/yellow-le-creuset-dutch-oven-5-5-qt",
"shop__slug": "maya",
"buyer__name": "Jess",
"ship_to__name": "Jess Park",
"ship_to__address": "12 Elm St, Portland, OR 97201",
"payout__seller_net": 164.14,
"paid_at": "2026-10-02T18:30:00.000Z",
"event_type": "listing.sold",
"event_id": "evt_8c1d2f…",
"test": false
}- Money is in dollars, as numbers:
totalis what the buyer paid,payout__seller_netwhat you get after fees. event_typeandevent_idsay which event it was. The id is the same if we have to send it again, so you can use it to skip repeats.- With Webhooks by Zapier you get the whole event as we send it, so the same fields sit under Data Object: Data Object Total, Data Object Listing Title. Type is the event. See what we send.
- A buyer's full address is only in sales and orders, under
ship_to. Keep Zaps that copy it somewhere private.
Samples and testing
A sample is a real event built from your latest matching thing, or made up if you have none, with test set to true. Nothing happened on your shop to cause it.
- Send a sample on the API page posts one to that address now. Use it while Zapier is waiting for a request.
- Testing a trigger in the resell.store app only reads samples. It doesn't send anything, so it never runs your Zaps.
Samples run live Zaps
test (or Test, with Webhooks by Zapier) is false.Zaps to try
- New Sale → Google Sheets. One row per sale with the item, total, what you get and the date. That's your bookkeeping done.
- New Offer → SMS by Zapier. "Jess offered $150 on the dutch oven", so you can answer before it expires.
- New Buyer Message → Slack. Post questions to a channel, with a link to the item.
- New Sale → Gmail. Email yourself the ship-to address and a packing checklist.
- New Review → Slack or X. Share your five-star reviews. Use a Filter step for
rating5 andpublictrue. - Payout Sent → QuickBooks or Xero. Record the income when the money lands.
- Problem Reported → a to-do app. Make a task, so a problem never gets missed.
Stopping a Zap
- The resell.store app: turn the Zap off or delete it in Zapier, and we stop sending. It goes from the API page on its own.
- Webhooks by Zapier: choose Remove next to it on the API page. Turning the Zap off in Zapier doesn't tell us, so we may keep sending to its address. Remove it here when you're done with it.
- Choosing Remove on a Zap made with the app stops it too, but the Zap still looks on in Zapier. Turn it off there as well.
Make, n8n and others
Anything that takes a webhook works like Webhooks by Zapier: paste its address on the API page. If you're building an integration, use the same REST hooks the resell.store Zapier app uses. Each subscription gets its own events and its own signing secret, and deliveries are signed and retried just like your webhook.
| Call | What it does |
|---|---|
POST /webhooks/subscriptions | Subscribe an address to some events. Call it again with the same address to change them |
DELETE /webhooks/subscriptions/:id | Unsubscribe it |
GET /webhooks/samples/:event | Up to 10 sample events from the seller's latest things, for showing fields |
POST /webhooks/subscriptions/:id/test | Post a sample to the address now |
curl https://api.resell.store/v1/webhooks/subscriptions \
-H "Authorization: Bearer rs_live_..." \
-d url="https://hook.us1.make.com/abc123" \
-d events="listing.sold,review.created" \
-d name="Sales and reviews to Make"Answer a delivery with 410 Gone and we delete the subscription. Anything else that isn't a 2xx is tried again about 5 minutes, 30 minutes, 2 hours, 6 hours and a day later. See Webhooks for every call.
If something's wrong
The Zap didn't run
- Check the API page. Each address shows its last delivery and what Zapier said.
200means Zapier got it, so look at the Zap's history in Zapier next. - Off means it failed for three days and we stopped. Turn the Zap off and on again in Zapier (the app), or add the address again (Webhooks by Zapier).
- Check the event: a Zap for New Offer doesn't run when a buyer takes your counter. That's Updated Offer.
- With a Shop chosen on the trigger, events from your other shops are skipped on purpose.
Zapier says the key isn't valid
Someone made a new key on the API page, which stops the old one. Copy the current key and reconnect the account in Zapier's Apps page.
Zapier doesn't find a request when testing a Catch Hook
Choose Send a sample on the API page, then Test trigger in Zapier again. Check the address on resell.store matches the one Zapier shows: each Zap has its own.