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

# Express.js

> Integrate with Express.js middleware to send analytics data to Hall

Use Express.js middleware to forward data to the [Log visit](api-reference/visit) endpoint.

In Express.js, middleware functions are functions that have access to the request object, response object, and the next middleware function in the application's request-response cycle. Read the [official documentation](https://expressjs.com/en/guide/using-middleware.html) for more details.

## Setup

1. Set up the `HALL_API_KEY` environment variable with your [Hall API key](/authorization).
2. Add the analytics middleware to your Express.js application before your route handlers.

## Example

The example below demonstrates how to forward data from Express.js request objects.

```js middleware.js theme={null}
const express = require('express')
const app = express()

function analyticsMiddleware(req, res, next) {
  const requestPath = req.originalUrl || req.url
  const requestMethod = req.method
  const requestIp = 
    req.headers['x-forwarded-for']?.split(',')[0] ||
    req.headers['x-real-ip'] ||
    req.ip ||
    req.connection?.remoteAddress ||
    '127.0.0.1'

  const requestHeaders = {
    'User-Agent': req.headers['user-agent'],
    'Host': req.headers['host'],
    'Referer': req.headers['referer'],
  }

  fetch('https://analytics.usehall.com/visit', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${process.env.HALL_API_KEY}`,
    },
    body: JSON.stringify({
      request_path: requestPath,
      request_method: requestMethod,
      request_ip: requestIp,
      request_headers: requestHeaders,
      request_timestamp: Date.now()
    }),
  })

  next()
}

app.use(analyticsMiddleware)
```
