---
title: "REST API — MoneyTrees"
description: "MoneyTrees REST API v1: movers, tickers, signals, batch, errors, pagination, rate limits, versioning."
canonical: https://moneytrees.ai/docs/api
last-updated: 2026-10-27
---

# REST API

Base URL: `https://moneytrees.ai/api/v1`. The OpenAPI 3.1 document is at [/openapi.json](https://moneytrees.ai/openapi.json).

## Endpoints

| Method | Path | Auth | Returns |
| --- | --- | --- | --- |
| GET | `/api/v1` | none | Index of endpoints |
| GET | `/api/v1/movers?limit=` | none | Top gainers and losers |
| GET | `/api/v1/tickers?q=` | none | Symbol search |
| GET | `/api/v1/tickers/{symbol}` | none | One ticker |
| GET | `/api/v1/signals?symbol=&source=&limit=&cursor=` | none | Signals, newest first |
| POST | `/api/v1/batch` | none | Up to 10 GET requests in one call |
| GET | `/api/v1/me` | Bearer | The signed-in user's plan and portfolio totals |

Signal sources: `twitter`, `reddit`, `4chan`, `polymarket`, `kalshi`, `truthsocial`, `congress`.

## Errors

Every error is JSON with one shape:

```json
{ "error": { "code": "not_found", "message": "No ticker DOGEX", "docs_url": "https://moneytrees.ai/docs/api#errors" } }
```

| Status | Code | Meaning |
| --- | --- | --- |
| 400 | `bad_request` | A parameter is missing or invalid |
| 401 | `unauthorized` | The endpoint needs a bearer token |
| 404 | `not_found` | No such resource or path |
| 429 | `rate_limited` | Too many requests; wait for `Retry-After` seconds |
| 500 | `internal` | Our fault; retry later |

## Pagination

List endpoints use cursors. Pass the `nextCursor` from one page as `cursor` on the next. A `null` `nextCursor` means the last page.

## Rate limits

Public endpoints allow 60 requests a minute per client IP. Every response carries `RateLimit-Policy` and `RateLimit` headers (IETF draft). A 429 carries `Retry-After`.

## Batch

```bash
curl -X POST https://moneytrees.ai/api/v1/batch -H 'content-type: application/json' \
  -d '{"requests":[{"method":"GET","path":"/api/v1/tickers/BTC"},{"method":"GET","path":"/api/v1/tickers/ETH"}]}'
```

## Versioning

The version is in the path. Changes inside `v1` only add fields and endpoints. A breaking change ships as `v2`, and `v1` stays up for at least 6 months after. A deprecated endpoint returns `Deprecation` and `Sunset` headers with the date and a `Link` to its successor.

## Idempotency and async jobs

Sandbox writes accept an `Idempotency-Key` header: a repeat of the same key returns the first result. Long work, such as a sandbox backtest, returns `202 Accepted` with a `Location` header to poll. See [Sandbox](https://moneytrees.ai/docs/sandbox).
