The 24-hour window
This is the rule that shapes every integration, and it is Meta’s, not ours.
- Outside 24 hours of the customer’s last message to you, the only thing that will be delivered is an approved template.
- Inside that window, free text and media work too.
A free-text or media send with no open window is refused with 409 WINDOW_CLOSED before
anything reaches Meta — you are not charged and nothing is queued.
Open the conversation with a template; once the customer replies, you have 24 hours of free-form messaging.
Asking rather than deriving
Section titled “Asking rather than deriving”GET /conversations answers the question directly, per thread, as windowOpen — so you do
not have to re-derive the rule from timestamps.
curl "https://vaarto.com/api/v1/conversations?perPage=20" \ -H "Authorization: Bearer $VAARTO_API_KEY"const res = await fetch("https://vaarto.com/api/v1/conversations?perPage=20", { headers: { Authorization: `Bearer ${process.env.VAARTO_API_KEY}` },});
const { data } = await res.json();import os, requests
res = requests.get( "https://vaarto.com/api/v1/conversations?perPage=20", headers={"Authorization": f"Bearer {os.environ['VAARTO_API_KEY']}"}, timeout=10,)
data = res.json()["data"]$data = Http::withToken(env('VAARTO_API_KEY')) ->get('https://vaarto.com/api/v1/conversations', [ 'perPage' => 20, ]) ->json('data');Each thread carries lastInboundAt, lastOutboundAt and windowOpen. Branch on
windowOpen, not on your own clock arithmetic — the window is Meta’s to define and it has
moved before.