Expose your business metrics to Found with a few lines — no manual snapshot endpoint.
Project description
found-sdk
Отдавай метрики своего бизнеса в Found в несколько строк — без ручного endpoint'а, без возни с авторизацией и форматом JSON.
pip install found-sdk[fastapi] # или found-sdk[flask]
Не на Python? Есть Node/TypeScript-версия:
npm install found-sdk(в этом репозитории — папкаnode/).
Как это работает
Found читает (pull) метрики с твоего бэкенда: раз в N часов делает
GET <твой_url>/api/found/snapshot с заголовком Authorization: Bearer <ключ>.
found-sdk поднимает этот endpoint за тебя: проверяет ключ, собирает
самодокументируемый JSON и отдаёт его Found. Всё, что делаешь ты — описываешь метрики.
Быстрый старт (FastAPI)
import os
from fastapi import FastAPI
from found_sdk import FoundSnapshot
app = FastAPI()
found = FoundSnapshot.from_env() # читает BUSINESS_API_KEY / BUSINESS_NAME / ...
@found.kpi("active_subscribers", label="Активные подписчики", delta="+1")
def subs():
return db.count_active()
@found.kpi("mrr_rub", label="MRR", unit="₽")
def mrr():
return billing.mrr()
@found.custom("server_load_pct", label="Загрузка серверов", unit="%")
def load():
return monitoring.avg_cpu()
@found.issues
def issues():
return [{"severity": "warning", "text": "Сервер Germany #2 CPU 94%"}]
app.include_router(found.fastapi_router()) # монтирует GET /api/found/snapshot
Flask
from flask import Flask
from found_sdk import FoundSnapshot
app = Flask(__name__)
found = FoundSnapshot.from_env()
@found.kpi("mrr_rub", label="MRR", unit="₽")
def mrr():
return 2740
app.register_blueprint(found.flask_blueprint())
Любой другой фреймворк
Используй handle() напрямую — он сам делает авторизацию и сборку:
status, body = found.handle(request.headers, remote_addr=request.remote_addr)
return JSONResponse(body, status_code=status)
Настройка
FoundSnapshot.from_env() читает переменные из блока .env, который выдаёт Found:
| Переменная | Назначение |
|---|---|
BUSINESS_API_KEY |
Ключ из Found (обязательно) |
BUSINESS_SNAPSHOT_PATH |
Путь endpoint'а (по умолчанию /api/found/snapshot) |
BUSINESS_NAME |
Название бизнеса |
FOUND_SANDBOX |
1/true → режим только чтения |
Либо явно:
found = FoundSnapshot(
api_key=os.environ["BUSINESS_API_KEY"],
business_name="SkyVPN",
sandbox=True,
allowed_ips=["203.0.113.10"], # необязательно: разрешить только egress-IP Found
provider_timeout=5.0, # мягкий тайм-аут на каждый провайдер метрики
)
Безопасность
- Сравнение ключа через
hmac.compare_digest— без тайм-атак. - Ключ никогда не логируется и не попадает в текст ошибок.
- Sandbox (
FOUND_SANDBOX=1) →meta.sandbox=true, Found только читает. - Read-only: endpoint ничего не меняет в твоём бизнесе by design.
- IP-allowlist (опционально): ограничь доступ egress-адресом Found.
- Изоляция сбоев: если один провайдер метрики упал или завис — он пропускается, остальной snapshot отдаётся. Один кривой запрос не роняет весь endpoint.
Запускай endpoint только по HTTPS.
Формат ответа
SDK собирает самодокументируемый JSON, который Found понимает автоматически:
{
"meta": { "synced_at": "2026-06-30T15:00:00+00:00", "sandbox": true },
"business_name": "SkyVPN",
"period": "last_24h",
"health": "warning",
"kpis": { "mrr_rub": { "value": 2740, "label": "MRR", "unit": "₽" } },
"custom": { "server_load_pct": { "value": 72, "label": "Загрузка серверов", "unit": "%" } },
"issues": [{ "severity": "warning", "text": "Germany #2 CPU 94%" }]
}
Агент видит кастомные поля как business.custom.server_load_pct — добавлять новые метрики
можно без правок кода Found.
Разработка
pip install -e .[dev]
pytest
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file found_sdk-0.1.0.tar.gz.
File metadata
- Download URL: found_sdk-0.1.0.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7be02cb0b832d9a12fb44f4ee994b15ccf473f9541b69de588512a49deb76371
|
|
| MD5 |
e856d6677c8e1d46bc1e655d35046f58
|
|
| BLAKE2b-256 |
413051da8e81e1e0ea0800ab453032b8225f7625dbbe9971c10bf1dba0794806
|
Provenance
The following attestation bundles were made for found_sdk-0.1.0.tar.gz:
Publisher:
python-release.yml on nikitadyachkov1970-pixel/found-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
found_sdk-0.1.0.tar.gz -
Subject digest:
7be02cb0b832d9a12fb44f4ee994b15ccf473f9541b69de588512a49deb76371 - Sigstore transparency entry: 2022349574
- Sigstore integration time:
-
Permalink:
nikitadyachkov1970-pixel/found-sdk@bf2fe53faa60c1c2f1cb5fc7d97e551fd747e031 -
Branch / Tag:
refs/tags/py-v0.1.0 - Owner: https://github.com/nikitadyachkov1970-pixel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-release.yml@bf2fe53faa60c1c2f1cb5fc7d97e551fd747e031 -
Trigger Event:
push
-
Statement type:
File details
Details for the file found_sdk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: found_sdk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fad93e1f6405ae4ae32833cae2ec23f10aafdc7e0de17488cd5b27d3d39bdc2
|
|
| MD5 |
a9a797312441c94b8bc34378666da151
|
|
| BLAKE2b-256 |
00093e3e71b29f3567673de30817098432e35757bad49a0a96ba41174dbe5b3e
|
Provenance
The following attestation bundles were made for found_sdk-0.1.0-py3-none-any.whl:
Publisher:
python-release.yml on nikitadyachkov1970-pixel/found-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
found_sdk-0.1.0-py3-none-any.whl -
Subject digest:
5fad93e1f6405ae4ae32833cae2ec23f10aafdc7e0de17488cd5b27d3d39bdc2 - Sigstore transparency entry: 2022349695
- Sigstore integration time:
-
Permalink:
nikitadyachkov1970-pixel/found-sdk@bf2fe53faa60c1c2f1cb5fc7d97e551fd747e031 -
Branch / Tag:
refs/tags/py-v0.1.0 - Owner: https://github.com/nikitadyachkov1970-pixel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-release.yml@bf2fe53faa60c1c2f1cb5fc7d97e551fd747e031 -
Trigger Event:
push
-
Statement type: