Skip to main content

No Storage

Updated: Dec 1, 2025 “No Storage” is a custom configuration of Cloud API local storage, where the data in-transit is kept for up to an hour in Meta data centers and the data is not persisted at rest (that is to say, not in Meta data centers nor in AWS In-Country stores). Outgoing/incoming messages are stored for a maximum of 1 hour in Meta data centers. Outgoing/incoming media blobs are stored for a maximum of 1 hour in Meta data centers. You can pass a custom time-to-live (TTL) — from 1 hour to 30 days — when uploading media to override the 1 hour expiration (particularly useful for marketing campaigns which reuse the same media)

Limitations

When the No Storage feature is enabled, message content is not stored at rest for 30 days as is typical with Cloud API. This introduces the following limitations, which can put a small fraction of your total messaging volume at risk of non-delivery. Message decryption failures — If a message fails to decrypt on the consumer side, Cloud API can only retry sending the message within a 1-hour TTL window. After this 1-hour window, Cloud API cannot retry the message. You will receive an error webhook indicating the failure. See: Retry Receipt Failures. Webhook delivery failures — Normally, Cloud API retries undelivered webhooks (such as incoming messages or receipts) for up to 7 days. With No Storage enabled, webhook retries are limited to 1 hour. If your webhook server is unavailable beyond this window, the webhook (including incoming messages, receipts, etc.) will be permanently lost. See: Failure to Deliver Webhooks. Incoming media messages — Media attached to incoming messages will be available for download for up to 1 hour. After 1 hour, the media is permanently deleted and cannot be retrieved.

Enable No Storage

Request syntax (v21.0 or newer)

Enabling the feature is done before registration by calling the POST /<BUSINESS_PHONE_NUMBER_ID>/settings endpoint.
curl 'https://graph.facebook.com/&lt;API_VERSION&gt;/&lt;BUSINESS_PHONE_NUMBER_ID&gt;/settings' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer &lt;ACCESS_TOKEN&gt;' \
-d '
\{
  "storage_configuration": {
    "status": "NO_STORAGE_ENABLED",
    "retention_minutes": 60
  }
}'
Currently, only the 60 value is allowed for the retention_minutes parameter, as it is the only retention duration we are supporting.

Request syntax (v20.0 or older)

Enabling the feature is done within the POST /<BUSINESS_PHONE_NUMBER_ID>/register registration request.
curl 'https://graph.facebook.com/&lt;API_VERSION&gt;/&lt;BUSINESS_PHONE_NUMBER_ID&gt;/settings' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer &lt;ACCESS_TOKEN&gt;' \
-d '
\{
  "messaging_product": "whatsapp",
  "pin": "123456",
  "tier": "test",
  "meta_store_retention_minutes": 60
}'
Currently only the 60 value is allowed for the meta_store_retention_minutes parameter as it is the only retention duration we are supporting. meta_store_retention_minutes cannot be used alongside with data_localization_region.

Disable No Storage

To disable No Storage, you must de-register the bsuiness phone number using the POST /<WHATSAPP_BUSINESS_PHONE_NUMBER_ID>/deregister endpoint, then register the number again without the meta_store_retention_minutes parameter.

Example deregister syntax

curl -X POST 'https://graph.facebook.com/&lt;API_VERSION&gt;/&lt;BUSINESS_PHONE_NUMBER_ID&gt;/deregister' \
-H 'Authorization: Bearer &lt;ACCESS_TOKEN&gt;'

Override outgoing media TTL

The default 1-hour TTL for No Storage-enabled business phone numbers also applies to media uploaded on the number. If you want to override the default 1-hour TTL, you can include the new ttl_minutes parameter when uploading media.

Example syntax

curl 'https://graph.facebook.com/&lt;API_VERSION&gt;/&lt;BUSINESS_PHONE_NUMBER_ID&gt;/media' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer &lt;ACCESS_TOKEN&gt;' \
-d '
\{
  "messaging_product": "whatsapp",
  "file": "file=&lt;FILE_NAME&gt;;type=&lt;FILE_MIME_TYPE&gt;",
  "ttl_minutes": "120"
}'
ttl_minutes range is from 1 hour (60) to 30 days (43200). The API currently does not return the expiration date of the media in the response API.

Error webhooks

Retry receipt failures

In the case of WhatsApp client decryption failures, we will stop attempting to deliver an undelivared message from a No Storage-enabled number once the TTL is reached. In these cases, a status messages webhook is triggered with error code 131036:

Example payload

\{
  "object": "whatsapp_business_account",
  "entry": [{\
    "id": "102290129340398",\
    "changes": [{\
      "field": "messages",\
      "value": {\
        "messaging_product": "whatsapp",\
        "metadata": {\
          "display_phone_number": "15550783881",\
          "phone_number_id": "106540352242922"\
        },\
        "statuses": [{\
          "id": "wamid.HBgMNDQ3ODI1MDYzOTQxFQIAERgSN0MzMTg0Nzk2RkMwOEQ5NTQ2AA==",\
          "status": "failed",\
          "timestamp": "1712597457",\
          "recipient_id": "16505551234",\
          "errors": [{\
              "code": 131036,\
              "title": "Message failed to be delivered on at least one of the user's device",\
              "message": "Message failed to be delivered on at least one of the user's device",\
              "error_data": {\
                "details": "Message payload not found"\
              }\
            }]\
        }]\
      }\
    }]\
  }]
}
Notes: This error is sent only if we fail to honor a retry receipt sent by the primary device. If the retry fails for a secondary device, we ignore it, as the message will be delivered when syncing with the primary device. It is possible that the message has been successfully delivered to secondary devices but not the primary device. In this case, the webhook will be sent.

Failure to deliver webhooks

By default, Cloud API retries for up to 7 days to deliver incoming messages webhooks. For No Storage-enabled business phone numbers, if we fail to deliver an incoming message webhook, we will drop it and instead send an errors messages webhook with error code 131035:
\{
  "object": "whatsapp_business_account",
  "entry": [{\
    "id": "102290129340398",\
    "changes": [{\
      "field": "messages",\
      "value": {\
        "messaging_product": "whatsapp",\
        "metadata": {\
          "display_phone_number": "15550783881",\
          "phone_number_id": "106540352242922"\
        },\
        "errors": [{\
            "code": 131035,\
            "title": "Webhook could not be delivered within data retention limit",\
            "message": "Webhook could not be delivered within data retention limit",\
            "error_data": {\
              "details": "Webhook could not be delivered within data retention limit"\
            }\
          }]\
      }\
    }]\
  }]
}
Did you find this page helpful? Thumbs up icon Thumbs down icon ON THIS PAGE Limitations Enable No Storage Request syntax (v21.0 or newer) Request syntax (v20.0 or older) Disable No Storage Example deregister syntax Override outgoing media TTL Example syntax Error webhooks Retry receipt failures Example payload Failure to deliver webhooks