So my batch will collect 843 records, for each batch, which is 200 records, i constructed a json and made the callout, so in total, it is 5 batches and 5 callouts. I have a server hosting my rest service, on the server side, I saw the response looks fine. But on the salesforce side, I only received response from last callout, which is the 43 records one. Any idea why ? here is the batch: global class BatchCheckActiveProducing implements Database.Batchable<sObject>, Schedulable, Database.AllowsCallouts{ global BatchCheckActiveProducing(){ } global Database.QueryLocator start(Database.BatchableContext bc){ String queryProjects = 'Select Id, Locus_ComponentId__c, Date_System_Actively_Producing__c from dsProject__c where ' + 'Locus_ComponentId__c != null and Date_System_Actively_Producing__c = null'; return Database.getQueryLocator(queryProjects); } global void execute(SchedulableContext sc){ BatchRefreshLocusComponentId batch = new BatchRefreshLocusComponentId(); Id batchProcessId = Database.executeBatch(batch); } global void execute(Database.BatchableContext bc, List<dsProject__c> records){ try{ List<Id> projectList = new List<Id>(); for (dsProject__c p : records){ projectList.add(p.Id); } LocusHelper.checkActiveProducing(projectList); } catch(Exception e){ } } global void finish(Database.BatchableContext bc){ //Datetime sysTime = System.now(); //sysTime = sysTime.addDays(1); //String chronExp = '' + sysTime.second() + ' ' + sysTime.minute() + ' ' + sysTime.hour() + ' ' + sysTime.day() + ' ' + sysTime.month() + ' ? ' + sysTime.year(); //System.schedule('BatchCheckActiveProducing' + sysTime.getTime(), chronExp, new BatchCheckActiveProducing()); } } here is helper method: global static void checkActiveProducing(List<Id> projectIds){ System.DEBUG('incoming ids: ' + projectIds); List<dsProject__c> projectList = [Select Id, Locus_ComponentId__c from dsProject__c where Id In :projectIds]; Http h = new Http(); HttpRequest req = new HttpRequest(); req.setMethod('POST'); req.setEndpoint('*************************'); //req.setHeader('Accept', 'application/json'); req.setHeader('Content-Type', 'application/json'); JSONGenerator gen = JSON.createGenerator(true); gen.writeStartObject(); gen.writeFieldName('nodeList'); gen.writeStartArray(); // loop through all project list // add each into the json for (dsProject__c p : projectList){ gen.writeStartObject(); gen.writeStringField('componentId', p.Locus_ComponentId__c); gen.writeStringField('recordId', p.Id); gen.writeEndObject(); } gen.writeEndArray(); gen.writeEndObject(); String bodyString = gen.getAsString(); req.setBody(bodyString); System.DEBUG('req: ' + req.getBody()); HttpResponse res = h.send(req); System.DEBUG('res: ' + res); System.DEBUG('res body: ' + res.getBody()); // set of project ids Set<Id> projectIdSet = new Set<Id>(); // map of <projectId, activeDate> Map<Id, String> projComponentMap = new Map<Id, String>(); // loop through returned json list // update the active date on project if (res.getStatusCode() == 200){ JSONParser parser = JSON.createParser(res.getBody()); // advance after start_array parser.nextToken(); while (parser.nextToken() != JSONToken.END_ARRAY){ System.DEBUG('current token: ' + parser.getCurrentToken() + ' value: ' + parser.getText()); if (parser.getCurrentToken() == JSONToken.FIELD_NAME && parser.getText() == 'recordId'){ System.DEBUG('in if'); parser.nextToken(); String recordId = parser.getText(); System.DEBUG('recordId: ' + recordId); parser.nextToken(); parser.nextToken(); String activeDate = parser.getText(); System.DEBUG('activeDate: ' + activeDate); projectIdSet.add(recordId); projComponentMap.put(recordId, activeDate); } } System.DEBUG('projectId set: ' + projectIdSet); System.DEBUG('project component map: ' + projComponentMap); List<dsProject__c> updatingProjList = new List<dsProject__c>(); for (dsProject__c p : [Select Id, Date_System_Actively_Producing__c from dsProject__c where Id In :projectIdSet]){ p.Date_System_Actively_Producing__c = Date.valueOf( projComponentMap.get(p.Id) ); updatingProjList.add(p); } try{ update updatingProjList; } catch(DmlException e){ } } }