REST API · OpenAPI 3.1

API Tier1.shop

Connect your service or AI agent: registration, rates, orders, links, and payment status via a single API. Client data is accessible only via their revocable key.

API Base URL
https://tier1.shop/wp-json/tier1-api/v1

Getting Started

Account already exists

Create a key

Open «API and Connections» in your dashboard or request a key creation link via email through POST /api-key-requests.

New Client

Confirm email

The agent calls POST /registration-intents. You follow the link in the email to confirm your address; only then are the account and key created. Telegram can be added later.

First order — five steps

  1. Choose a plan.GET /catalog/tariffs and GET /balances will show current prices and availability.
  2. Confirm the details.Agree on the quantity, URLs, anchor texts, and currency with the agent before creating the checkout.
  3. Get the payment link.POST /checkout-intents will return a one-time URL; payment is processed only on the website.
  4. Verify payment.GET /checkout-intents/{id} will show the status and WooCommerce order number.
  5. Open links.GET /orders/by-wc/{id} will find internal orders; placement_progress will show execution status.
Important: the purchase number from the email and the account order ID are different values. For the email number use /orders/by-wc/{id}, for the internal ID use /orders/{id}.

Authorization

Pass the key in the HTTPS header. Do not insert it into the URL, public prompts, or logs. The key can be revoked in the account; its full text is shown only during creation.

Authorization: Bearer t1c_sk_YOUR_KEY
Key permissions (scopes)8
profile:readProfile and Connection Status
balance:readService and Wallet Balances
orders:readView Orders
links:readView Links
catalog:readCatalogs and Rates
orders:writeBulk Fill and Submit Orders
links:writeURLs, Anchors, Surrounding Text and Submission
checkout:createCreate Secure Payment Links

The key does not allow the agent to deduct funds from the wallet directly. For mutating requests, a random Idempotency-Key of 8–128 characters is required. If the response is lost, repeat the same request with the same key; for a new action, create a new one.

API Methods

Methods are organized into 9 groups. Open the required one for parameters and a response example; the full machine contract is in OpenAPI JSON.

20 methods

Discovery 2

GET/capabilitiesAPI capabilities and current connection links.
Access: NoScope: —

Response Example

{
    "name": "Tier1.shop API",
    "api_enabled": true,
    "public_registration": true
}
GET/openapi.jsonFull OpenAPI 3.1 specification.
Access: NoScope: —

Response Example

{
    "openapi": "3.1.0",
    "info": {
        "title": "Tier1.shop Client API"
    }
}

Register 3

POST/registration-intentsStart registration for a new client with mandatory email confirmation.
Access: NoScope: —

Request JSON

{
    "email": "client@example.com",
    "telegram_username": "@client",
    "locale": "ru",
    "issue_api_key": true
}

Response Example

{
    "accepted": true,
    "request_id": "…",
    "status_token": "…",
    "status": "pending_email",
    "expires_in": 86400
}
GET/registration-intents/{id}?status_token={token}Check the status of a specific registration.
Access: Status tokenScope: —

Response Example

{
    "status": "pending_email|email_verified|expired",
    "email_verified": false,
    "telegram_status": "not_requested|pending_bot_message|verified"
}
POST/api-key-requestsRequest a one-time key creation link for an existing account.
Access: NoScope: —

Request JSON

{
    "email": "client@example.com",
    "name": "Мой агент"
}

Response Example

{
    "accepted": true,
    "next_action": "…"
}

Account 2

GET/profileProfile, email confirmation, and all Telegram channels.
Access: BearerScope: profile:read

Response Example

{
    "account": {
        "email": "client@example.com",
        "email_verified": true,
        "telegram_username": "@client",
        "telegram_usernames": [
            "@client",
            "@manager"
        ]
    }
}
GET/balances?geo=allRUB/$ wallets and unused RU/intl services.
Access: BearerScope: balance:read

Response Example

{
    "wallets": {
        "rub": {
            "currency": "RUB",
            "amount_minor": 0
        },
        "usd": {
            "currency": "USD",
            "amount_minor": 0
        }
    },
    "service_balances": []
}

Orders 3

GET/orders?geo=all&page=1&per_page=20Paginated list of account orders. per_page is limited to 50: continue via next_page.
Access: BearerScope: orders:read

Response Example

{
    "orders": [
        {
            "cabinet_order_id": 123,
            "wc_order_id": 456,
            "placement_progress": {
                "completed": 2,
                "total": 3,
                "fully_placed": false
            }
        }
    ],
    "page": 1,
    "per_page": 20,
    "has_more": false,
    "next_page": null
}
GET/orders/{id}A single order and links by cabinet_order_id, not by the WooCommerce number from the email.
Access: BearerScope: orders:read

Response Example

{
    "order": {
        "cabinet_order_id": 123,
        "wc_order_id": 456,
        "geo": "ru"
    },
    "links": []
}
GET/orders/by-wc/{id}All internal orders and links by the client's WooCommerce number.
Access: BearerScope: orders:read

Response Example

{
    "wc_order_id": 456,
    "count": 2,
    "orders": [
        {
            "order": {
                "cabinet_order_id": 123
            },
            "links": []
        }
    ]
}

Links 1

GET/links?geo=all&page=1&per_page=20Links with geo, status, and link_type filters; continue via next_page.
Access: BearerScope: links:read

Response Example

{
    "links": [],
    "page": 1,
    "per_page": 20,
    "total": 0,
    "has_more": false,
    "next_page": null
}

Catalog 2

GET/catalog/tariffs?geo=ruCurrent products, prices, currencies, and exact slot composition.
Access: BearerScope: catalog:read

Response Example

{
    "geo": "ru",
    "currency": "RUB",
    "tariffs": [
        {
            "product_id": 3708,
            "name": "…",
            "price": {
                "amount_minor": 200000
            }
        }
    ]
}
GET/catalog/burzh-igamingAnonymized iGaming donor sites, metrics, price, and available slots.
Access: BearerScope: catalog:read

Response Example

{
    "donors": [],
    "count": 0,
    "price": {
        "currency": "USD",
        "amount_minor": 9400
    }
}

Drafts 3

PATCH/links/{id}Change URL, anchor text, surrounding text, or schedule without submitting the link for processing.
Access: Bearer + Idempotency-KeyScope: links:write

Request JSON

{
    "url": "https://example.com/page",
    "anchor": "пример",
    "context_text": "Окружающий текст с анкором пример.",
    "scheduled_at": "2026-09-01T09:00:00Z"
}

Response Example

{
    "link": {
        "id": 456,
        "status": "awaiting_confirmation"
    }
}
PUT/links/{id}PATCH alias for clients sending a partial set of modifiable fields.
Access: Bearer + Idempotency-KeyScope: links:write

Request JSON

{
    "anchor": "новый анкор"
}

Response Example

{
    "link": {
        "id": 456,
        "status": "awaiting_confirmation"
    }
}
POST/orders/{id}/bulk-updateBulk fill order rows without sending to production.
Access: Bearer + Idempotency-KeyScope: orders:write

Request JSON

{
    "links": [
        {
            "url": "https://example.com/a",
            "anchor": "ключ"
        },
        {
            "url": "https://example.com/b",
            "anchor": "другой ключ"
        }
    ]
}

Response Example

{
    "updated": 2,
    "errors": []
}

Send 2

POST/links/{id}/submitSend one ready link to production after client confirmation.
Access: Bearer + Idempotency-KeyScope: links:write

Request JSON

[]

Response Example

{
    "link": {
        "id": 456,
        "status": "in_progress"
    }
}
POST/orders/{id}/submit-allSend all ready order rows after client confirmation.
Access: Bearer + Idempotency-KeyScope: orders:write

Request JSON

[]

Response Example

{
    "submitted": 2,
    "skipped": 0
}

Payment 2

POST/checkout-intentsCreate a secure one-time link to the standard checkout; no funds are charged.
Access: Bearer + Idempotency-KeyScope: checkout:create

Request JSON

{
    "geo": "ru",
    "items": [
        {
            "product_id": 3708,
            "quantity": 1
        }
    ],
    "links": [
        {
            "type": "yearly",
            "url": "https://example.com/page",
            "anchor": "пример"
        }
    ]
}

Response Example

{
    "intent_id": "32-символьный ID",
    "checkout_url": "https://tier1.shop/?t1c_agent_checkout=…",
    "expires_at": "…",
    "summary": {
        "currency": "RUB",
        "total_minor": 200000
    },
    "payment_preview": {
        "wallet_available_minor": 0,
        "nominal_wallet_gap_minor": 200000,
        "final_amount_at_checkout": true
    }
}
GET/checkout-intents/{id}Check payment and order appearance in the account via intent_id without reopening the one-time link.
Access: BearerScope: checkout:create

Response Example

{
    "intent_id": "…",
    "state": "paid",
    "wc_order_id": 456,
    "cabinet_order_ids": [
        123
    ],
    "fulfilment_pending": false
}

If the request failed

400 / 422Correct the parameters. Do not repeat the same invalid request.
401 / 403Check the key and its permissions; create a new one if necessary.
404Check the number and ID type. Third-party orders are not disclosed.
409Update the order status or use a new key for a new action.
429 / 5xxWait and try again. For a mutating request, keep the same Idempotency-Key and JSON.

Lists return a maximum of 50 rows per page. If has_more=true, go to next_page. The preliminary amount in the API does not replace the final amount and available payment methods at checkout.

Need MCP instead of REST API?

The same revocable key works for the MCP client with HTTP headers. You can also connect via OAuth if the application supports it.

Open MCP Instructions