[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"glossary-bulk-api::en":3,"gloss-cluster-bulk-api::en":26,"gloss-next-bulk-api::en":9},{"slug":4,"category":5,"name":6,"definition":7,"meta_desc":8,"faq":9,"schema_markup":9,"related":10},"bulk-api","integration","Bulk API","A bulk API is a separate set of endpoints a provider offers for moving many records at once, distinct from the per-record API that serves ordinary application traffic. It exists because the two workloads have nothing in common: one wants a single record back in milliseconds, the other wants a hundred thousand records moved and does not care when within the hour it finishes. Treating the second as a fast loop over the first is how integrations get rate limited into a standstill during their first backfill.\n\nThree differences matter more than the rest. A bulk API is usually asynchronous — you submit a job, receive an identifier, poll for its state and then download a result rather than reading a response, which means your code needs somewhere to keep a job that outlives the request that created it. It is metered differently, typically against an allowance of jobs or rows rather than the per-request limit, so the budget you reasoned about for the ordinary API is the wrong budget here. And errors come back per record: a job can report success while a fraction of its rows were rejected for validation, which is the single most common way a bulk import turns into a data problem months later. A caller that checks only the job status has recorded a clean import over a partial one.\n\nThe smaller differences catch people too. Field coverage is often narrower than the record API, so an object you can create normally may not be creatable in bulk, or not with every attribute. Validation is sometimes looser, which means bulk is a path by which records that the interactive API would have rejected end up in the system. Ordering within a job is not guaranteed, so a batch containing both a create and a later update to the same record is not safe to assume will apply in that sequence.\n\nPractical habits: always read the per-record result and reconcile the counts, never the job status alone; give each job an idempotency key or a client-side batch identifier so a resubmission after a timeout does not write everything twice; size batches to the provider's stated maximum rather than to whatever fits in memory; and run the first real batch small enough that the rejections are readable by a person.","A bulk API moves many records in one asynchronous job — metered separately, and able to report success while a fraction of rows were rejected.",null,[11,14,17,20,23],{"slug":12,"name":13},"backfill","Backfill",{"slug":15,"name":16},"concurrency-limit","Concurrency Limit",{"slug":18,"name":19},"cursor-pagination","Cursor Pagination",{"slug":21,"name":22},"idempotency-key","Idempotency Key",{"slug":24,"name":25},"rate-limit","Rate Limit",[27,31,34,38,39,42,45,48,51,54,57,60],{"slug":28,"category":5,"name":29,"updated_at":30},"api-deprecation","API Deprecation","2026-09-08T21:32:37+00:00",{"slug":32,"category":5,"name":33,"updated_at":30},"app-review","App Review",{"slug":35,"category":5,"name":36,"updated_at":37},"backend-for-frontend","Backend for Frontend (BFF)","2026-09-08T21:32:36+00:00",{"slug":15,"category":5,"name":16,"updated_at":37},{"slug":40,"category":5,"name":41,"updated_at":30},"connector-versioning","Connector Versioning",{"slug":43,"category":5,"name":44,"updated_at":30},"delete-propagation","Delete Propagation",{"slug":46,"category":5,"name":47,"updated_at":30},"effective-permissions","Effective Permissions",{"slug":49,"category":5,"name":50,"updated_at":37},"event-ordering","Event Ordering",{"slug":52,"category":5,"name":53,"updated_at":37},"field-mapping","Field Mapping",{"slug":55,"category":5,"name":56,"updated_at":37},"function-schema","Function Schema",{"slug":58,"category":5,"name":59,"updated_at":37},"grpc","gRPC",{"slug":61,"category":5,"name":62,"updated_at":37},"integration-marketplace","Integration Marketplace"]