a fictional SaaS service
RU
Otklik

API v1

Otklik API documentation

Reply generation, the review queue and publishing — for CRMs, bots and your own dashboards. The format is JSON, authorization is a key in the header. The console at the bottom of the page runs requests right in the browser, with the same analysis and checks as in the dashboard.

Base URL

https://api.otklik.example

Test key

ok_test_7f3a9c2e51b84d06

Rate limit

10 requests a minute in the demo, X-RateLimit-* headers

Authorization: Bearer ok_test_7f3a9c2e51b84d06
Content-Type: application/json

POST/v1/replies

Generate a reply

Returns a reply to a review, the results of the checks and the autopilot’s decision under the store’s rules. Publishes nothing.

Parameters

marketplacerequired"wb" | "ozon"Platform — the check rules depend on it
ratingrequired1–5The buyer’s rating
textstringReview text, may be empty
productrequiredstringProduct SKU from the store’s catalogue
authorstringBuyer’s name to address them by
tone"warm" | "business" | "light"Tone, taken from the store settings by default
curl -X POST "https://api.otklik.example/v1/replies" \
  -H "Authorization: Bearer ok_test_7f3a9c2e51b84d06" \
  -H "Content-Type: application/json" \
  -d '{
  "marketplace": "wb",
  "rating": 2,
  "product": "kruzhka",
  "author": "Sergey",
  "text": "The lid started leaking after just a week"
}'

Response · 200

{
  "reply": "Hello, Sergey! ...",
  "sentiment": "negative",
  "topics": ["leak"],
  "route": "manual",
  "checks": [{ "id": "contacts", "status": "ok" }]
}

GET/v1/reviews

Review queue

The store’s reviews with draft replies. Filters by status and platform, cursor-based pagination.

Parameters

status"new" | "approve" | "published"Status in the queue
marketplace"wb" | "ozon"Platform
limit1–100Page size, 20 by default
curl -X GET "https://api.otklik.example/v1/reviews?status=approve&limit=5" \
  -H "Authorization: Bearer ok_test_7f3a9c2e51b84d06"

Response · 200

{
  "items": [{ "id": "r2", "rating": 2, "status": "approve", "draft": "..." }],
  "next_cursor": null
}

POST/v1/reviews/{id}/publish

Publish a reply

Sends the draft or the provided text to the marketplace. Before sending, the reply goes through the checks once more — if it fails, you get a 422.

Parameters

idrequiredstringReview ID
textstringYour own text instead of the draft
curl -X POST "https://api.otklik.example/v1/reviews/r2/publish" \
  -H "Authorization: Bearer ok_test_7f3a9c2e51b84d06" \
  -H "Content-Type: application/json" \
  -d '{ "text": "Hello, Sergey! ..." }'

Response · 200

{ "id": "r2", "status": "published", "published_at": "2026-10-14T09:12:00Z" }

GET/v1/usage

Limit usage

How many replies have been used this month, the plan limit and the forecast to the end of the month.

Parameters

No parameters.

curl -X GET "https://api.otklik.example/v1/usage" \
  -H "Authorization: Bearer ok_test_7f3a9c2e51b84d06"

Response · 200

{ "plan": "business", "used": 1240, "limit": 3000, "forecast": 2650 }

Webhooks

The service sends a POST to your URL when events happen in the store. The signature is an HMAC-SHA256 of the body with the secret from the dashboard: verify it before trusting the request. Retries — 5 times with an increasing pause until you respond with 2xx.

  • review.created

    A new review in the store — with topic analysis and a draft reply

  • reply.published

    A reply was published by the autopilot or by a person

  • review.escalated

    A review went to tasks: a defect, breakage or insults

POST https://your-server.ru/otklik-hook
X-Otklik-Event: review.created
X-Otklik-Signature: sha256=9c1f…e04a

{
  "event": "review.created",
  "review": { "id": "r2", "marketplace": "wb", "rating": 2, "topics": ["leak"] },
  "draft": "Hello, Sergey! ...",
  "route": "manual"
}

Errors

The error body is always the same: { "error": { "code", "message" } }, and a 400 also has a list of fields.

400Bad requestA field is missing or a value is out of range — the response lists the fields with errors
401UnauthorizedNo Authorization header, or the key has been revoked
402Limit reachedThe plan’s replies have run out and top-ups are switched off
422Checks failedThe text to publish contains contacts, links or stop phrases
429Too many requestsMore than 10 requests a minute in the demo (60 in the production version)

Console

Requests run in the browser against a demo implementation of the API: the same checks, error codes and limit. Pick an example or build your own.

Press “Send” and the response will appear here