Marketplaces

Moderate marketplace listings against your own rulebook.

Your marketplace rules are specific: what can be sold, who can sell it, what can’t go in a description. Check each new or edited listing against them and publish only what passes.

Generic moderation doesn’t know your rules

Off-the-shelf moderation is good at spotting hate speech or explicit content. It doesn’t know that your platform bans arranging payment off the platform, however it’s worded, that alcohol needs a verified seller, or that a “brand new iPhone for $300” in the wrong category is a pattern your team rejects every day.

Those rules already exist in your seller guidelines. Enforly evaluates each listing against them as written, together with facts about the seller, so the check reflects your marketplace instead of a generic list of categories.

Where the check fits

One call between the step that prepares something and the step that sends, publishes, or runs it. Your code applies the decision.

See it decide

The same policy evaluated on three cases. Pick one and run the check to see which evidence it relies on.

Policy

Listings must follow data.rules: no prohibited items, no contact details or external payment instructions in the text, and the description must match the category. Items in restricted categories go to review unless data.seller.verified is true.

data

{
"listing": {
"title": "Road bike, size M",
"category": "Sports",
"price": 420,
"description": "Aluminum frame, new tires, light scratches on the fork. Pickup in Palermo."
},
"seller": {
"verified": false,
"listings": 3
},
"rules": {
"prohibited": [
"weapons",
"counterfeits"
],
"restricted": [
"alcohol",
"airsoft"
]
}
}

Result

violationProbability—
reviewProbability—

Why: Allowed item, no contact details or payment instructions, and the description matches the category.

Your code: Publish.

Response JSON
{
  "decision": "allow",
  "allowed": true,
  "violationProbability": 0.04,
  "reviewProbability": 0.05,
  "policyId": null,
  "policyVersion": null,
  "requestId": "req_7f3a…"
}

Illustrative example. Real probabilities depend on your policy wording and the evidence you send.

allow · Normal listing

Allowed item, no contact details or payment instructions, and the description matches the category.

deny · Off-platform payment

No phone number or app name is spelled out, but the description asks buyers to contact the seller off-platform and pay by bank transfer to skip fees.

review · Restricted item

Wine is a restricted category and the seller isn’t verified.

Use review for your moderation queue

Most listings are fine and should go live without waiting. allow publishes them; deny rejects clear violations with a reason the seller can act on; review sends only the uncertain or restricted ones to moderators. Your queue gets shorter and holds the cases where a person adds value.

Re-check listings when they’re edited: a clean listing can gain a “message me first” a day later.

Photos and other signals

Enforly evaluates the JSON you send. For images, run your image classifier or captioning first and include its output, such as detected objects or text in the photo, as evidence alongside the listing.

Set it up

  1. 1

    Turn your seller guidelines into a policy

    Paste the parts that matter: prohibited and restricted items, what can’t appear in text, who can sell what.

  2. 2

    Check on create and edit

    Send the listing and seller facts each time a listing is created or changed.

  3. 3

    Publish, queue, or reject

    Use the decision to publish, add to the moderator queue, or reject with a reason.

Listing webhook handler
import { Enforly } from '@enforly/sdk'

const guard = new Enforly({ apiKey: process.env.ENFORLY_API_KEY })

export async function onListingSaved(listing, seller) {
  const result = await guard.check({
    policyId: LISTING_RULES_ID,
    data: {
      listing: pick(listing, ['title', 'category', 'price', 'description']),
      seller: { verified: seller.verified, listings: seller.listingCount },
      imageLabels: await vision.labels(listing.photos), // optional evidence
    },
  })

  const status = result.allowed ? 'published' : result.decision === 'review' ? 'pending_review' : 'rejected'
  await db.listings.update(listing.id, { status, checkId: result.requestId })
}

Full request and response fields are in the API reference. Using a coding agent? Point it to Build with AI.

What Enforly doesn’t do

Enforly evaluates the information you send and returns a decision. It doesn’t run operations, and it doesn’t guarantee safety or compliance on its own.

  • Enforly doesn’t look at images directly. Send image labels or extracted text as evidence.
  • It doesn’t verify identity or detect payment fraud; send the results of those checks if your rules depend on them.
  • Keep a human appeal path for rejected sellers.

Questions

How is this different from keyword filters?

Keyword lists catch “WhatsApp” but miss “message me on WA” and wrongly block “WhatsApp-compatible phone case”. Enforly evaluates the meaning of the listing against the rule.

Can I use different rules per category?

Yes. Save a policy per category and send the matching policyId, or check several with policyIds.

What should I show the seller on deny?

Use your own message for the rule they broke. With policyIds, results tells you which policy denied.

Related

Try this policy on your own data.

Copy the policy above, add your real examples, and see the decision. 200 free checks per month, no credit card.