Stakly for developers
Your contacts. Your systems.
A simple, read-only API for the business cards you save in Stakly.
Public API · v1
Get started
Fetch your saved scanned and manually entered cards, including your corrections. The separate owner business card is not included. API reads work on every account plan and do not consume scanning quotas.
- Sign in to My account and open API access.
- Name your integration and select Generate API key.
- Save the key immediately; its full value is shown only once.
- Send it in the Authorization header on each data request.
Authorization: Bearer YOUR_API_KEYBase URL
https://stakly.pro/api/public/v1/Use the examples below from your server. Store the key in a secret manager or server environment variable, never in browser code or a distributed mobile app.
Endpoints
GET /cards/List your saved cards. Supports search, category, updated_since, and page_size.
GET /cards/{id}/Get one of your cards by ID. Missing cards and cards belonging to another account return 404.
GET /categories/List shared default categories and your own categories. Each category contains id, name, and slug. Follow next for additional pages.
All data endpoints require a valid Bearer API key. Creating, changing, or deleting cards through this API is not supported.
Download the OpenAPI schema for the complete contractCard response fields
| Fields | Description |
|---|---|
id | Stable card ID. Use it to upsert records in your system. |
full_name, title, company | Contact name, job title, and company. |
phone, phone_secondary, email | Primary phone, secondary phone, and email address. |
address, website, notes | Postal address, website, and saved notes. |
category | An object with id, name, and slug, or null when no category is assigned. |
image_front, image_back | Image URLs, or null when absent. URLs follow the existing storage configuration; availability and expiry depend on that storage. |
created_at, updated_at | ISO 8601 timestamps for creation and the latest saved update. |
Filters & pagination
search- Search saved contact details.
category- Filter by a category ID returned by the categories endpoint.
updated_since- Include cards updated at or after a timezone-aware ISO 8601 timestamp, for example 2026-09-17T10:00:00Z. Invalid filter values return 400.
page_size- 50 records by default, up to 100 per page.
Follow the next link
List responses contain results, next, and previous. Cards use cursor pagination ordered by creation timestamp and ID. Request the exact next URL until it is null. Keep cursors opaque; do not construct page numbers.
{
"next": null,
"previous": null,
"results": []
}Poll for updates
Record the start time of each polling run, request updated_since using the previous run’s start time with a small overlap, and follow all next links. Upsert by id: the filter is inclusive, so overlapping results are expected. Only advance your checkpoint after all pages succeed.
This API does not provide deletion synchronization or a change-event feed. A missing card in an incremental response does not mean it was deleted.
Code examples
Set STAKLY_API_KEY in your server environment to the key you saved. These examples never require credentials in a URL.
cURL
curl --get "https://stakly.pro/api/public/v1/cards/" \
--header "Authorization: Bearer ${STAKLY_API_KEY}" \
--data-urlencode "updated_since=2026-09-17T10:00:00Z" \
--data-urlencode "page_size=100"This cURL request fetches one page. Follow the returned next URL for the rest.
Python
Uses the Python standard library. Run on your server.
import json
import os
from urllib.request import Request, urlopen
url = "https://stakly.pro/api/public/v1/cards/?page_size=100"
headers = {"Authorization": "Bearer " + os.environ["STAKLY_API_KEY"]}
while url:
request = Request(url, headers=headers)
with urlopen(request, timeout=30) as response:
page = json.load(response)
for card in page["results"]:
print(card["id"], card["full_name"])
url = page["next"]JavaScript · server-side
Uses Node.js with built-in fetch. Run as an ES module on your server, never in a browser.
const key = process.env.STAKLY_API_KEY;
if (!key) throw new Error("Set STAKLY_API_KEY");
let url = "https://stakly.pro/api/public/v1/cards/?page_size=100";
while (url) {
const response = await fetch(url, {
headers: { Authorization: `Bearer ${key}` },
signal: AbortSignal.timeout(30000),
});
if (!response.ok) throw new Error(`Stakly API: ${response.status}`);
const page = await response.json();
for (const card of page.results) {
console.log(card.id, card.full_name);
}
url = page.next;
}Errors & limits
The default limit is 120 requests per minute per owner, shared across all of that owner’s keys. Deployments may configure a different limit. On 429, wait for the number of seconds in Retry-After before trying again.
400- Invalid filter or request. Correct the reported value.
401- Missing, invalid, or revoked key, or an inactive account. Check your Bearer header and key status.
404- The requested card or cursor was not found or is not accessible to this account.
405- Unsupported HTTP method. Data endpoints are read-only.
429- Request limit reached. Respect the Retry-After response header.
Errors are JSON. Authentication and general request errors use a detail message; validation errors may be keyed by field. Do not rely on exact human-readable wording.
Manage and rotate keys
Create up to 10 active keys per account. Use a separate named key for each integration so you can identify and revoke it independently. The dashboard shows its masked prefix, creation date, last use, and status.
- Generate a replacement key and save it securely.
- Update your server integration and verify it can read your cards.
- Revoke the old key in My account. Access stops on the next authentication attempt.
If a key is exposed, revoke it and replace it. These keys grant read access only to the owner’s public API data; they do not authenticate app, billing, admin, or key-management requests.
Open API access