Когда ручных curl недостаточно — автоматизируйте поиск, пагинацию и export. Ниже — рабочий скрипт и разбор типичных ошибок.
Скрипт: поиск и экспорт
import requests
API_BASE = "https://app.strokka.com/api/v1"
API_KEY = "ваш_secretKey"
# 1. Поиск
search = requests.get( f " {API_BASE} /companies" , params = {
"search" : "маркетинговое агентство" ,
"searchMode" : "hybrid" ,
"limit" : 100 ,
}).json()
ids = [c[ "id" ] for c in search[ "companies" ]]
print ( f "Найдено: { search[ 'totalCount' ] } , на странице: {len (ids) } " )
# 2. Экспорт
export = requests.post( f " {API_BASE} /companies/export" , json = {
"companyIds" : ids,
"key" : API_KEY ,
})
if export.status_code == 200 :
data = export.json()
print ( f "Экспортировано: {len (data[ 'companies' ]) } , "
f "кредитов: { data[ 'creditsUsed' ] } , "
f "остаток: { data[ 'creditsRemaining' ] } " )
elif export.status_code == 402 :
print ( "Недостаточно кредитов:" , export.json()[ "detail" ])
else :
export.raise_for_status()
Что делает скрипт:
GET /companies — бесплатный поиск, контакты с маской
Собирает id с первой страницы
POST /companies/export — полные контакты, списание кредитов
Обрабатывает 402 отдельно — нехватка баланса
Пагинация в Python
Для массовой выгрузки обойдите страницы в цикле:
def collect_ids (params, page_size = 1000 ):
ids = []
skip = 0
total = None
while total is None or skip < total:
resp = requests.get( f " {API_BASE} /companies" , params = {
** params,
"limit" : page_size,
"skip" : skip,
}).json()
total = resp[ "totalCount" ]
page_ids = [c[ "id" ] for c in resp[ "companies" ]]
if not page_ids:
break
ids.extend(page_ids)
skip += page_size
print ( f "Собрано: {len (ids) } / { total } " )
return ids
Использование:
ids = collect_ids({
"search" : "маркетинговое агентство" ,
"searchMode" : "hybrid" ,
})
См. также Массовая выгрузка .
Сохранение export в файл
curl -sS -X POST "https://app.strokka.com/api/v1/companies/export" \
-H "Content-Type: application/json" \
-d '{
"companyIds": [123456, 789012],
"key": "ваш_secretKey"
}' \
-o export_result.json
В Python:
data = export.json()
with open ( "export_result.json" , "w" , encoding = "utf-8" ) as f:
import json
json.dump(data, f, ensure_ascii = False , indent = 2 )
Типичные ошибки
Проверка через curl
# Неверный ключ → 401
curl -sS -w "\nHTTP %{http_code}\n" -X POST "https://app.strokka.com/api/v1/companies/export" \
-H "Content-Type: application/json" \
-d '{"companyIds":[1],"key":"invalid"}'
# Несуществующие ID → 404, кредиты не списаны
curl -sS -w "\nHTTP %{http_code}\n" -X POST "https://app.strokka.com/api/v1/companies/export" \
-H "Content-Type: application/json" \
-d '{"companyIds":[999999999],"key":"ваш_secretKey"}'
# Rate limit → 429
curl -sS -D - "https://app.strokka.com/api/v1/companies?limit=1" -o /dev/null | grep -i retry
Таблица HTTP-кодов
Код Когда Что делать 401Неверный или отозванный key Проверить ключ в Настройки → API 402Недостаточно кредитов Пополнить баланс; заранее сравнить totalCount (запрос с limit=1) с балансом 403Нет активной подписки Проверить подписку в личном кабинете 404Компании не найдены Id не существуют; кредиты не списаны 422Пустой key или companyIds Проверить тело запроса 429Rate limit Подождать Retry-After секунд, снизить частоту 500Ошибка сервера Повторить с задержкой
Полный список — в Лимиты и ошибки .
Повтор при 429 и 500
import time
def api_get (url, params = None , max_retries = 3 ):
for attempt in range (max_retries):
response = requests.get(url, params = params)
if response.status_code == 200 :
return response.json()
if response.status_code == 429 :
wait = int (response.headers.get( "Retry-After" , 2 ** attempt))
time.sleep(wait)
continue
if response.status_code >= 500 :
time.sleep( 2 ** attempt)
continue
response.raise_for_status()
raise RuntimeError ( f "Failed after { max_retries } retries" )
Что дальше?
Last modified on July 3, 2026