If you have ever participated in an auction, you may have sometimes lost what seemed like a very good deal at the very last minute. We will describe here how and why that might happen and how you could as well win an auction at the last minute.
Sniping refers to entering your auction bid at the very last possible moment, avoiding thus being outbid by other less disciplined bidders or to avoid techniques or situations such as bid chasing, bidding wars, maximum bid fishing, or shill bidding (see the Wikipedia article linked below for explanations). Research by economists seem to qualify sniping as a “rational gain-minimizing strategy”.
Economic analysis of sniping (Roth and Ockenfels, 2000) suggests that sniping is a rational gain-maximizing (i.e., price-minimizing) strategy for bidders in auctions which fulfill two criteria: 1) the end time is rigidly fixed, and 2) it is possible to gain additional information about the "true" value of the item by inspecting previous bids. For example, a novice antiques buyer may prefer to bid in auctions which already have bids placed by more experienced antiques buyers, on the grounds that the items which the experienced buyers are interested in are more likely to be valuable. In this case, more informed buyers may delay bidding until the last minutes of the auction to avoid creating competition for their bids, leading to a lower winning bid. The highest bid 10 minutes before the end of a contested auction is often not at all representative of the eventual selling price.
Analysis of actual winning bids on eBay (Yang and Kahng, 2006) suggests that winning bidders are more likely to have placed a single bid late in the auction, rather than placing multiple incremental bids as the auction progresses.
Auction Sniping is not illegal and according to Wikipedia is permitted by eBay (there is even a guide on their website – hwddlr). However, some commentators (so-ebayapi) have pointed out that the PlaceOffer API license agreement addendum (PDF) prohibits developers from offering this service.
Despite the prohibition, a number of websites offer this service online, making it very convenient and easy to snipe (although for the most part you have to pay a fee).
A number of Sniping Services exist, the only completely free one being Gixen, which also provides the above comparison chart on their website. Still, Auction Stealer is “freemium” while Auction Sniper has a free trial with 3 free snipes. All these services require you to enter your eBay username and password, which opens you to identity theft. Some of the websites above may even provide Android and iPhone apps. There is even one such app that is seemingly providing free service – Myibidder – and it seems associated with a website purporting to offer this service for free, although on Android a “pro” version of the app currently costs in excess of $10. YouBidder.com and Goofbid.com are yet other such a supposedly free services, while Hidbid.com allows 5 free snipes per week.
We have no reason to suspect that any of the aforementioned services is a scam, but they all need your eBay username and password to work, and as such, you run a higher risk of identity theft by spreading your credentials around. A script or program that you run yourself offers a greater degree of protection.
This is a venerable and yet still actively developed Java-based, multiplatform application. A Windows executable and installer is provided and you can also download the jar file (currently at version 2.5.6).
This used to be the primary repository for free software. Projects hosted there are generally in the format ProjectName.sourceforge.net, while the files can be found at sourceforge.net/projects/ProjectName.
For example, esniper, a famous and quite old project, yet still updated, has generated even a front-end: es-f or “esniper frontend.” Other such projects include AuctionMage (last upd: 2005), Bidwatcher (abandoned), Biet-O-Matic (bom, in German, frequently updated).
This repository seems to long ago have replaced sourceforge as the hip place to commit and store your code. A search (github-srch) finds the following: madprogrammer/sniper 4 y.o., anentropic/esniper-manager 2 y.o. (from backsla.sh/sniper).
John Comeau has created this Python script in 2009 and released it under GNU v2 or later. I am reproducing it here for archival purposes (jcb).
This is a Python script.
#!/usr/bin/python """snipe bids on eBay wait until specified second before auction ends and place bid""" Copyright = """ bidsnipe - sneaky way to win eBay auctions Copyright (C) 2009 John Comeau <jc.unternet.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. """ import sys, os, re, pwd, time import urllib, urllib2, cookielib from BeautifulSoup import BeautifulSoup cookiejar = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar)) def findLoginForm(soup): pattern = re.compile('(?i)login') forms = soup.findAll('form') loginforms = filter(lambda node: pattern.search(node.get('action')), forms) if len(loginforms) != 1: raise Exception, 'Document does not contain one and only one login form' return loginforms def getInputs(soup): inputs = soup.findAll('input') return dict([[input.get('name').encode('utf8'), input.get('value').encode('utf8')] for input in inputs]) def bidsnipe(item=11111111, maxbid=1, seconds=10): """bid on item number with max price at so many seconds before end takes those 3 arguments, gets login info from $HOME/.netrc file """ print >>sys.stderr, 'sleeping %s seconds' % seconds time.sleep(float(seconds)) ebay = 'm.ebay.com' # mobile eBay site has less garbage to sift through page = login(ebay) socket = opener.open('https://%s/Pages/ViewItem.aspx?aid=%s' % (ebay, item)) soup = BeautifulSoup(socket.read()) socket.close() socket = opener.open('https://%s/Member/Bid.aspx?btnOffer=btnOffer' % ebay) soup = BeautifulSoup(socket.read()) socket.close() bidform = soup.findAll('form')[-1] inputs = getInputs(bidform) inputs.pop('btnCancel') inputs['bid'] = maxbid action = bidform.get('action') enctype = bidform.get('enctype') loginurl = 'https://%s' % ebay + action opener.addheaders = [('content-type', enctype)] socket = opener.open(loginurl, urllib.urlencode(inputs)) soup = BeautifulSoup(socket.read()) socket.close() confirmform = soup.findAll('form')[-1] print >>sys.stderr, confirmform inputs = getInputs(confirmform) print >>sys.stderr, inputs inputs.pop('btnCancel') inputs.pop('btnBack') action = confirmform.get('action') enctype = confirmform.get('enctype') loginurl = 'https://%s' % ebay + action opener.addheaders = [('content-type', enctype)] socket = opener.open(loginurl, urllib.urlencode(inputs)) page = BeautifulSoup(socket.read()) socket.close() return page def login(ebay): pattern = '^machine\s+%s\s+login\s+(\S+)\s+password\s+(.*\S)\s*$' % ebay login_data = filter(re.compile(pattern).match, open(os.path.join( pwd.getpwuid(os.geteuid()), '.netrc')).readlines()) username, password = re.compile(pattern).match(login_data[-1]).groups() socket = opener.open('https://%s/' % ebay) soup = BeautifulSoup(socket.read()) socket.close() loginform = findLoginForm(soup) enctype = loginform.get('enctype') action = loginform.get('action') loginurl = 'https://%s' % ebay + action opener.addheaders = [('content-type', enctype)] socket = opener.open(loginurl, urllib.urlencode(getInputs(loginform))) soup = BeautifulSoup(socket.read()) socket.close() loginform = findLoginForm(soup) inputs = getInputs(loginform) inputs['uid'] = username inputs['upw'] = password inputs.pop('btnCancel') enctype = loginform.get('enctype') action = loginform.get('action') loginurl = 'https://%s' % ebay + action opener.addheaders = [('content-type', enctype)] socket = opener.open(loginurl, urllib.urlencode(inputs)) page = socket.read() socket.close() if username in page: sys.stderr.write('login successful\n') return page if __name__ == '__main__': item, maxbid, seconds = (sys.argv[1:] + ['', '', ''])[0:3] print bidsnipe(item, maxbid, seconds) else: # if you want something to be done on import, do it here; otherwise pass pass
Paul Schou has also released an earlier, similar tool, although this one has no scheduling and was written in 2007 (pss).
This is a bash script.
# Written by Paul Schou for ebay last minute bidding. 1 Dec 2007
# Set these parameters to your account details:
# Do not modify below:
if [ `date +%s` -gt 1199174400 ]; then
echo "Please run $0 -v to check for updates"
if [ "$item" == "-v" ]; then
echo "Snipe version $ver (EBay Auction Sniper)";
curl -s -A "Snipe Version $ver" --data "uname=`uname -a`" http://paulschou.com/tools/sniper/update.php
if [ "$user" == "" ]; then
echo "ERROR: ebay username / password is not set.";
if [ "$item" == "" ]; then
echo "Usage: $0 [auction number] [amount to bid]"
encpass=`echo "<?php echo urlencode('$pass'); ?>" | php`
sw="-s -L -A Mozilla -b $cookies -c $cookies"
echo "item: $item"
echo "max bid: $max"
echo Loading sign in page...
curl $sw -o $tmp/mytest1.html "https://signin.ebay.com/ws/eBayISAPI.dll?SignIn"
echo Signing in...
curl $sw -o $tmp/mytest2.html --data "$post" "https://signin.ebay.com/ws/eBayISAPI.dll?UsingSSL=1"
echo Making bid...
curl $sw -o $tmp/mytest4.html "http://offer.ebay.com/ws/eBayISAPI.dll?maxbidTop=$max&MfcISAPICommand=MakeBid&fb=2&co_partnerid=&item=$item&input_bid=$max"
key=`grep =.key mytest4.html | sed -e 's/.*key"[^"]*"\([^"]*\).*/\1/g'`
if [ "$key" == "" ]; then
echo "ERROR: Bid not accepted."
echo "bid key: $key"
keystr=`grep =.key mytest4.html | sed -e 's/<.t.>//g' -e 's/<input type="[^"]*" name="\([^"]*\)" value="\([^"]*\)"[^>]*>/\&\1=\2/g' | tr -d '\r\n'`
uiid=`grep uiid mytest4.html | sed -e 's/<t.>//g' -e 's/.*<input type="[^"]*" name="\([^"]*\)" VALUE="\([^"]*\)".*>/\1=\2/g'| tr -d '\r\n'`
printf "===== Notice =====\nYou are agreeing to a contract -- \n\nYou will enter into a legally binding contract to purchase the item from the seller if you're the winning bidder. You are responsible for reading the full item listing, including the seller's instructions and accepted payment methods. Seller assumes all responsibility for listing this item.\n\n"
echo Confirming bid...
curl $sw -o $tmp/mytest5.html --data "BIN_button=Confirm Bid&$uiid$keystr" http://offer.ebay.com/ws/eBayISAPI.dll
echo Checking status...
curl $sw -o $tmp/mytest6.html "http://offer.ebay.com/ws/eBayISAPI.dll?ViewBids&item=$item"
status=`grep -A 1 status mytest6.html | tail -1`
echo "status: " $status;
grep titleValueFont mytest6.html | sed -e "s/<\/span>/ /g" -e 's/<[^>]*>//g'
grep -A 3 findresulttitle mytest6.html | grep '</td' | sed -e "s/^[ \t]*//" -e 's/<[^>]*>//g' | sed '/\n$/b'
If, by now, you are sick and tired of eBay, you might want to consider other services.
Auction sites (also fixed price)
- eBid.net – auction and fixed price, this is perhaps the oldest alternative, with varying fees starting at 3% on the sale price.
- BidStart – complicated fee structure, 8% or less
- Onlineauction – $8/month, started by a disgruntled eBay PowerSeller
- ealtbay – only 1.6% of sale price in fees, but low traffic
- tophatter – entertaining, with avatars and chat
- uBid – sliding scale of 5% and less
- cqout – from UK; no listing fees but $3 for registering + sliding scale of 7% and less
- liquidation – bulk and large quantities; 10-15% or $30, whichever is greater + no bid fee if no bids; NASDAQ
Fixed price (classifieds)
- Craigslist.org – high traffic, absolutely free (no fees); eBay is trying to get their traffic with a similar site, Kijiji, and they have even bought part of it
- Freecycle.org – everything is free, but craigslist has a free section as well
- Facebook Marketplace – run by oodle, used mostly for real estate and cars
- amazon – high traffic, fees 8%-25%, optional $39.00 monthly subscription for a pro seller account
- etsy – focused on handmade and vintage items, $0.20/listing + 3.5% of sale price, free store
- newegg – 8-15% depending on category but free cred card processing
- ecrater – free, with optional 2.9% marketplace advertising
- bonanza – a lot of fashion an handmade items, 3.5% of sale price, no listing fees
- artfire – similar to etsy but $12.95/month
- tias – antiques, it can submit to over 2000 classified ad networks, $39.95/month or 10% of sale price
- storenvy – completely free
- epier – free and very similar to craigslist, but many paid upgrades
- delcampe.net – for collectibles, 5.5% or less of monthly sales volume
Haggle (“make an offer” or fixed price)
- ioffer – free store & listings, 5-10% on sale+shipping
- rubylane – niche, high-end, $15 setup, $54 monthly minimum
Payment (PayPal alternatives)
- Square – 2.75% all swiped transactions, 3.5% + $0.15 for manual
- Skrill (formerly Moneybookers) – their fees may be higher than PayPal
- ProPay $49.95/year, but they have subscription billing service
- Google Wallet – strictly buyer/seller, can’t send money to other GW users
- Amazon Payments – currently only in US, Germany and UK – almost free!
- Dwolla – both buyer & seller must have an account, flat $0.25 per transaction
- Payza – both buyer & seller must have an account, 190 countries + 21 currencies
- Payoneer – they give a virtual + physical prepaid Mastercard; loading fee %1-3.75%, 2-7 days delay
- WePay – website integrator, 2.9% + $0.30 for credit cards and 1% + $0.30 for debit.
PayPal will soon offer Bitcoin processing, but this should not stop you from using it as an alternative.
If you are wondering why we are considering alternatives to PayPal, note that when launched, this was an innovative and agile company, but after having been acquired by eBay, it turned into a dud – see PayPal Mafia.