# REST API

### Directory

> You can also experiment with the code in our interactive [Codepen Collection](https://codepen.io/collection/QWYreW?grid_type=list)
>
> We recommend using [JSON Hero](https://jsonhero.io/) to view the sample objects

<table><thead><tr><th width="184">Command</th><th>API Route</th></tr></thead><tbody><tr><td><a href="#authentication">Authentication</a></td><td>Visit on Web - https://app.alerts.boo/settings</td></tr><tr><td><a href="#alert-payload">Alert Payload</a></td><td>Sent to your webhook</td></tr><tr><td><a href="#types-schema">Types Schema</a></td><td>Types reference for objects - Watcher, Log, User</td></tr><tr><td><a href="#get-watcher">Get Watcher</a></td><td>GET /watchers/:watcherID</td></tr><tr><td><a href="#list-watchers">List Watchers</a></td><td>POST /watchers/list</td></tr><tr><td><a href="#create-watcher">Create Watcher</a></td><td>POST /watchers/create</td></tr><tr><td><a href="#update-watcher">Update Watcher</a></td><td>POST /watchers/:watcherID/update</td></tr><tr><td><a href="#list-logs">List Logs</a></td><td>POST /watchers/:watcherID/logs/list</td></tr><tr><td><a href="#get-log">Get Log</a></td><td>GET /logs/:logID</td></tr><tr><td><a href="#my-profile">My Profile</a></td><td>GET /users/:userID</td></tr><tr><td><a href="#rotate-api-key">Rotate API Key</a></td><td>POST /users/:userID/rotate-token</td></tr><tr><td><a href="#buy-credits">Buy Credits</a></td><td>POST /billing/:userID/topup-credits</td></tr></tbody></table>

{% hint style="warning" %}
Get your API Key in the [Settings Page ](https://app.alerts.boo/settings)

Be careful with your API Key! Anyone who has it can control your account. If your API key has been leaked, immediately [rotate it.](#rotate-api-key)
{% endhint %}

### Authentication

{% hint style="info" %}
All commands in the REST API require authentication with an API Key.\
Copy your API Key from the web app settings page. Try the doc examples on your own data.

\
Get your API Key 👉 <https://app.alerts.boo/settings>

\
Be careful with your API Key! Anyone who has it can control your account. If your API key has been leaked, immediately [rotate it.](#rotate-api-key)
{% endhint %}

<details>

<summary>Browser Screenshot (Find your API Key)</summary>

<https://app.alerts.boo/settings>

<img src="https://3474900279-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCpJWKKPaiY4PoqXf4uO6%2Fuploads%2FVr4wt6TzS1Pm9jdV3qv3%2FAlerts_boo.png?alt=media&#x26;token=49690b93-2476-4d47-bf28-98e3e8e81d40" alt="" data-size="original">

</details>

```javascript
// Include your API key in every REST API command
// Put it in the headers { "api-key": "YOUR_API_KEY" } 
const API_KEY = 'YOUR_API_KEY'

fetch('https://api.alerts.boo/v1/ping', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY
  },
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));
```

### Alert Payload

{% hint style="info" %}
This is what gets sent to your webhook. Preview what is looks like so you can add it to your workflow or app.
{% endhint %}

{% tabs %}
{% tab title="Instagram" %}

> [👉 View Sample Object](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/payloadInstagram.json)

```typescript
interface AlertPayload_Instagram {
  id: string // AlertID, for reference only
  logID: string // LogID, to lookup this exact payload
  watcherID: string // WatcherID, to know which watcher it came from
  createdAtUnix: number
  platform: string // "Instagram"
  type: string // "instagram_post" | "instagram_story"
  raw: any // the full original data from source
  url: string // the url to the content. eg instagram post
  data: {
    id: string // AlertID, for reference only
    slug: string // the shortcode or ID assigned by the source, eg. Instagram content ID
    author: string // the username of the account from source. eg. Instagram username
    url: string // the url to the content. eg instagram post
    caption: string // the caption of the post, or main text body
    location: string // any tagged location
    medias: SimpleMedia[] // a list of media content
    timestamp: string // ISO8601 datetime
  }
}
interface SimpleMedia {
  type: string // 'image' | 'video'
  url: string // link to the image or video url
  thumbnail: string // image thumbnail url
}
```

{% endtab %}

{% tab title="Twitter" %}

> Coming soon
> {% endtab %}
> {% endtabs %}

### Types Schema

{% tabs %}
{% tab title="Watcher" %}

> 👉 View Sample Object

```typescript
// Type Definition
interface Watcher {
  id: string // WatcherID
  platform: 'Instagram' // more coming soon
  alias: string // nickname you choose
  slug: string // eg. instagram username "insidehistory"
  url: string // link to the resource. eg. https://instagram.com/insidehistory
  createdAt: string // ISO8601 Date
  filterPrompt: string // Your Ai filter criteria
  status: string // 'Active' | 'Paused' | 'Awaiting' | 'Pending' | 'Insufficient Funds' | 'Problem'
  webhookUrl: string // your webhook to recieve alerts
  note: string // your private internal note
  autoExpireMs: number // pause watcher after inactivity
  expiresAt: string // ISO8601 Date
  userID: string // UserID
  customData?: {
    uid?: string // you can decide this
    data?: string // you can put whatever in here
  }
  lastReceivedAt?: string // ISO8601 Date
}
```

{% endtab %}

{% tab title="Log" %}

> 👉 View Sample Object

```typescript
// Type Definition
interface Log {
  id: string // LogID
  watcherID: string // WatcherID
  userID: string // UserID
  prompt: string // the Ai filter criteria that was used
  passPromptFilter: boolean // did it pass Ai filter criteria
  status: string // 'Finished' | 'Skipped' | 'Pending'
  platform: string // 'Instagram' | 'Twitter'
  type: string // 'instagram_story' | 'instagram_post'
  alias: string // quick title to summarize
  memo: string // text details
  createdAt: string // ISO8601 Date
  url: string // link to the post on Instagram, etc
  fullObjectUrl: string // link to the full Instagram post data
  creditsConsumed: number // cost of log
}
```

{% endtab %}

{% tab title="User" %}

> 👉 View Sample Object

```typescript
// Type Definition
interface User {
  id: string // UserID
  alias: string // nickname
  email: string // email used to register
  apiToken: string // api key, keep this private
  createdAt: string // ISO8601 Date
  walletCreditBalance: number // credits in your wallet
  billingPlanLabel: string // your pricing plan
  paymentCard?: {
    last4: string // last 4 numbers of your credit card on file
  }
}
```

{% endtab %}
{% endtabs %}

### Get Watcher

{% hint style="info" %}
**GET /watchers/:watcherID**\
\
View a Watcher in detail, excluding its logs. If you want logs, use [List Logs.](#list-logs)
{% endhint %}

{% tabs %}
{% tab title="Request" %}

```javascript
// copy paste this to your browser console to run
const API_KEY = 'YOUR_API_KEY'
const WATCHER_ID = 'YOUR_WATCHER_ID'

fetch(`https://api.alerts.boo/v1/watchers/${WATCHER_ID}`, {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY
  },
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));
```

{% endtab %}

{% tab title="Response" %}

> [👉 View Sample Response](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/getWatcher.json)

```typescript
// Type Definition
interface ResponseBody {
  watcher: Watcher // Scroll up for Type Schema
}
```

{% endtab %}

{% tab title="Try It" %}

> Click "Run Pen" and "JS" button for the interactive code \
> Recommended to open in new tab (click Edit on Codepen)

{% embed url="<https://codepen.io/entropyinternet/live/poYmZEa>" %}
{% endtab %}
{% endtabs %}

***

### List Watchers

{% hint style="info" %}
**POST /watchers/list**\
\
List all the watchers owned by you. Filter by attributes and paginate through results. Can also be used to search by exact username.
{% endhint %}

{% tabs %}
{% tab title="Request" %}

```javascript
// copy paste this to your browser console to run
const API_KEY = 'YOUR_API_KEY'
const query = {
  status: "Active",
  platform: "Instagram",
  limit: 5,
  // slug: "instagramusername",
  // cursor: "id-of-prev-last-watcher",
  // customDataUID: "your-custom-lookup-id"
}

fetch(`https://api.alerts.boo/v1/watchers/list`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY
  },
  body: JSON.stringify(query)
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));
```

{% endtab %}

{% tab title="Response" %}

> [👉 View Sample Response](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/listWatchers.json)

```typescript
// Type Definition
interface ResponseBody {
  watchers: Watcher[], // Scroll up for Type Schema
  nextCursor: string, // WatcherID
  count: number
}
```

{% endtab %}

{% tab title="Try It" %}

> Click "Run Pen" and "JS" button for the interactive code \
> Recommended to open in new tab (click Edit on Codepen)

{% embed url="<https://codepen.io/entropyinternet/full/GReaXOx>" %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="168">Argument</th><th width="113">Type</th><th>Description</th></tr></thead><tbody><tr><td>status</td><td>enum</td><td>Optional. Filter by watcher status. Options are <code>Active</code> , <code>Awaiting</code>, <code>Pending</code>, <code>Paused</code>, <code>Problem</code>, <code>Insufficient Funds</code> . Leave blank for all.</td></tr><tr><td>platform</td><td>enum</td><td>Optional. Filter by platform. Options are <code>Instagram</code> or <code>Twitter</code></td></tr><tr><td>slug</td><td>string</td><td>Optional. Search by exact username match, case insensitive.</td></tr><tr><td>limit</td><td>number</td><td>Optional. Limit the search results. Default is 20, max is 100</td></tr><tr><td>cursor</td><td>WatcherID</td><td>Optional Pagination. The string ID of the last Watcher of your previous query.</td></tr><tr><td>customDataUID</td><td>string</td><td>Optional. A string field indexed for you to use as a custom searchable ID (eg. your users). Max 256 chars.</td></tr></tbody></table>

***

### Create Watcher

{% hint style="info" %}
**POST /watchers/create**\
\
Create a new Watcher with advanced features such as custom metadata & auto-expire after inactivity.&#x20;
{% endhint %}

{% tabs %}
{% tab title="Request" %}

```javascript
// copy paste this to your browser console to run
const API_KEY = 'YOUR_API_KEY'
const payload = {
    url: "https://instagram.com/insidehistory",
    webhookUrl: "https://yourapp.com/your-webhook",
    filterPrompt: "Alert me if its a post about the Roman Empire",
    note: "A private note for your team",
    alias: "A friendly title for your team",
    autoExpireMs: 1000*60*60*24*30, // auto-pause after 30 days inactivity
    customData: {
        uid: "your-custom-unique-id",
        data: JSON.stringify({ hello: 'world' })
    }
}

fetch(`https://api.alerts.boo/v1/watchers/create`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY
  },
  body: JSON.stringify(payload)
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));
```

{% endtab %}

{% tab title="Response" %}

> [👉 View Sample Response](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/createWatcher.json)

```typescript
// Type Definition
interface ResponseBody {
  watcher: Watcher, // Scroll up for Type Schema
}
```

{% endtab %}

{% tab title="Try It" %}

> Click "Run Pen" and "JS" button for the interactive code \
> Recommended to open in new tab (click Edit on Codepen)

{% embed url="<https://codepen.io/entropyinternet/full/oNVRayQ>" %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="185">Argument</th><th width="91">Type</th><th>Description</th></tr></thead><tbody><tr><td>url</td><td>string</td><td>Required. The url of your watchers source. For example, a pages' Instagram profile URL.</td></tr><tr><td>webhookUrl</td><td>string</td><td>Optional. The url of your webhook that will recieve alerts. Use empty string to remove webhook.</td></tr><tr><td>filterPrompt</td><td>string</td><td>Optional. The prompt for the Ai use as filter criteria. Determines if you get alerted. Max 2000 chars. Use empty string to remove filter criteria.</td></tr><tr><td>alias</td><td>string</td><td>Optional. A human friendly name to identify your watcher. Max 256 chars.</td></tr><tr><td>autoExpireMs</td><td>number</td><td>Optional. Watchers can auto-expire if it hasn't seen any activity in milliseconds. Defaults to 3 months. Min 1 hour, Max 10 years.</td></tr><tr><td>note</td><td>string</td><td>Optional. A private note only you can see. Max 10k chars.</td></tr><tr><td>customData.uid</td><td>string</td><td>Optional. A string field indexed for you to use as a custom searchable ID (eg. your users). Max 256 chars.</td></tr><tr><td>customData.data</td><td>string</td><td>Optional. A string serialized object for any additional data you want to store. Max 100kb or 100k chars. </td></tr></tbody></table>

***

***

### Update Watcher

{% hint style="info" %}
**POST /watchers/:watcherID/update**\
\
Update a Watcher with advanced features such as custom metadata & auto-expire after inactivity.&#x20;
{% endhint %}

{% tabs %}
{% tab title="Request" %}

<pre class="language-javascript"><code class="lang-javascript">// copy paste this to your browser console to run
<strong>const API_KEY = 'YOUR_API_KEY'
</strong>const WATCHER_ID = 'WATCHER_ID'
const payload = {
  status: "Paused",
  webhookUrl: "https://yourapp.com/other-webhook",
  filterPrompt: "Alert me if its a post about collapse of the Roman Empire",
  note: "Still a private note",
  alias: "A friendly title for your team",
  autoExpireMs: 1000*60*60*24*30, // auto-pause after 30 days inactivity
  customData: {
    uid: "your-custom-unique-id",
    data: JSON.stringify({ hello: 'world' })
  }
}

fetch(`https://api.alerts.boo/v1/watchers/${WATCHER_ID}/update`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY
  },
  body: JSON.stringify(payload)
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));
</code></pre>

{% endtab %}

{% tab title="Response" %}

> [👉 View Sample Response](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/updateWatcher.json)

```typescript
// Type Definition
interface ResponseBody {
  trigger: Trigger, // Scroll up for Type Schema
}
```

{% endtab %}

{% tab title="Try It" %}

> Click "Run Pen" and "JS" button for the interactive code \
> Recommended to open in new tab (click Edit on Codepen)

{% embed url="<https://codepen.io/entropyinternet/full/VwROENO>" %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="186">Argument</th><th width="91">Type</th><th>Description</th></tr></thead><tbody><tr><td>status</td><td>enum</td><td>Optional. Set watcher status to <code>Active</code> or <code>Paused</code> or <code>Inactive</code> (Be careful with <code>Inactive</code> as it is equal to a deletion and cannot be undone).</td></tr><tr><td>webhookUrl</td><td>string</td><td>Optional. The url of your webhook that will recieve alerts. Use empty string to remove webhook.</td></tr><tr><td>filterPrompt</td><td>string</td><td>Optional. The prompt for the Ai use as filter criteria. Determines if you get alerted. Max 2000 chars. Use empty string to remove filter criteria.</td></tr><tr><td>note</td><td>string</td><td>Optional. A private note only you can see. Max 10k chars.</td></tr><tr><td>alias</td><td>string</td><td>Optional. A human friendly name to identify your watcher. Max 256 chars.</td></tr><tr><td>autoExpireMs</td><td>number</td><td>Optional. Watchers can auto-expire if it hasn't seen any activity in milliseconds. Defaults to 3 months. Min 1 hour, Max 10 years.</td></tr><tr><td>customData.uid</td><td>string</td><td>Optional. A string field indexed for you to use as a custom searchable ID (eg. your users). Max 256 chars.</td></tr><tr><td>customData.data</td><td>string</td><td>Optional. A string serialized object for any additional data you want to store. Max 100kb or 100k chars. </td></tr></tbody></table>

***

### List Logs

{% hint style="info" %}
**POST /watchers/:watcherID/logs/list**\
\
List the most recents logs from a Watcher. Paginate through logs by most recent first.
{% endhint %}

{% tabs %}
{% tab title="Request" %}

```javascript
// copy paste this to your browser console to run
const API_KEY = 'YOUR_API_KEY'
const WATCHER_ID = 'WATCHER_ID'
const query = {
  limit: 50, // always returned newest first
  cursor: 'prev-watcher-id'
}

fetch(`https://api.alerts.boo/v1/watchers/${WATCHER_ID}/logs/list`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY 
  }
  body: JSON.stringify(query)
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));
```

{% endtab %}

{% tab title="Response" %}

> [👉 View Sample Response](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/listLogs.json)

```typescript
// Type Definition
interface ResponseBody {
  logs: Log[], // Scroll up for Type Schema
  nextCursor: string, // LogID
  count: number
}
```

{% endtab %}

{% tab title="Try It" %}

> Click "Run Pen" and "JS" button for the interactive code \
> Recommended to open in new tab (click Edit on Codepen)

{% embed url="<https://codepen.io/entropyinternet/full/LYaoMLx>" %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="117">Argument</th><th width="95">Type</th><th>Description</th></tr></thead><tbody><tr><td>limit</td><td>number</td><td>Optional. Limit the search results. Default is 20, max is 100</td></tr><tr><td>cursor</td><td>LogID</td><td>Optional Pagination. The string ID of the last Log of your previous query.</td></tr></tbody></table>

***

### Get Log

{% hint style="info" %}
**GET /logs/:logID**\
\
Get details of a specific log.
{% endhint %}

{% tabs %}
{% tab title="Request" %}

```javascript
// copy paste this to your browser console to run
const API_KEY = 'YOUR_API_KEY'
const logID = "YOUR_LOG_ID"

fetch(`https://api.alerts.boo/v1/logs/${logID}`, {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY 
  }
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));
```

{% endtab %}

{% tab title="Response" %}

> [👉 View Sample Response](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/getLog.json)

```typescript
// Type Definition
interface ResponseBody {
  log: Log, // Scroll up for Type Schema
}
```

{% endtab %}

{% tab title="Try It" %}

> Click "Run Pen" and "JS" button for the interactive code \
> Recommended to open in new tab (click Edit on Codepen)

{% embed url="<https://codepen.io/entropyinternet/full/WNmBYwO>" %}
{% endtab %}
{% endtabs %}

***

### My Profile

{% hint style="info" %}
**GET /users/:userID**\
\
Get user details of your account.
{% endhint %}

{% tabs %}
{% tab title="Request" %}

```javascript
// copy paste this to your browser console to run
const API_KEY = 'YOUR_API_KEY'
const userID = "YOUR_USER_ID"

fetch(`https://api.alerts.boo/v1/users/${userID}`, {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY 
  }
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));
```

{% endtab %}

{% tab title="Response" %}

> [👉 View Sample Response](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/myProfile.json)

```typescript
// Type Definition
interface ResponseBody {
  user: User, // Scroll up for Type Schema
}
```

{% endtab %}

{% tab title="Try It" %}

> Click "Run Pen" and "JS" button for the interactive code \
> Recommended to open in new tab (click Edit on Codepen)

{% embed url="<https://codepen.io/entropyinternet/full/wvObQyq>" %}
{% endtab %}
{% endtabs %}

***

### Rotate API Key

{% hint style="info" %}
**POST /users/:userID/rotate-token**\
\
Rotate your accounts' API key and return the new key in response. Be careful as old keys will stop working.
{% endhint %}

{% tabs %}
{% tab title="Request" %}

```javascript
// copy paste this to your browser console to run
const API_KEY = 'YOUR_API_KEY'
const userID = "YOUR_USER_ID"

fetch(`https://api.alerts.boo/v1/users/${userID}/rotate-token`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY
  }
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));Request
```

{% endtab %}

{% tab title="Response" %}

> [👉 View Sample Response](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/rotateAPIKey.json)

```typescript
// Type Definition
interface ResponseBody {
  user: User, // Scroll up for Type Schema
}
```

{% endtab %}

{% tab title="Try It" %}

> Click "Run Pen" and "JS" button for the interactive code \
> Recommended to open in new tab (click Edit on Codepen)

{% embed url="<https://codepen.io/entropyinternet/full/rNRgQQR>" %}
{% endtab %}
{% endtabs %}

***

### Buy Credits

{% hint style="info" %}
**POST /billing/:userID/topup-credits**\
\
Buy additional credits to pay for your usage. You will first need to setup billing by entering your credit card in the webapp settings page 👉 <https://app.alerts.boo/settings>\
\
Use this API route to programmatically buy more credits whenever you need. Your default credit card will be billed.
{% endhint %}

{% tabs %}
{% tab title="Request" %}

```javascript
// copy paste this to your browser console to run
const API_KEY = 'YOUR_API_KEY'
const userID = "YOUR_USER_ID"
const payload = {
  amount: 1000
}
 
fetch(`https://api.alerts.boo/v1/billing/${userID}/topup-credits`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'api-key': API_KEY
  },
  body: JSON.stringify(payload)
})
  .then(response => response.json())
  .then(data => console.log(data));
  .catch(error => console.log(error));
```

{% endtab %}

{% tab title="Response" %}

> [👉 View Sample Response](https://raw.githubusercontent.com/0xterran/samples-alertsboo/main/samples/buyCredits.json)

```typescript
// Type Definition
interface ResponseBody {
  txID: string, // purchase reciept ID
  creditsReceived: number,
  pricePaid: number, // in USD eg. 5.00 = five dollars usd
  currency: "USD", // always the same USD
  cardCharged: string // last 4 digits of credit card on file
}
```

{% endtab %}

{% tab title="Try It" %}

> Click "Run Pen" and "JS" button for the interactive code \
> Recommended to open in new tab (click Edit on Codepen)

{% embed url="<https://codepen.io/entropyinternet/full/YzgbdzN>" %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="137">Argument</th><th width="99">Type</th><th>Description</th></tr></thead><tbody><tr><td>amount</td><td>number</td><td>Required. The amount of credits you would like to buy as a one-time purchase. Min 20 credits, Max 40k credits.</td></tr></tbody></table>

***

### Rate Limits

There are 3 rate limits for the REST API. Contact us if you need more.

<table><thead><tr><th width="211">Rate</th><th>Routes</th></tr></thead><tbody><tr><td>1 per 3 seconds</td><td>POST /billing/:userID/topup-credits<br>POST /users/:userID/rotate-token</td></tr><tr><td>3 per 3 seconds</td><td>POST /watchers/list<br>POST /watchers/:watcherID/logs/list</td></tr><tr><td>10 per 3 seconds</td><td>Everything Else</td></tr></tbody></table>
