◆ Sapport for developers API reference Error catalog OpenAPI
Sections

#Cells and Data

Status: Available. Cells, their data boundaries, and the disclosure log of personal data; the GET /disclosures method is Planned.

Purpose: which cells exist, which address to send requests to, what "a key of one cell" means, and how responsibilities for personal data are divided.

#Three cells

The platform runs as three independent production cells. Each has separate servers, a separate database, separate secrets, and its own legal entity. The data of one cell is not visible in another.

CellBrand / domainAPI base addressPage languages
RUFormula Krema — formula-cream.prohttps://formula-cream.pro/api/public/v1Russian
ENWalker Formulation Academy — wfacademy.orghttps://wfacademy.org/api/public/v1English, Russian
IDwfacademy.idhttps://wfacademy.id/api/public/v1Indonesian, English, Russian

The cell in which you are registered determines:

A page language is not a cell. The ID cell's site serves pages in Indonesian, English, and Russian. Do not determine the cell by language: use the address you use to sign in to the dashboard, or the prefix of your key.

#A key belongs to one cell

A key works only at the address of the cell where it was issued. The prefix shows the cell:

PrefixCell
sap_ru_…RU
sap_en_…EN
sap_id_…ID

A key cannot be moved to another cell. If you have accounts in several cells, they are independent accounts: each cell has its own integrations and its own keys.

#The wrong_cell error

If you call the EN cell's API with an RU key, you get:

HTTP/1.1 401 Unauthorized
Content-Type: application/problem+json
X-Request-Id: req_EXAMPLE0002
{
  "type": "https://wfacademy.org/developers/errors#wrong_cell",
  "title": "Ключ принадлежит другой ячейке",
  "status": 401,
  "code": "wrong_cell",
  "detail": "Этот ключ выпущен в другой ячейке. Используйте адрес из поля correct_base_url.",
  "correct_base_url": "https://formula-cream.pro/api/public/v1",
  "request_id": "req_EXAMPLE0002"
}

What to do: take the address from the correct_base_url field and fix the base address in your configuration. If you serve tenants of several cells, store "key and base address" pairs together and derive the address from the key prefix (sap_<cell>_…).

#Data storage and responsibility

QuestionAnswer
Who is the data controllerThe tenant. It determines the purposes and legal bases for processing its customers' personal data.
Who are weThe data processor, acting on the tenant's instructions.
Where RU data is storedIn Russia. Personal data is not transferred across borders from the RU cell.
Where EN and ID data is storedIn their own cell, on their own database.
Can you get another cell's dataNo. Requests always go to the key's cell.

#Personal data in the RU cell

Restricting a key to one cell guarantees that the platform stores RU data in Russia. It does not prevent you from retrieving data with a request from a Russian address and forwarding it abroad: from the moment of disclosure, responsibility for compliance with the personal data law rests with the tenant as the data controller.

The API endpoints that carry personal data (conversations, messages, leads, contacts) are open in all cells. In the RU cell, additional conditions apply to scopes with personal data (conversations:*, leads:*):

ConditionHow it is met
IP allowlistMandatory for the integration: a key with such scopes is not issued without a list
Hosting country of the receiving systemSpecified when the integration is connected; only Russia is allowed
Basis for the transferSpecified when the integration is connected
Ban on cross-border transferIf the hosting country is not Russia, the conversations:* and leads:* scopes and the include_pii flag are not granted to that integration: the response is 403 pii_transfer_not_allowed
Disclosure log and disclosure recordMaintained automatically, see below

#Transferring personal data to external systems

Connecting an external CRM or a webhook with include_pii: true is a transfer of personal data to a third party at the tenant's decision. For it:

For details, see Transferring personal data.

#Personal data disclosure log

Every disclosure of personal data through the API (a response with a contact, an event with include_pii: true) is recorded as a log row: who (integration and key), what (data type), how many records. The values themselves are not written to the log.

The log is visible to the tenant in the dashboard and through GET /disclosures (a cursor-paginated list, Conventions). It is retained for 3 years.

#What the platform does with personal data by default

#Retention periods for service data

DataPeriod
API request log (no bodies, no personal data)90 days
Webhook delivery log30 days
Personal data disclosure log and disclosure register3 years
Idempotency cache24 hours
List cursor24 hours
Tombstones of deleted records (include_deleted)30 days
Tracker hits (in analytics)180 days

Retention periods for the conversations, leads, and contacts themselves are determined by the tenant's settings and the contract.

#What differs between cells

WhatBehavior
Base address and keysseparate for each cell
Currency of money and the walletRUB, GBP, IDR
Set of languagessee the table above
Server beacon of the modules by defaultRU: full; EN and ID: anonymous
Personal data endpointsopen in all cells; the mandatory IP list, the country and basis for transfer, and the ban on transfer to recipients outside Russia apply to RU only

The shape of requests, errors, and webhooks is the same in all cells. Only the addresses, currencies, and personal data conditions differ.

#Notes