API

Zapier

Start a Zap when something happens on your shops: add each sale to a sheet, get a text for every offer, post new reviews to Slack. No code.

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 ZapierThe resell.store app
Set upPaste Zapier's address on resell.store and pick eventsPick resell.store and a trigger in Zapier, sign in with your key
Zapier planWebhooks by Zapier is a premium app, so it needs a paid planAny plan
One shop onlyAdd a Filter step on Shop SlugChoose the shop on the trigger
FieldsUnder Data Object, like Data Object TotalNamed plainly, like Total and Item
AvailableNowComing soon. Use Webhooks by Zapier until then

With Webhooks by Zapier

  1. In Zapier, make a Zap. For the trigger, choose Webhooks by Zapier, then the Catch Hook event. Leave Pick off a Child Key empty.
  2. Copy the webhook address Zapier shows. It starts with https://hooks.zapier.com/hooks/catch/.
  3. 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.
  4. 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.
  5. Add your actions and publish the Zap.

One address, several events

A Catch Hook can take more than one event. Add a Paths or Filter step on the Type field (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

The resell.store app isn't on Zapier yet. Once it is, Connect on Zapier shows on resell.store/tools/api and these steps work. Until then, use Webhooks by Zapier (above): Zaps you make that way keep working.
  1. In Zapier, make a Zap. For the trigger, search for resell.store and choose an event, like New Sale.
  2. 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.
  3. Choose a Shop if the Zap is only for one of them. Leave it empty for all your shops.
  4. 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.
  5. 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

Zapier signs in with the same secret key as your own code. If you choose Make a new key, the old one stops working everywhere, Zapier included. Reconnect the resell.store account in Zapier's Apps page with the new key.

What can start a Zap

EventIn the resell.store appWhen
listing.soldNew SaleSomething sold
offer.receivedNew OfferA buyer made an offer
offer.updatedUpdated OfferA buyer took your counter, turned it down or withdrew
question.askedNew Buyer MessageA buyer sent a message
order.completedOrder CompletedA buyer said it arrived and it's all good
order.problemProblem ReportedA buyer reported a problem with an order
order.refundedOrder RefundedAn order was cancelled or refunded
payout.sentPayout SentMoney went to your PayPal
review.createdNew ReviewA 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):

New Sale
{
  "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: total is what the buyer paid, payout__seller_net what you get after fees.
  • event_type and event_id say 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

If the Zap is already on, a sample you send runs its actions for real: a row in your sheet, a text to your phone. To be safe, add a Filter step first: continue only if 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 rating 5 and public true.
  • 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.

CallWhat it does
POST /webhooks/subscriptionsSubscribe an address to some events. Call it again with the same address to change them
DELETE /webhooks/subscriptions/:idUnsubscribe it
GET /webhooks/samples/:eventUp to 10 sample events from the seller's latest things, for showing fields
POST /webhooks/subscriptions/:id/testPost a sample to the address now
Terminal
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. 200 means 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.