Offer Polling & Rate Limits
Offer Polling & Rate Limits
Hybrid Experience keeps the borrower in your UI while Aarthik Labs talks to lenders. Because lender responses are asynchronous, your back-end polls the Hybrid offers endpoint until offers, an Account Aggregator action, or a no-offer outcome is ready.
The polling contract is server-owned. Your app should not invent its own timer schedule. Use the polling.nextPoll value returned by the API and handle 429 responses as a normal part of the integration.
Hybrid product paths use the same polling object: shouldPoll, lastPoll, and nextPoll. Personal Loan and Business Loan use the Personal Loan-style lender-grouped offer shape in the API Reference. Gold Loan polling responses omit data.account_aggregator and can include lender branch locations in data.lenders[<lenderName>].branches. Loan Against Mutual Funds uses a LAMF-specific lender-grouped shape for Credit Line and Term Loan offers.
What Your App Controls
Your product controls the borrower-facing wait state and decides how to present offers. Aarthik Labs controls the legal poll cadence, lender timeout windows, Account Aggregator URL readiness, and rate limits.
Your back-end should:
- call the offers endpoint from your server, not from the browser
- return the latest offer state to your front-end
- schedule the next poll from
data.polling.nextPoll - treat
429as “too early, retry at the server-provided time” - open Account Aggregator only when
data.account_aggregator.urlis non-null - stop polling when
data.polling.shouldPollisfalse
Polling Object
When offer polling is active, the response includes a polling object:
Use nextPoll as an absolute timestamp. Do not convert the schedule into a fixed client-side interval. If your app wakes up late, call the endpoint once and use the next polling object returned by the server.
Gold Loan Branches
Gold Loan offer polling returns branch locations received from lender on_select responses. These branches are grouped under the lender alongside the offer rows.
Loan Against Mutual Funds Offer Types
Loan Against Mutual Funds polling supports two offer types: Credit Lines and Term Loans. LAMF lender groups intentionally do not include minimumLoanAmount or maximumLoanAmount.
For both LAMF Credit Line and Term Loan offers, productType is LAMF. facilitytype is CREDIT_LINE or TERM_LOAN depending on the offer. LAMF offer signals are documented as FINAL_OFFER, FULLY_DIGITAL_STP, and VERY_HIGH.
Offer Signals
When lender signal configuration is available, each offer row can include offerSignals. These signals are borrower-facing display hints only. They should be shown as badges or supporting labels, not used to reorder lenders or auto-select an offer.
Polling Phases
Hybrid offer polling has two phases.
Pre-AA And Non-AA Window
This window starts when the Hybrid journey starts offer fetch.
Default accepted poll slots:
If at least one offer is available, your UI can show it immediately. If polling.shouldPoll remains true, you may keep refreshing at nextPoll to pick up additional lender outcomes, but you should not block the borrower from seeing available offers unless your own product policy requires that.
Account Aggregator URL Timing
The Account Aggregator URL is intentionally not returned immediately when offer fetch starts. This section applies when the offers response includes data.account_aggregator. Gold Loan Hybrid does not return Account Aggregator in the current flow.
By default, Aarthik Labs waits until the second pre-window poll slot, +30s, before returning the AA URL. This gives lenders time to share the required consent handles.
When AA is applicable, the response can include:
Use this object as follows:
The account_aggregator object only contains:
urlexpires_atlenders
It does not contain status, available, or poll_after_ms. The polling object is the source of truth for when to poll again.
Post-AA Window
The post-AA window starts after the borrower completes the Account Aggregator flow and returns to the app.
Default accepted poll slots:
After the final post-AA poll, polling.shouldPoll becomes false for that window.
Total Accepted Polls
In the default full AA journey, there can be up to ten accepted polls:
- five pre-AA / non-AA accepted polls
- five post-AA accepted polls
Additional calls before the next legal slot are not accepted. They return 429 and do not count as successful offer reads.
Rate Limits
Polling faster than polling.nextPoll can return:
When you receive 429:
- do not show it to the borrower as a failure
- wait until
X-Aarthik-Next-Poll-Atorerror.details.polling.nextPoll - use
Retry-Afteras a fallback if timestamp scheduling is not available - keep the current borrower wait state or currently visible offers
- retry the same offers endpoint once the server-provided time arrives
Back-End Polling Loop
Use a single scheduled poll per borrower journey. Avoid multiple browser tabs, mobile retries, and background jobs all polling the platform independently.
The important behavior is simple: schedule from the server response, not from a hardcoded interval.
UI Behavior
Your UI can use the offer response to choose the current borrower state.
Configuration
The default schedule can be configured per application by Aarthik Labs.
These fields are application-level platform configuration. Integrating partners should still follow the polling.nextPoll value returned by the API because the effective schedule can differ by application.
Practical Rules
- Poll from your back-end only.
- Use
polling.nextPollfor the next attempt. - Treat
429as a normal timing response, not an integration failure. - Do not use
poll_after_ms; it is not part of the current Hybrid polling contract. - Do not infer AA readiness from lender names alone. Use
account_aggregator.url. - For Gold Loan, do not wait for Account Aggregator. Render offers or waiting states from
status,polling, andlenders. - Do not keep polling after
polling.shouldPollbecomesfalse. - Do not store Account Aggregator URLs as long-term resume links.
- Log
borrowerProviderID, journey ID, status,polling.nextPoll, and whetheraccount_aggregator.urlwas present for support.
Checklist
Before going live, confirm that your integration:
- starts polling only after the journey start call succeeds
- schedules all follow-up polls from
polling.nextPoll - handles
429by waiting and retrying at the returned time - shows available offers while later lender responses may still be pending
- opens AA only when
account_aggregator.urlis present - does not expect
account_aggregatoron Gold Loan - refreshes offers after the borrower returns from AA
- stops automatic polling when
polling.shouldPollisfalse - avoids duplicate poll loops for the same borrower journey