Message retention
Turbo Notify takes your messages to WhatsApp and brings the replies back. It does not need to keep what was said, so it keeps the content only for a short time: 1 hour by default, or the longer period you choose within your plan. The message itself (status, dates and times, participants, receipts, reactions) is kept much longer, 12 months, without the content: only content expires.
The two periods
- Content (per plan, in hours): the text, the caption, the media reference, the audio transcription and the
preview. Until the period ends, you can read all of it through the API. When it ends, Turbo Notify deletes that content from the database within 15 minutes. It is not a read filter: the data no longer exists. - Message record (12 months, the same on every plan): that the message existed, its final status, when it was sent or received and who took part. This period does not change with the plan and cannot be adjusted. A message past the content period stays available and operable through the API, just without the content and with
content_expired: true.
Content period per plan
Every plan starts at 1 hour. On plans that offer more than one option, you choose the period in Billing, in the dashboard (opens in a new tab) .
| Plan | Periods available | Default |
|---|---|---|
| Free | 1 hour | 1 hour |
| Lone Wolf | 1 or 7 hours | 1 hour |
| Business | 1, 7, 24 or 72 hours | 1 hour |
| Custom | 1, 7, 24 or 72 hours | 1 hour |
A longer period gives you more time to read the content again through the API (for example, so a support agent can review a conversation at the end of the day). If you store what you need in your own system as soon as the webhook arrives, 1 hour is enough.
When you change plans
- To a plan with a longer period: your choice stays the same. The new options show up in Billing and you decide whether to use them.
- To a plan with a shorter period: when the change takes effect, retention moves to the longest period the new plan offers without going past your choice. For example: 72 or 24 hours on Business become 7 hours on Lone Wolf; 7 hours on Lone Wolf become 1 hour on Free. Content beyond the new period is deleted on the next run.
- A change scheduled for the end of the cycle only changes retention on the day it takes effect. Until then, the period you chose still applies.
One period for lookup, listing, webhooks and polling
The content period applies, with the same number, to every path you use to get the content back:
GET /v1/numbers/{ref}/messages/{id}returns the full message within the period. After it, it returns the same message withcontent_expired: true, an emptypreviewandtext, and media and structured blocks as{"kind": "unavailable", "reason": "expired"}(see Expired content).GET /v1/numbers/{ref}/messageskeeps listing the message, withcontent_expired: trueand an emptypreview. The sender and the group stay on the message, and it keeps showing up under thegroup_idandcontact_idfilters.GET /v1/eventskeeps returning the events (the event store keeps them 90 days), with the content ofmessage.*events (preview, transcription) already deleted.- The stored copy of a webhook delivery that already completed (delivered, or out of retries) has its content deleted at the same period.
The only exception is a webhook delivery that has not completed yet: if your endpoint has not answered successfully, Turbo Notify keeps the content of that delivery until it is delivered or the retries end, at most 72 hours. That way a hiccup on your side does not make you receive a notification without its content. Once completed, the delivery follows your plan’s period.
After the period: only content expires
Every route that takes a {message_id} keeps working after the content expires, on both the nested form and the equivalent flat route of the main number:
| Operation | Nested route |
|---|---|
| Get message | GET /v1/numbers/{ref}/messages/{id} |
| Get status | GET /v1/numbers/{ref}/messages/{id}/status |
| Receipt history | GET /v1/numbers/{ref}/messages/{id}/receipts |
| List reactions | GET /v1/numbers/{ref}/messages/{id}/reactions |
| List event responses | GET /v1/numbers/{ref}/messages/{id}/responses |
| Reply | POST /v1/numbers/{ref}/messages/{id}/reply |
| Edit | POST /v1/numbers/{ref}/messages/{id}/edit |
| Delete | POST /v1/numbers/{ref}/messages/{id}/delete |
| React | POST /v1/numbers/{ref}/messages/{id}/react |
Editing and deleting for everyone remain subject to the time limits WhatsApp itself accepts for those actions. A text or a caption can only be edited within 15 minutes of sending it: after that the API answers 400 edit_window_expired. In the other cases outside the limits, the request is accepted and the outcome arrives as message.edit.failed or message.delete.failed.
Guest answers to a calendar event follow the reaction period: they are kept for 12 months together with the message. The content of the event itself (name, description, place) follows your plan’s content period.
A reply to a message whose content expired stays threaded in the conversation; the quote bubble goes without the original text. A message answers 404 not_found only when it does not exist, belongs to another organization or belongs to another number.
Technical copies and backups
- Technical processing copies (the internal queues messages go through between the API and WhatsApp) expire within 6 hours.
- Database backups are rotating and kept for 30 days. They are used only for disaster recovery and never to return content to a customer.
Media
Turbo Notify does not keep media files:
- With your own storage set up, the file goes straight to your bucket as soon as the message arrives. Turbo Notify keeps only the reference to that file, and it is deleted together with the rest of the content. The file stays in your bucket, under the lifecycle rules you set: Turbo Notify never deletes anything from it.
- Without your own storage, the file is not kept: it passes through our servers’ memory only to be processed, and is discarded. The media block (
image/video/audio/document/sticker) comes withkind: "unavailable"and asetup_hintthat shows how to set it up.
What about the law?
Brazil’s Marco Civil da Internet requires Turbo Notify to keep its own application access records for 6 months (we keep them for 12). That duty does not cover the content of the messages you exchange, so content is kept only for the period above. WhatsApp and Meta keep their own records under their own rules.
Practical implications
- Set up a webhook and store in your own system what matters to your business (the
message_id, the final status, the text if you will need it later). The API is not an archive of your conversations. - Status, receipts and reactions stay available for 12 months; only the content goes at the period.
- If you manually resend from the dashboard a webhook delivery that already completed, after the period, it goes out with the content deleted, the same as the lookup by id.
- Raising the period or moving to a bigger plan does not bring back content that was already deleted.
- Message and contact quotas per cycle are a separate topic: see Quota and usage.
Checking status
To check the status of a message, see Status. It stays available for 12 months, also after the content expires.