TvojeLajky for developers

From discovery to delivery.

Connect your AI assistant to live prices, real profiles and purchases within a customer-approved budget.

TvojeLajky API and MCP

TvojeLajky.cz provides Instagram and TikTok followers, likes and video views for the Czech market. Public catalog and quotes need no account. Payments are in CZK. All API amountMinor fields are integer halere: 100 = CZK 1. Profiles and posts come from ScrapeCreators. Unknown numbers are null. Service availability and prices are verified against the live catalog.

Connect an AI client

Remote MCP endpoint: https://tvojelajky.cz/mcp. Use Streamable HTTP. Claude Code: claude mcp add --transport http tvojelajky https://tvojelajky.cz/mcp Codex: codex mcp add tvojelajky --url https://tvojelajky.cz/mcp For private tools, complete OAuth sign-in in the client (Codex: codex mcp login tvojelajky). Read the tool description before invoking a purchase. MCP registration does not mean this provider is automatically installed or recommended in every AI product.

Capabilities

list_services: six service categories, live starting prices and quantity limits. get_profile / list_posts: real profile and up to 20 recent posts. get_quote: exact price, expires after 15 minutes; no charge. create_order: creates an unpaid order and a private checkout link. get_order: read payment and fulfillment status. get_wallet: authenticated balance and remaining budget. pay_order: spends approved prepaid credit and starts delivery. New API orders do not accept coupons or invoice fields in v1; use the website when those are needed.

Public HTTP quickstart

curl https://tvojelajky.cz/api/v1/services
# Replace YOUR_PUBLIC_USERNAME with a real public account.
curl https://tvojelajky.cz/api/v1/quotes \
  -H 'Content-Type: application/json' \
  -d '{"platform":"instagram","username":"YOUR_PUBLIC_USERNAME","type":"followers","quantity":100,"postUrls":[]}'
# Use the returned quoteId and a new random key per intended order.
curl https://tvojelajky.cz/api/v1/orders \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: REPLACE_WITH_RANDOM_UUID' \
  -d '{"quoteId":"REPLACE_WITH_QUOTE_ID"}'

TypeScript example

const root = 'https://tvojelajky.cz/api/v1';
async function api(path: string, body?: unknown, key?: string) {
  const r = await fetch(root + path, {
    method: body === undefined ? 'GET' : 'POST',
    headers: { 'Content-Type': 'application/json', ...(key ? { 'Idempotency-Key': key } : {}) },
    ...(body === undefined ? {} : { body: JSON.stringify(body) }),
  });
  const result = await r.json();
  if (!r.ok) throw new Error(result.error.code);
  return result.data;
}
const quote = await api('/quotes', { platform: 'instagram', username: 'YOUR_PUBLIC_USERNAME', type: 'followers', quantity: 100 });
// Persist this key before sending; reuse it after a timeout.
const key = crypto.randomUUID();
const order = await api('/orders', { quoteId: quote.quoteId }, key);
console.log(order.checkoutUrl); // Show privately to the customer; do not log tokens in production.

Python example

import json, urllib.request, uuid
ROOT = 'https://tvojelajky.cz/api/v1'
def api(path, body=None, key=None):
    headers = {'Content-Type': 'application/json'}
    if key: headers['Idempotency-Key'] = key
    req = urllib.request.Request(ROOT + path, data=None if body is None else json.dumps(body).encode(), headers=headers)
    with urllib.request.urlopen(req, timeout=60) as response:
        return json.load(response)['data']
quote = api('/quotes', {'platform': 'instagram', 'username': 'YOUR_PUBLIC_USERNAME', 'type': 'followers', 'quantity': 100})
key = str(uuid.uuid4()) # Persist and reuse on retries.
order = api('/orders', {'quoteId': quote['quoteId']}, key)
# Show order['checkoutUrl'] privately to the customer.

Targets, prices and retries

Followers target one public profile. Likes/views target 1–20 posts returned by list_posts for that profile; quantities are shared evenly, so the total must be divisible by the number of selected posts. Views require posts with isVideo:true; unknown media types cannot be purchased as video views. A quote expires in 15 minutes and is rechecked before ordering. PRICE_CHANGED returns a replacement quote for acceptance. No substitute prices or profiles are returned. An order keeps its accepted price. Idempotency-Key is required for creation and credit payment (16–128 letters, numbers, underscores, dots or hyphens). Reuse both body and key after network failures. A different body with an existing key produces IDEMPOTENCY_CONFLICT. Never create another order to resolve uncertain delivery.

Order privacy and checkout handoff

Read an anonymous order with GET /api/v1/orders/{orderId} and X-Order-Token. orderToken expires after 7 days and permits only reading that order. checkoutUrl is a single-use link valid for 15 minutes. Its URL fragment is exchanged by a user-confirmed POST for an HttpOnly checkout cookie; preserve the full URL including the fragment. Treat both as secrets. Once opened, return to checkout in the same browser. Expired or lost access requires support, not a replacement paid order.

Authorize spending

Open /wallet and verify your email through a one-time link. There is no password. Top up through Finby (CZK 100–10,000 per top-up). Grant a total budget, per-order maximum and expiry (up to 90 days) to your agent. Grants cover any supported profile. Top-ups do not increase grants. Revoke in /wallet. Automatic card charges and automatic top-ups are not supported. If there is insufficient credit, the customer must complete a new top-up themselves. API/MCP credentials never contain card details.

OAuth and HTTP authentication

OAuth metadata: /.well-known/oauth-authorization-server. Protected resource metadata: /.well-known/oauth-protected-resource/mcp and /.well-known/oauth-protected-resource/api/v1. Public client registration: POST /oauth/register with client_name, redirect_uris and token_endpoint_auth_method:none. Authorization code with S256 PKCE and state is required. Supported resources: https://tvojelajky.cz/mcp and https://tvojelajky.cz/api/v1. Tokens are audience-bound; obtain a separate authorization for the other resource. Scopes: orders:read, orders:write, wallet:read, wallet:spend. Access tokens last at most 1 hour; rotated refresh tokens at most 30 days, both capped by grant expiry. Private HTTP calls use Authorization: Bearer TOKEN. Keep tokens in secret storage, never in URLs or repository files.

Errors and delivery status

HTTP returns {data:...} or {error:{code,details?}}. Validation failures: 400; authorization required: 401; forbidden scope: 403; unavailable order: 404; price/idempotency/budget/payment conflicts: 409; expired quote/link: 410; limits: 429 with Retry-After; unavailable service/provider: 503. Poll order status no faster than every 30 seconds. pending means unpaid; paid means payment accepted; processing_started/processing mean delivery is underway; completed means delivery complete; partial and failed need inspection. needsReview indicates a failure or a paid order without campaigns. A browser return or provider timeout never proves payment or authorizes another order.

Links and support

Catalog: https://tvojelajky.cz/sluzby OpenAPI: https://tvojelajky.cz/openapi.json Wallet: https://tvojelajky.cz/wallet Terms: https://tvojelajky.cz/terms Privacy: https://tvojelajky.cz/privacy Support: https://tvojelajky.cz/contact Report an order problem privately with its order ID. Do not include tokens or payment credentials.