Classifieds and rentals

Take the fake flat off your site before anybody pays for it

Ads, replies and messages between the person posting and the person answering, checked as they are written. ToxicFilter recognises the owner who is abroad and wants the deposit before a viewing, the job that charges you to start and the replica sold as real, and tells you why in a sentence you can show the advertiser.

What goes wrong on platforms like yours

Rentals that do not exist

A bright flat at half the going rate, an owner who happens to live abroad, a deposit to send before anybody sees it and keys that will arrive by post. The people who fall for it are usually in a hurry to find somewhere to live, and they lose the deposit and the weeks they spent waiting.

Jobs that ask the applicant for money

A registration fee, a starter kit to buy, a cheque to cash and send the difference back, parcels to receive at home and forward. A classifieds site is where these are posted, between the honest waiter jobs, and each one reads like an ordinary ad until the money moves the wrong way.

Bank details and phones in plain sight

People paste their IBAN into an ad so the buyer can send the deposit, or a card number by mistake. Refusing the ad loses it; publishing it hands somebody's bank account to whoever reads the page.

Replicas next to the second-hand bags

"1:1", "AAA grade", "wholesale, worldwide shipping": the counterfeit seller writes in a vocabulary of their own, right beside the person selling a genuine bag with its receipt. Your rule is about the first one, and the second must stay untouched.

What it decides, on content like yours

Judged right now by the engine the API uses, under the template for this kind of platform, with no model involved.

  1. 01 A rental that does not exist
  2. 02 A job that charges to start
  3. 03 A phone and an IBAN in an ad
  4. 04 A replica sold as real
  5. 05 An honest room to rent

A rental that does not exist POST /v1/conversation

tenant Hi! Is the houseboat still free? Could I come and see it this week?

owner It is, but I live abroad now, so I am not around for a while.

tenant Oh, so how would it work?

owner Send the deposit first to reserve it, there are lots of people interested.

block 24 ms
  • Reads like a rental that does not exist: the owner is abroad and a deposit is asked for up front.

The last message alone asks for a deposit, which honest landlords do, and passes. Two messages earlier the same person said they live abroad and cannot be there, and that pair is enough for the classifieds template to refuse it.

The answer, abridged
{
  "decision": "block",
  "flagged": [
    "scam"
  ],
  "scores": {
    "scam": 0.6
  },
  "signals": [
    {
      "category": "scam",
      "score": 0.6,
      "reason": "Reads like a rental that does not exist: the owner is abroad and a deposit is asked for up front.",
      "evidence": [
        "i live abroad",
        "send the deposit"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 24
}

A job that charges to start POST /v1/text

Logistics assistant, part time from home. You receive parcels at home and forward them to our clients. To start, a refundable fee of 60 € for your starter kit.

block 7 ms
  • Reads like a job scam: it asks the applicant to pay before starting and asks the applicant to receive and forward parcels.

Paying a fee to start and forwarding parcels from home are two of the strongest signs of a job scam, and together they are refused. "No experience needed" on its own is in every honest summer job and passes.

The answer, abridged
{
  "decision": "block",
  "flagged": [
    "scam"
  ],
  "scores": {
    "scam": 0.9
  },
  "signals": [
    {
      "category": "scam",
      "score": 0.9,
      "reason": "Reads like a job scam: it asks the applicant to pay before starting and asks the applicant to receive and forward parcels.",
      "evidence": [
        "refundable fee",
        "receive parcels at home"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

A phone and an IBAN in an ad POST /v1/text with redact: true

Sofa bed, good condition, 80 €. Call me on +44 7700 900456 or pay the deposit to ES91 2100 0418 4502 0005 1332.

review 7 ms
  • Contains what looks like a phone number.
  • Contains 1 bank account number(s) (IBAN). Publishing one invites fraud against whoever owns it.

The IBAN holds the ad for a look rather than refusing it, and the answer comes back with the phone and the IBAN masked. A phone number alone passes under this template, because a classified ad is often meant to carry one.

The answer, abridged
{
  "decision": "review",
  "flagged": [
    "personal_data"
  ],
  "scores": {
    "personal_data": 0.9
  },
  "signals": [
    {
      "category": "personal_data",
      "score": 0.5,
      "reason": "Contains what looks like a phone number.",
      "evidence": [
        "447•••••••56"
      ]
    },
    {
      "category": "personal_data",
      "score": 0.9,
      "reason": "Contains 1 bank account number(s) (IBAN). Publishing one invites fraud against whoever owns it.",
      "evidence": [
        "ES••••••••••••••••••1332"
      ]
    }
  ],
  "redacted": "Sofa bed, good condition, 80 €. Call me on [redacted] or pay the deposit to [redacted].",
  "model": {
    "read": false
  },
  "took_ms": 7
}

A replica sold as real POST /v1/text

Gucci Marmont bag 1:1 replica, AAA grade, wholesale price, worldwide shipping. More models on my yupoo album.

block 7 ms

Counterfeits are a subject and not a harm, so they act only where a rule says so. The classifieds template says so; somebody asking whether their bag is authentic is left alone.

The answer, abridged
{
  "decision": "block",
  "flagged": [
    "topic:counterfeit"
  ],
  "topics": {
    "counterfeit": 0.98
  },
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 7
}

An honest room to rent POST /v1/text

Room in a shared flat near the station, 420 € a month, bills included. Viewings on weekday evenings; one month's deposit at signing.

allow 7 ms

A deposit at signing and viewings in the evening are what a real landlord writes. The free checks settle it in about a millisecond, and nothing is paid for.

The answer, abridged
{
  "decision": "allow",
  "flagged": [],
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 7
}

What it decides, on content like yours

Judged right now by the engine the API uses, under the template for this kind of platform, with no model involved.

A rental that does not exist POST /v1/conversation

tenant Hi! Is the houseboat still free? Could I come and see it this week?

owner It is, but I live abroad now, so I am not around for a while.

tenant Oh, so how would it work?

owner Send the deposit first to reserve it, there are lots of people interested.

block 24 ms
  • Reads like a rental that does not exist: the owner is abroad and a deposit is asked for up front.

The last message alone asks for a deposit, which honest landlords do, and passes. Two messages earlier the same person said they live abroad and cannot be there, and that pair is enough for the classifieds template to refuse it.

The answer, abridged
{
  "decision": "block",
  "flagged": [
    "scam"
  ],
  "scores": {
    "scam": 0.6
  },
  "signals": [
    {
      "category": "scam",
      "score": 0.6,
      "reason": "Reads like a rental that does not exist: the owner is abroad and a deposit is asked for up front.",
      "evidence": [
        "i live abroad",
        "send the deposit"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 24
}

A job that charges to start POST /v1/text

Logistics assistant, part time from home. You receive parcels at home and forward them to our clients. To start, a refundable fee of 60 € for your starter kit.

block 7 ms
  • Reads like a job scam: it asks the applicant to pay before starting and asks the applicant to receive and forward parcels.

Paying a fee to start and forwarding parcels from home are two of the strongest signs of a job scam, and together they are refused. "No experience needed" on its own is in every honest summer job and passes.

The answer, abridged
{
  "decision": "block",
  "flagged": [
    "scam"
  ],
  "scores": {
    "scam": 0.9
  },
  "signals": [
    {
      "category": "scam",
      "score": 0.9,
      "reason": "Reads like a job scam: it asks the applicant to pay before starting and asks the applicant to receive and forward parcels.",
      "evidence": [
        "refundable fee",
        "receive parcels at home"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

A phone and an IBAN in an ad POST /v1/text with redact: true

Sofa bed, good condition, 80 €. Call me on +44 7700 900456 or pay the deposit to ES91 2100 0418 4502 0005 1332.

review 7 ms
  • Contains what looks like a phone number.
  • Contains 1 bank account number(s) (IBAN). Publishing one invites fraud against whoever owns it.

The IBAN holds the ad for a look rather than refusing it, and the answer comes back with the phone and the IBAN masked. A phone number alone passes under this template, because a classified ad is often meant to carry one.

The answer, abridged
{
  "decision": "review",
  "flagged": [
    "personal_data"
  ],
  "scores": {
    "personal_data": 0.9
  },
  "signals": [
    {
      "category": "personal_data",
      "score": 0.5,
      "reason": "Contains what looks like a phone number.",
      "evidence": [
        "447•••••••56"
      ]
    },
    {
      "category": "personal_data",
      "score": 0.9,
      "reason": "Contains 1 bank account number(s) (IBAN). Publishing one invites fraud against whoever owns it.",
      "evidence": [
        "ES••••••••••••••••••1332"
      ]
    }
  ],
  "redacted": "Sofa bed, good condition, 80 €. Call me on [redacted] or pay the deposit to [redacted].",
  "model": {
    "read": false
  },
  "took_ms": 7
}

A replica sold as real POST /v1/text

Gucci Marmont bag 1:1 replica, AAA grade, wholesale price, worldwide shipping. More models on my yupoo album.

block 7 ms

Counterfeits are a subject and not a harm, so they act only where a rule says so. The classifieds template says so; somebody asking whether their bag is authentic is left alone.

The answer, abridged
{
  "decision": "block",
  "flagged": [
    "topic:counterfeit"
  ],
  "topics": {
    "counterfeit": 0.98
  },
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 7
}

An honest room to rent POST /v1/text

Room in a shared flat near the station, 420 € a month, bills included. Viewings on weekday evenings; one month's deposit at signing.

allow 7 ms

A deposit at signing and viewings in the evening are what a real landlord writes. The free checks settle it in about a millisecond, and nothing is paid for.

The answer, abridged
{
  "decision": "allow",
  "flagged": [],
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 7
}

What it looks for

Each a score of its own, with its own lines, and the reason in a sentence whenever one acts.

The template you start from

Pick it when you create a policy and these rules are written for you, ready to edit. Everything it does not mention keeps following our defaults.

  • Scam holds at 0.30 · refuses at 0.60
  • Spam holds at 0.35 · refuses at 0.65
  • Filter evasion holds at 0.35 · refuses at 0.70
  • Gibberish holds at 0.45 · never refuses
  • Personal data holds at 0.60 · refuses at 1.00
  • Counterfeit goods holds at 0.50 · refuses at 0.80

Set by the template

One call before you publish

Send the text with where it will appear, and act on the decision.

The request

curl https://toxicfilter.com/api/v1/text \
  -H "Authorization: Bearer $TOXICFILTER_KEY" \
  -d content="Hi! Is the houseboat still free? Could I come and see it this week?" \
  -d surface=listing
The full reference →

A month, in numbers

Items checked
120,000
Read by the model
9,000
Images
15,000
Credits, about
333,000

Fits in the Max plan. See the plans →

A guide to moderating a classifieds site

What to check, when to check it and how to set the rules, for rental ads, job ads and the messages that answer them.

How to moderate classified ads before they are published

Call the API when an ad is submitted, and act on one of three answers: publish it, hold it for a person, or refuse it. Most ads are somebody selling a sofa or letting a room, and the free checks settle them in about a millisecond, so posting does not get slower. The model only reads what they leave open, and you decide per call whether it may. What arrives in review waits in a queue, in your dashboard or through the API, and a signed webhook tells your site when somebody approves it.

How to stop rental scams

A fake rental is never one suspicious word. It is a shape: the owner is abroad, the deposit goes first, the keys will come by post, and a platform or a transfer service is supposed to hold the money in between. Each of those on its own is something a real landlord might say, which is why ToxicFilter only flags an ad that carries two or more of them from the same person, and refuses one with three. Under the shipped lines two parts are held for review; the classifieds template lowers the scam block line to 0.60, so two parts are already refused. Send the replies to /v1/conversation and the owner is read across every message they wrote, because the offer usually arrives in pieces.

How to detect job scams in classified ads

Honest job ads say "no experience needed" and "paid weekly" all the time, so those count for little. What gives a job scam away is money moving towards the employer: a fee to start, a starter kit or equipment to buy, a cheque to cash and send the difference back, parcels to receive at home and forward. Under the classifieds template, two of those together are refused, and so is one beside an easy-money promise or an interview held over a chat app. Two of the weak signs together are only held for a look, and any one sign alone is nothing.

Bank details and phone numbers in ads: mask them

An ad with a phone number in it is usually meant to have one, and the classifieds template lets it through. An email address or an IBAN holds the ad for review, because the template is set to hold personal data rather than refuse it. With redact, the answer carries the same text with the number masked, so the rest of the ad can be published. IBANs are checked by their checksum and cards by theirs plus a real issuer prefix, so a sixteen digit reference is not reported as a card.

Counterfeits: a rule of your house

Talking about replicas is fine; selling them is what your rule is about. Counterfeits are a measured subject rather than a category of harm: every answer carries the score, and nothing happens until a rule gives it a line. The classifieds template holds an ad from 0.50 and refuses it from 0.80, so a listing built around "1:1" and "AAA grade" is refused, while a genuine second-hand bag with its receipt is not.

Choosing the thresholds for your classifieds site

Start from the classifieds template, which lowers the lines for scams, spam and disguised text, holds personal data rather than refusing it and adds a line for counterfeits. Then try any change as a second policy running in parallel with the one in force: both verdicts are computed on your own traffic, only one acts, and the dashboard shows where they disagree before you switch.

Frequently asked questions

How do you detect fake rental listings?

ToxicFilter looks for four parts of the same offer: the owner is abroad, a deposit is asked for up front, the keys are to be sent without a viewing, and a platform or a money transfer service is said to hold the money. One alone is how honest landlords talk and is never flagged. Two from the same person are held for review by default, and the classifieds template refuses them; three or more are refused either way.

Can it read a scam that arrives over several messages?

Yes. Send the conversation to /v1/conversation with an author on each message, and ToxicFilter reads the person who wrote the last message across everything they said, because these offers usually arrive in instalments. The tenant who replies is judged on their own words.

Will it flag somebody warning others about a scam?

No. A message asking whether something is a scam, or warning others to watch out for one, silences every scam check, so the person who reports a fake flat is never filed as the one running it.

What happens to an ad with a phone number or a bank account in it?

Under the classifieds template, a phone number alone passes, because an ad is often meant to carry one. An email address or an IBAN holds the ad for review: the template is set to hold personal data, not to refuse it. With redact, the answer carries the same text with the phone, the email, the IBAN or the card masked. Cards and IBANs are validated by their checksum, so a long reference number is not mistaken for one.

Does it work for ads in Spanish and other languages?

The instant checks carry phrase patterns for rental and job scams in English, Spanish, Portuguese, French, Italian, German, Catalan and Dutch. The model reads many more. Your own word lists work in any language.

Do I have to tell an advertiser why their ad was removed?

In the EU, yes: article 17 of the Digital Services Act requires a statement of reasons for every removal or restriction, whatever the size of the platform. ToxicFilter can write it for you with every blocked ad.

Try it on your own traffic

2,000 credits a month on the free plan, no card. Enough to send a week of your own content and see what it says about it.