> ## Documentation Index
> Fetch the complete documentation index at: https://docs.moralis.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Streaming Data Feeds: Kafka, RabbitMQ, and SQS

> Consume Data Feeds through supported streaming interfaces using Kafka-compatible, RabbitMQ/AMQP, or SQS-compatible clients. Bring your existing consumers instead of building new ingestion.

export const RequestAccessButton = ({href = "https://admin.moralis.com/data-feeds", title = "Request an early-access account"}) => {
  return <a href={href} className="request-access-button" style={{
    display: "inline-flex",
    alignItems: "center",
    gap: "8px",
    padding: "12px 24px",
    borderRadius: "8px",
    background: "linear-gradient(135deg, #0f7fff 0%, #0a5fd9 100%)",
    color: "#fff",
    fontSize: "15px",
    fontWeight: 600,
    textDecoration: "none",
    border: "none",
    boxShadow: "0 2px 8px rgba(15, 127, 255, 0.35)",
    transition: "box-shadow 0.15s ease, transform 0.15s ease",
    width: "fit-content"
  }}>
      <style dangerouslySetInnerHTML={{
    __html: `
            .request-access-button,
            .request-access-button:hover {
              color: #fff !important;
              text-decoration: none !important;
            }
            .request-access-button:hover {
              box-shadow: 0 4px 14px rgba(15, 127, 255, 0.5);
              transform: translateY(-1px);
            }
          `
  }} />
      <span>{title}</span>
      <span aria-hidden="true">{"→"}</span>
    </a>;
};

If your infrastructure already moves events through Kafka, RabbitMQ, or SQS, you don't need to build a new
ingestion path for onchain data. Data Feeds supports **familiar streaming interfaces**, so you can consume
feeds with the client libraries your team already runs:

* **Kafka-compatible**: consume feeds using Kafka client libraries.
* **RabbitMQ / AMQP**: consume feeds using standard AMQP clients.
* **SQS-compatible**: poll feeds through an SQS-style HTTP API.

Which interfaces are available can depend on the feed and current availability, confirm the protocols you
plan to use when you onboard.

## What you receive

Each message carries **block-level decoded data**: the block's token transfers, swaps, price updates,
balances, NFT activity, approvals, and the raw block/transaction/log data, laid out as typed arrays. You
consume decoded records, not raw RPC payloads. See
[The `block` array](../concepts/the-block-array) for the exact layout.

## Reorg handling

Streaming consumers see blocks as they land. Each block records its **position and parent**, so when the
chain reorganizes, your consumer (or a downstream process) can detect the rollback and correct affected
records. This differs from the [database sinks](../concepts/destinations), where recipes apply reorg
corrections for you. See [Reorgs](../concepts/reorgs) for how rollbacks are signaled.

## Streaming vs. the sink

| Choose…           | When…                                                                                                              |
| ----------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Streaming**     | You already run an event pipeline, want fan-out to multiple consumers, or apply your own processing before storage |
| **Database sink** | You want ready-to-query tables with decoding, enrichment, and reorg correction handled for you                     |

You can also combine them: land ready-to-query tables with the sink while streaming the same feed into an
existing pipeline. It's the same data lake underneath, see the
[access methods overview](./overview).

## Get connected

Connection details, authentication, and per-feed protocol availability are provided during early-access
onboarding.

<RequestAccessButton />
