I am attempting to use batch to handle a deserialized JSON response of 12,000 records to upsert objects. I currently have a class that makes the webservice callout, deserializes the response, and sets the value of my new custom object list to the response values. I am trying to use batch due to the 10000 DML limit. How do I pass my list of custom objects from currentCalloutClass into the batch class to handle the upsert? Is there a better a way to do this? Note: The pasted code will results in: > Illegal conversion from List<Custom_Object__c> to > Database.QueryLocator error Which makes sense, but since I already have the list of objects I need to update I do not need to run a query. Should I be converting my currentCalloutClass into a batchable class? Do I have to set a query? **currentCalloutClass:** public class currentCalloutClass { public void currentCalloutClass(){ jsonStr = ''; List <Custom_Object__c> cObjList = new list <Custom_Object__c()>; ...webservice response stored in jsonStr... JSON2ApexConverter calloutGet = (JSON2ApexConverter )JSON.deserialize(jsonStr, JSON2ApexInfo.class); for(i = 0; i < calloutGet.object.size(); i++) { Custom_Object__c cObj = new Custom_Object__c; cObj.custom_field__c = calloutGet.object.field_1; cObjList.add(cObj); } } Database.executeBatch(new batchTestNew(cObjList), 250); } **batchTestNew** global class batchTestNew implements Database.Batchable<sObject>{ public List <Contact> accountsToParseSet = new List<Custom_Object__c>(); global batchTestNew(List<Custom_Object__c> accountsToParseGet){ accountsToParseSet = accountsToParseGet; } global Database.QueryLocator start(Database.BatchableContext BC){ return accountsToParseSet; } global void execute(Database.BatchableContext BC, List<sObject> scope){ for(sObject s : scope){ upsert accountsToParseGet; } update scope; } global void finish(Database.BatchableContext BC){ } }