If a Gravity Forms REST integration returns valid JSON but imports fewer entries than expected, compare the returned entries with total_count and inspect pagination. A successful first request is not a complete export. Replaying the same page or broadening permissions can create duplicates without retrieving the missing records.
Separate permission failure from incomplete retrieval
Record the endpoint, form scope, search filters, sort order and paging arguments. Check the response status and JSON shape. For authentication errors or a WAF challenge, use the REST integration access guide. An HTML challenge with a misleading status is not an empty entry list.
The Gravity Forms REST v2 entry reference documents entries, total_count, page_size, current_page and offset. When current_page is supplied, offset is not used. Choose one paging strategy deliberately instead of updating both and assuming both take effect.
Prove the second page is different
On a staging form with synthetic entries, request small pages and keep only the IDs needed for reconciliation. For example, use a page size of two with a known five-entry dataset. Expected page lengths are two, two and one, with five unique entry IDs across the run.
| Page |
Example entry IDs |
Check |
| 1 |
101, 102 |
First pair |
| 2 |
103, 104 |
Different IDs |
| 3 |
105 |
Final short page |
These IDs are illustrative, not a live API result. If page two repeats 101 and 102, inspect how the client serializes paging parameters and whether a proxy caches responses without considering the query. Do not increase page size indefinitely to hide a broken loop.
Scope: Same form and status filters. Order: Deterministic unique sorting. Progress: Second page differs from first. Finish: Unique count reconciles. Explanatory checklist, not a customer test result.
Keep the dataset and sort stable
Use a deterministic sort, preferably a unique entry ID ordering, and retain the same form and status filters across pages. The API's default entry status is active; a count that includes spam or trash is not directly comparable with an active-only export.
A live form can change during traversal. New entries, deletions or status transitions can shift offset-based pages. For a reconciliation job, define a supported fixed scope where possible, deduplicate by entry ID and run a second reconciliation pass for changes. Do not claim offset pagination is a transactional snapshot.
If total_count changes between requests, record the change and investigate it rather than silently stopping at the original number. A zero-length page before the expected total is reached should be an explicit incomplete-run condition, not a successful completion message.
Resume without replaying side effects
Checkpoint the last completed page or cursor state only after its records are durably processed. Make destination writes idempotent using the source site, form and entry identity. Reading an entry should not resend notifications or replay a payment workflow.
Compare the final unique count, missing IDs and duplicate IDs with the defined source scope. For survey-specific discrepancies, also check export field and value mapping. Keep raw submissions and API credentials private; count evidence is usually enough for an operational report.
HandL WP can audit the export loop and destination matching with a synthetic fixture. The acceptance test is a reconciled dataset, not merely an HTTP 200 or an import job marked green.
References reviewed October 10, 2026. Examples are explanatory, not customer test results.