Skip to content

Quickstart

1. Get an API key

Try it now with a public demo key (6 rpm by default, no AI endpoints):

X-API-Key: demo_ttp_free_2604

For anything past that first call, get your own key from the free sign-up — the free tier is self-service and the key is issued immediately, no card. The demo key is shared and public: the rate-limit bucket is keyed on the API key, not on your IP, so those 6 rpm are pooled across everyone using it. Fine for one curl, not for your prototype.

From here on the examples read the key from the environment, so it does not end up committed by accident:

export TTP_API_KEY="your_key_here"

2. First call

curl -X POST https://api.telecomtowerpower.com.br/analyze_link \
  -H "X-API-Key: ${TTP_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "receiver": {"lat": -15.78, "lon": -47.93, "height": 10},
    "frequency_mhz": 1800
  }'
import os

import requests

resp = requests.post(
    "https://api.telecomtowerpower.com.br/analyze_link",
    headers={"X-API-Key": os.environ["TTP_API_KEY"]},
    json={
        "receiver": {"lat": -15.78, "lon": -47.93, "height": 10},
        "frequency_mhz": 1800,
    },
    timeout=30,
)
resp.raise_for_status()
print(resp.json()["link_margin_db"])
const resp = await fetch(
  "https://api.telecomtowerpower.com.br/analyze_link",
  {
    method: "POST",
    headers: {
      "X-API-Key": process.env.TTP_API_KEY,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      receiver: { lat: -15.78, lon: -47.93, height: 10 },
      frequency_mhz: 1800,
    }),
  },
);
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const data = await resp.json();
console.log(data.link_margin_db);

A 429 means you hit the rate limit — most likely still on the shared demo key. See rate limits.

3. Read the result

The API returns the best candidate tower with link_margin_db. Values above 10 dB usually mean the link is viable in clear sky; above 20 dB tolerates heavy rain in the 700 / 1800 / 2100 MHz bands.

4. Next