Skip to main content

No Storage | Developer Documentation

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/<API_VERSION>/<BUSINESS_PHONE_NUMBER_ID>/settings' \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer <ACCESS_TOKEN>' \
      -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/<API_VERSION>/<BUSINESS_PHONE_NUMBER_ID>/settings' \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer <ACCESS_TOKEN>' \
      -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/<API_VERSION>/<BUSINESS_PHONE_NUMBER_ID>/deregister' \
        -H 'Authorization: Bearer <ACCESS_TOKEN>'

        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/<API_VERSION>/<BUSINESS_PHONE_NUMBER_ID>/media' \
        -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer <ACCESS_TOKEN>' \
        -d '
        {
          "messaging_product": "whatsapp",
          "file": "file=<FILE_NAME>;type=<FILE_MIME_TYPE>",
          "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"
                        }
                      }]
                  }
                }]
              }]
            }