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

# Track & Debug Requests

<Check>
  We’ve introduced [UI Logs](https://app.gelato.cloud/logs) for Gelato Bundler endpoints!

  * You can now track all your requests directly in the dashboard, and easily **debug failed requests** using built-in Tenderly simulations.
  * Additionally, you can get info such as **response time, request body, response body**, and more.
</Check>

## Debugging Failed Requests Using UI Logs

You can use the **UI logs** to debug failed requests directly from the Gelato app. These logs are available in the [Paymaster & Bundler](https://app.gelato.cloud/logs) section of the dashboard.

<img src="https://mintcdn.com/gelato-6540eeb1/KIoTpU4fU3AjZhSk/images/paymaster-bundler-logs.png?fit=max&auto=format&n=KIoTpU4fU3AjZhSk&q=85&s=527fe4227576476f1e0adfe20c0f1f2d" alt="Paymaster & Bundler Logs" width="2994" height="1636" data-path="images/paymaster-bundler-logs.png" />

### Steps to Debug

1. Go to the **logs** section and locate your failed relay request.
2. On the right side of the log entry, click the **Debug** button.
3. A new option, **View Debug**, will appear. Click it.
4. This will open a **Tenderly simulation**, which you can use to analyze and debug the failed request.

## Using Status Endpoint

If you call the `relayer_sendTransaction` or `relayer_sendTransactionSync` API endpoints, the returned `id` can also be used to track the status of the transaction through Gelato's infrastructure like this:

```bash theme={null}
curl --request POST \
  --url https://api.gelato.cloud/rpc \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_API_KEY' \
  --data '{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "relayer_getStatus",
  "params": {
    "id": "0x0e670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
    "logs": false
  }
}'
```

### Response

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "id": "0x0e670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331",
    "status": 200,
    "message": "Transaction included",
    "receipt": {
      "transactionHash": "0x...",
      "blockNumber": 12345678,
      "gasUsed": "21000"
    }
  }
}
```

## Status Codes

The `relayer_getStatus` endpoint returns numeric status codes:

| Code  | Status    | Description                                                             |
| ----- | --------- | ----------------------------------------------------------------------- |
| `100` | Pending   | Transaction is queued and waiting to be processed                       |
| `110` | Submitted | Transaction has been submitted to the network                           |
| `200` | Included  | Transaction was successfully included in a block                        |
| `400` | Rejected  | Transaction was rejected (invalid parameters, insufficient funds, etc.) |
| `500` | Reverted  | Transaction was included but execution reverted                         |

### Using Status Codes in Code

When using the SDK, `sendTransactionSync` returns the receipt directly and throws on failure:

```typescript theme={null}
const receipt = await relayer.sendTransactionSync({ ... });
console.log(`Success! Hash: ${receipt.transactionHash}`);
```

When using the API directly, check against the numeric values:

```typescript theme={null}
const data = await response.json();
const status = data.result.status;

// Terminal states
if (status === 200) {
  console.log('Transaction included');
} else if (status === 400) {
  console.log('Transaction rejected');
} else if (status === 500) {
  console.log('Transaction reverted');
}
// Non-terminal states (keep polling)
else if (status === 100 || status === 110) {
  console.log('Transaction pending...');
}
```
