Flutter engineering
A mobile app API integration checklist before development starts
Scope mobile API integration beyond endpoints. Check authentication, errors, retries, uploads, environments and ownership before committing to a development plan.
What you’ll take away
- Define complete customer operations, including their failure and recovery paths.
- Agree authentication, data ownership and retry behaviour with the backend team.
- Require realistic test data and a working sandbox before finalizing estimates.
“The API is ready” is a starting point for a conversation, rather than a complete mobile integration scope. An endpoint may return the expected JSON while leaving important questions unanswered: who can access the record, how a session renews, what happens after a timeout and which team fixes an inconsistent result.
Before estimating Flutter API integration, I recommend walking through one complete customer operation with the backend owner. Use the checklist below to identify the parts that require decisions, demonstrations or additional backend work.
Ask for a contract and a usable environment
Request documentation for the operations the app actually needs, a test environment and representative accounts. An OpenAPI description can document an HTTP API’s operations, data structures and security schemes in a machine-readable format. Its usefulness still depends on whether it accurately describes the running service. OpenAPI specification
The initial integration pack should provide:
- Test and production base URLs, with the intended API version.
- Authentication instructions and accounts for relevant roles.
- Request and response examples, including errors.
- Required fields, optional fields and validation rules.
- Pagination, filtering, sorting and rate-limit behaviour.
- An owner for contract questions and a way to report backend defects.
Test data should include empty accounts, populated accounts, long values, missing optional information and records in each important state. If every demo account has exactly one successful transaction, the environment will hide much of the real integration work.
Define the customer’s operation before counting endpoints
A single app action can depend on several services. “Submit an expense” might require retrieving categories, uploading a receipt, creating a draft, validating a cost centre and requesting approval. The customer experiences one outcome, even when the backend exposes multiple endpoints.
Write an operation in this form: the user, required input, permission, successful result, failure states and recovery path. Then map the endpoints to it. This reveals missing operations such as retrieving the result of a previous submission or cancelling a draft.
It also helps establish ownership. If the app needs information the API does not expose, decide whether the backend changes or the product requirement changes. Avoid leaving the mobile developer to infer business rules from a handful of sample responses.
Check authentication and authorization separately
Authentication establishes identity. Authorization determines what that identity may access or change. A successful login does not demonstrate that account data is properly isolated.
OWASP identifies missing object-level authorization checks as a major API risk. A backend must check access when an operation receives a record identifier; hiding a record in the interface does not enforce that rule. OWASP object-level authorization
Ask how tokens expire and renew, how sessions are revoked and what should happen after a password or account-status change. Specify the expected result when multiple requests encounter expiry together. Also define how the app clears account-specific cached information during sign-out and account switching.
Keep privileged service credentials on the appropriate backend. The mobile application should receive only the access required for its user and operation. Have the responsible engineer review the actual authentication design rather than assuming a particular token format makes it secure.
Agree data meaning, not just field names
The mobile and backend teams need a shared understanding of values. Does a missing address mean “not supplied,” “not permitted” or “not yet loaded”? Is a date a calendar date or an instant in a particular timezone? What currency and precision rules apply to an amount?
My recommended contract review covers identifiers, timestamps, money, enumerated states, nullable fields and server-controlled values. Include what happens when the server introduces an unfamiliar status. A brittle client can fail on a harmless new field or show the wrong action for a new business state.
For lists, test pagination with enough records to cross multiple pages. Agree what happens when records are added or removed while the customer scrolls. For uploads, define limits, accepted types, expiry and cleanup behaviour, alongside the visible progress and retry experience.
Worked example: a booking request times out
Consider a hypothetical booking app. A customer taps Confirm, the backend creates a booking, and the connection fails before the response reaches the phone. The app displays “Something went wrong” and invites the customer to try again.
Without an agreed duplicate-prevention mechanism, the second request may create another booking. Disabling the button while the first request runs helps with rapid taps, but it does not solve a retry after the connection has failed.
A better contract gives the logical operation an identity. The server can recognise a repeat or provide a way to retrieve its outcome. Stripe documents one implementation of this approach using idempotency keys; a custom booking API needs its own agreed behaviour and retention rules. Stripe idempotent requests
An acceptance criterion could be: “Retrying the same interrupted booking returns the existing confirmation or an actionable status without reserving a second slot.” The backend and app should demonstrate that together.
Make errors actionable and observable
Agree a consistent error structure that distinguishes invalid input, missing permission, a conflicting record state, temporary service failure and rate limiting. The customer needs a useful next action; support needs enough information to investigate.
I recommend a request identifier that can connect an app report to backend logs. Decide what can be logged and avoid recording tokens, payment credentials or unnecessary personal data. A detailed diagnostic record and a clear customer message serve different purposes.
For each important operation, ask whether retry is safe, whether it should happen automatically and when it should stop. If the app must queue work without a connection, include the rules from the offline synchronization guide in the contract.
Finish with an integration acceptance checklist
Before calling the feature complete, demonstrate:
- Success with realistic data, including optional fields and large lists.
- Rejected input with field-level guidance where appropriate.
- An expired session during an operation.
- Denied access to another user’s record.
- A timeout after a request may already have succeeded.
- Backend unavailability and recovery.
- An interrupted upload, if the feature uses attachments.
- Compatibility with the client versions still supported in production.
Estimate any missing backend work separately from connecting existing endpoints. That distinction gives you a clearer budget and prevents teams from waiting on dependencies nobody agreed to deliver.
For a Flutter integration discussion, a sample customer journey, API documentation and a test account description are useful starting points. Share credentials only through an agreed secure channel.
Make one operation contract concrete
For the hypothetical booking flow, write a contract that both teams can review before implementation. This is a design worksheet, not a universal API format:
- Intent: reserve one selected slot for the authenticated customer.
- Authority: the server checks availability, customer eligibility and permission.
- Operation identity: the client and server agree how a repeated attempt refers to the same intended booking.
- Confirmation: a stable booking reference and authoritative status, not merely an HTTP request finishing.
- Uncertain response: a supported way to retrieve the result or retry safely.
- Conflict: an unavailable slot produces a recoverable choice, without a false confirmation.
- Expiry: the team defines what happens after a reservation or operation identifier expires.
- Support evidence: an approved diagnostic reference connects the customer report to the operation without exposing private credentials.
Now ask the backend owner to demonstrate that contract using the test environment. The mobile implementation can then be estimated against known behaviour. If a field or recovery operation is missing, the estimate should identify the dependency and its owner.
Plan for versions already installed on customers’ phones
An API release and a mobile release do not reach every customer simultaneously. During a transition, the backend may need to support several app versions. Decide which versions remain supported and how an older client responds when a new business state appears.
For example, adding a “requires review” booking status should not make an older client label the booking confirmed merely because it does not recognise the value. The contract needs a conservative fallback and an update policy. Removing or changing a field requires a migration plan agreed with the teams that consume it.
Include version combinations in verification: current app with current API, candidate app with current API where applicable, and supported older clients with the candidate API. The exact set depends on your release model. Write down which combinations are intentionally unsupported instead of discovering them after deployment.
Use an integration risk register to make estimates actionable
For every unresolved item, record the customer impact, evidence required, owner and decision date. “Payment integration uncertain” is too vague. “Sandbox refunds cannot be tested because the test merchant lacks permission; provider administrator to confirm access before refund scope is approved” identifies an action.
Classify each item as an implementation task, missing access, missing backend capability or product decision. This makes it possible to discuss parallel work without pretending that a mobile developer can resolve every dependency alone.
You can explore lost responses and repeated taps in the interactive reliability example. It uses simulated data to explain the contract; demonstrating the same outcomes against your own services remains part of integration acceptance.
Sources
- OpenAPI Initiative: OpenAPI specification
- OWASP: broken object-level authorization
- Stripe: idempotent requests
The checklist and acceptance criteria are editorial recommendations. The booking example is hypothetical and is not a report of a client implementation.
Explore the work