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.
https://tier1.shop/wp-json/tier1-api/v1Getting Started
Create a key
Open «API and Connections» in your dashboard or request a key creation link via email through POST /api-key-requests.
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
- Choose a plan.
GET /catalog/tariffsandGET /balanceswill show current prices and availability. - Confirm the details.Agree on the quantity, URLs, anchor texts, and currency with the agent before creating the checkout.
- Get the payment link.
POST /checkout-intentswill return a one-time URL; payment is processed only on the website. - Verify payment.
GET /checkout-intents/{id}will show the status and WooCommerce order number. - Open links.
GET /orders/by-wc/{id}will find internal orders;placement_progresswill show execution status.
/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_KEYKey permissions (scopes)8
profile:readProfile and Connection Statusbalance:readService and Wallet Balancesorders:readView Orderslinks:readView Linkscatalog:readCatalogs and Ratesorders:writeBulk Fill and Submit Orderslinks:writeURLs, Anchors, Surrounding Text and Submissioncheckout:createCreate Secure Payment LinksThe 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.
Discovery 2
GET/capabilitiesAPI capabilities and current connection links.
Response Example
{
"name": "Tier1.shop API",
"api_enabled": true,
"public_registration": true
}GET/openapi.jsonFull OpenAPI 3.1 specification.
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.
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.
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.
Request JSON
{
"email": "client@example.com",
"name": "Мой агент"
}Response Example
{
"accepted": true,
"next_action": "…"
}Account 2
GET/profileProfile, email confirmation, and all Telegram channels.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Request JSON
{
"anchor": "новый анкор"
}Response Example
{
"link": {
"id": 456,
"status": "awaiting_confirmation"
}
}POST/orders/{id}/bulk-updateBulk fill order rows without sending to production.
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.
Request JSON
[]Response Example
{
"link": {
"id": 456,
"status": "in_progress"
}
}POST/orders/{id}/submit-allSend all ready order rows after client confirmation.
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.
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.
Response Example
{
"intent_id": "…",
"state": "paid",
"wc_order_id": 456,
"cabinet_order_ids": [
123
],
"fulfilment_pending": false
}If the request failed
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



