Another Developer List Email
From Prosper:
Thank you for your patience while we have been working through the recent API and XML issues.
The web service API has been re-enabled and we are monitoring it closely. You may notice that the Prosper calculated ROI numbers are temporarily unavailable. We apologize for any inconvenience this may have caused you and are committed to making the ROI numbers available via the XML. We are still running down the issue.
The problems with the XML data have been tracked to the source but have not been corrected yet. We hope to have this corrected soon.
Sincerely,
Prosper
Prosper Starting To Use the Developer Mailing List
I have been a member of the Prosper developer mailing listing since the list’s inception… This is the 1st instance of using the list. They made the relevant announcement. Kudos! (it is about time) Here is the email…
Prosper is experiencing two issues that may be affecting your applications and code.
1. The web service API has been temporarily disabled due to a performance issue.
2. The XML data dump has at least one illegal character in it.
We do not currently have an estimated time for the fix, however we are actively working to resolve both issues quickly as it is impacting many customers.
Sorry for the inconvenience and we appreciate your patience.
Sincerely,
Prosper
Here is a link where you can register for the developer mailing list. ![]()
Prosper Days 2008
I am now fully recovered from Prosper Days 2008 and starting to get back into the normal swing of things, but before I get to far removed I wanted to write a quick blog post with my thoughts and observations.
First and foremost, it was nice to meet all of the wonderful and intelligent people that I met at Prosper Days.
I was on the blogger panel and the API sessions… I was very impressed with Dave McClure of Master of 500 hats. He was on the blogger panel with me… I wish I had had a chance to speak with him more…
I thought both the 2 API sessions in which I was involved were remarkably well attended and I enjoyed presenting.
Adam (I forget the last name, but I do remember his screen name: FriendsWhoLend) was VERY impressive on the managing large portfolio panel. He clearly understands the challenges and the opportunities in investing in p2p lending. Also on the panel was the CEO of Optalytic.
Unfortunately, I was on an API panel during the collections panel, but I hear that Doug Fuller was impressive. I for one say that he can do whatever he thinks will increase my return with my delinquent loans.
From Chris Larsen’s keynote my takeaway was that certain social capital does matter. (Verified friends with a bid decreases the chance of default… More friends with more bids = less chance of default.) Also I hear the the cure rate of loans in collections doubled on a percentage basis and that there was more work to do in this area.
Steven Dubner was great. He was articulate and engaging — 2 core uses of money Sex and Food. Incentives play a huge roll in behavioral economics.
After demoing QuickSnipe I will now be turning it into a my tool of choice for bidding. Watch this blogs for updates.
Bidding With the Prosper API Code Example QuickSnipe.java
For my ProsperDays presentation this year I will demonstrating bidding with the Prosper API… I have built a quick and dirty bid snipping java program. (This program is not ready for primetime as bid sniping tool, but it is very close and a very effective demo. The reason I say it is not ready is that it lacks memory, meaning that it would bid on the same listing on subsequent passes.)
I think API bidding is the 1st step in a brave new world of Prosper Lending. For one, it easily allows custom models.
So what does this 126 line program do?
It queries the active AA-C credit grade listings… If a listing passes my extended credit filters (hard coded) AND the minimum Prosper calculated ROI values (generated by Prosper and the floor is passed in as a parameter) AND the minimum time remaining in the auction it will place a validation test bid or a real bid.
What are the extended credit requirements of this code? Short answer… very tight.
- 0 current DQ
- 0-1 inquires in the last 6 months
- 0 public records in last 10 years
- 0 DQ in last 7 years
- Bankcard utilization between 3% and 80%
Here is the java code (I have contributed this code to the SourceForge Prosper API project). It requires the API classes generated by the Java2WSDL and open source tool by Apache foundation.
package prosper.api;
import java.math.BigDecimal;
import java.math.MathContext;
import java.rmi.RemoteException;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Iterator;
import java.util.TreeMap;
import javax.xml.rpc.ServiceException;
import com.prosper.services.ProsperAPI.DefinitionResult;
import com.prosper.services.ProsperAPI.Field;
import com.prosper.services.ProsperAPI.Listing;
import com.prosper.services.ProsperAPI.ProsperAPILocator;
import com.prosper.services.ProsperAPI.ProsperAPISoap;
import com.prosper.services.ProsperAPI.ProsperObject;
import com.prosper.services.ProsperAPI.ProsperObjectResult;
public class QuickSnipe
{
private String m_Username;
private String m_Password;
private double m_MinROI;
private int m_HoursToGo;
private boolean m_PlaceBids;
private ProsperAPISoap m_APISoap;
public QuickSnipe(String username, String password, double minROI, int hoursToGo, boolean placeBids) throws ServiceException
{
m_Username = username;
m_Password = password;
m_MinROI = minROI;
m_PlaceBids = placeBids;
m_HoursToGo = hoursToGo;
m_APISoap = (new ProsperAPILocator()).getProsperAPISoap();
}
/**
* @param args
*/
public static void main(String[] args)
{
if (args.length!=5)
{
System.err.println("Usage: QuickSnipe username password minROI hoursToGo PlaceBids");
return;
}
try
{
QuickSnipe qs = new QuickSnipe(args[0], args[1], Double.parseDouble(args[2]), Integer.parseInt(args[3]), Boolean.parseBoolean(args[4]));
qs.snipe();
}
catch (Exception e)
{
e.printStackTrace(System.err);
}
}
private void snipe() throws Exception
{
DefinitionResult res = m_APISoap.login(m_Username,m_Password);
String token = res.getMessage();
ProsperObjectResult por = m_APISoap.query(token, "listing", getFieldsString("listing",true), "status=2 and (creditgrade=7 or creditgrade=6 or creditgrade=5 or creditgrade=4)");
ProsperObject[] pos = por.getProsperObjects();
TreeMap<Calendar,Listing> timeLeftListings = new TreeMap<Calendar,Listing>();
for (int i=0; i<pos.length; i++)
{
Listing l = (Listing)pos[i];
Calendar end = (Calendar)l.getStartDate().clone();
end.add(Calendar.HOUR, (l.getDuration()*24));
long millisToGo = end.getTimeInMillis() - System.currentTimeMillis();
if (l.getNowDelinquent()==0 //my required extended credit and ROI
&& (millisToGo/1000/60/60)<=m_HoursToGo
&& l.getInquiriesLast6Months()<2
&& l.getPublicRecordsLast10Years()==0
&& l.getDelinquenciesLast7Years()==0
&& l.getBankcardUtilization().doubleValue()<=.8
&& l.getBankcardUtilization().doubleValue()>=.03
&& ((l.getBidMaximumRate().doubleValue()+l.getROINetDefaultRate().doubleValue()+l.getROIInterestAndFeesRate().doubleValue()+l.getROIServicingFeeRate().doubleValue())>=m_MinROI)
)
{
timeLeftListings.put(end, l);
}
}
boolean pause = false;
for (Iterator<listing> i = timeLeftListings.values().iterator(); i.hasNext(); )
{
if (pause) // you have to pause to avoid bid throttling
{try {Thread.sleep(6000);}catch (Exception ignore){}}
Listing l = i.next();
Timestamp startts = new Timestamp(l.getStartDate().getTimeInMillis());
Calendar end = (Calendar)l.getStartDate().clone();
end.add(Calendar.HOUR, (l.getDuration()*24));
Timestamp endts = new Timestamp(end.getTimeInMillis());
long hoursToGo = (end.getTimeInMillis() - System.currentTimeMillis())/1000/60/60;
System.err.println("\n"+startts+" + "+l.getDuration()+" days = "+endts+" | Hours To Go: "+hoursToGo);
System.err.println("Bid on Listing: "+l.getListingNumber()+"\nAt Rate: "+(m_MinROI-l.getROINetDefaultRate().doubleValue()-l.getROIInterestAndFeesRate().doubleValue()-l.getROIServicingFeeRate().doubleValue()));
res = m_APISoap.bid(token, l.getListingNumber(), new BigDecimal(50,new MathContext(4)), new BigDecimal(m_MinROI-l.getROINetDefaultRate().doubleValue()-l.getROIInterestAndFeesRate().doubleValue()-l.getROIServicingFeeRate().doubleValue(),new MathContext(4)), m_PlaceBids);
pause = true;
System.err.println("Bid Message: "+res.getMessage());
}
m_APISoap.logout(token);
}
private String getFieldsString(String type, boolean authenticated) throws RemoteException
{
DefinitionResult res = m_APISoap.describe(null, type);
Field[] fields = res.getDefinition().getFields();
int count = 0;
String s="";
for (int i=0; i<fields.length; i++)
{
if (authenticated || !fields[i].isAuthenticated())
{
if (count!=0)
{
s+= ",";
}
s+= fields[i].getName();
count++;
}
}
return s;
}
}
|
Need a loan before payday? Trying hard to settle debt? Get back on track, learn all about consolidating your debt and find out where to get credit cards for bad credit. |



