You might not have access to this feature!

This feature is only available on our premium and enterprise plans. [Talk to our team](mailto:premium@customer.io) about upgrading your plan.

# API Call Calculator

[PremiumThis feature is available for Premium plans.](/accounts-and-workspaces/plan-features/) [EnterpriseThis feature is available for Enterprise plans.](/accounts-and-workspaces/plan-features/)

Estimate the number of API calls that your Salesforce integration will make for its initial and incremental syncs. This can help you figure out if your Salesforce integration will exceed your Salesforce plan limits.

Number of records for initial sync:  Number of new/updated records per sync:  Sync interval:

 MinutesHoursDaysWeeks

Use Bulk API: 

Bulk API

REST API We require one REST call at the start of each sync, to fetch the record's fields configuration.

Number of API calls for initial sync For the initial sync, we fetch all data going back to the epoch (Jan 1st 1970). We break that data down into 30-day increments, and that's how we get to such a specific (and static) number here.

Number of API calls for each incremental sync

Number of API calls per day

Number of API calls per week

Number of API calls per month

1Value used for Bulk API max requests per 24-hour period:

2Value used for Bulk API max records per request:

3Value used for REST API max requests per 24-hour period:

4Value used for REST API max records per request:

This calculator is for estimation purposes only. **It cannot provide an exact count of API calls consumed by your integration.** Your Salesforce API limits will vary depending on your Salesforce plan. See Salesforce’s documentation to learn more about [Bulk API](https://developer.salesforce.com/docs/atlas.en-us.254.0.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_bulkapi.htm) and [REST API](https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_api.htm) limits.

Our Salesforce integration attempts to use Salesforce’s bulk APIs whenever possible, which can handle up to 10000 records per request, depending on your plan. We fall back to the REST API, where each call can retrieve 2000 records per request, when we cannot use the Bulk API. We cannot use the Bulk API when:

1.  your records contain fields with *base64*\- or *object*\-formatted values due to limitations with Salesforce’s output format.
2.  the record type does not support Bulk APIs (ex: KnowledgeArticle, CaseStatus).

This calculator is based on a normal integration scenario and cannot account for all possible integration scenarios. For example, if we receive a temporary error from the Salesforce API we’ll retry operations up to 3 times, which increases your API usage.

$(document).ready(function(){const a=30\*24\*60\*60\*1e3,e=15e3,o=1e5,n=1e4,s=2e3;function t(e,t){let n;switch(t){case"minutes":n=e\*60\*1e3;break;case"hours":n=e\*60\*60\*1e3;break;case"days":n=e\*24\*60\*60\*1e3;break;case"weeks":n=e\*7\*24\*60\*60\*1e3;break}return new Date(Date.now()-n)}function i(){const C=parseInt($("#initial-sync-records").val()),c=parseInt($("#incremental-sync-records").val()),A=parseInt($("#sync-interval").val()),k=$("#interval-unit").val(),E=$("#use-bulk-api").is(":checked"),p=new Date("1970-01-01T00:00:00Z"),i=t(A,k),x=t(1,"days"),y=t(1,"weeks"),w=t(30,"days"),l=new Date-i.getTime(),v=new Date-x.getTime(),b=new Date-y.getTime(),j=new Date-w.getTime();function r({startDate:t,numRecords:i,numSyncs:r}){if(i<=0||i===1/0||isNaN(t)||t.getTime()>Date.now())return{bulk:"n/a",rest:"n/a"};const u=Date.now()-t.getTime(),d=Math.ceil(u/a);let c=0,l=0;for(let t=0;t<r;t++){if(c+=1,E){if(l+=Math.max(d,Math.ceil(i/n)),l>e){const t=e\*n,o=i-t;l=e,c+=Math.ceil(o/s)}}else c+=Math.max(d,Math.ceil(i/s));c>o&&(l="exceeds limits",c="exceeds limits")}return{bulk:l,rest:c}}const \_=Math.ceil(v/l),g=Math.ceil(b/l),O=Math.ceil(j/l),f=r({startDate:p,numRecords:C,numSyncs:1}),m=r({startDate:i,numRecords:c,numSyncs:1}),h=r({startDate:i,numRecords:c,numSyncs:\_}),u=r({startDate:i,numRecords:c,numSyncs:g}),d=r({startDate:i,numRecords:c,numSyncs:O});$("#initial-sync-bulk").text(f.bulk),$("#initial-sync-rest").text(f.rest),$("#incremental-sync-bulk").text(m.bulk),$("#incremental-sync-rest").text(m.rest),$("#daily-api-calls-bulk").text(h.bulk),$("#daily-api-calls-rest").text(h.rest),$("#weekly-api-calls-bulk").text(u.bulk),$("#weekly-api-calls-rest").text(u.rest),$("#monthly-api-calls-bulk").text(d.bulk),$("#monthly-api-calls-rest").text(d.rest)}$("#bulk-api-limits").text(e),$("#rest-api-limits").text(o),$("#bulk-api-max-records").text(n),$("#rest-api-max-records").text(s),$("#initial-sync-records, #incremental-sync-records, #sync-interval, #interval-unit, #use-bulk-api").on("input change",i),i()}).api-simulator{display:flex;justify-content:space-between;align-items:flex-start}.api-simulator table{margin-top:0}.form-container{flex:1;margin-right:20px;padding:20px;border:1px solid #ccc;border-radius:5px;background-color:#f9f9f9;min-width:300px}.api-simulator label{display:block;margin-bottom:5px}.api-simulator input,select{width:100%;padding:8px;margin-bottom:10px;border:1px solid #ccc;border-radius:3px}.sync-interval-container{display:flex;gap:10px}.sync-interval-container input{flex:1}.sync-interval-container select{flex:1}.checkbox-container{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:34px}.checkbox-container label{margin-bottom:10px}.checkbox-container input{max-width:15px}@media(max-width:1200px){.api-simulator{flex-direction:column}.form-container{margin-right:0;margin-bottom:20px;width:100%}.results-container{width:100%}}