AACSearch / guide
CMS connectors
Which shop platforms sync into AACSearch, how a connector authenticates, what it sends, push and pull sync, CMS installations, where the console shows sync status, and the limits.
A connector keeps a collection in step with a shop's catalogue. The shop never writes to the search index directly: every change goes into a per-connector journal, and a queue applies the journal to the collection. The journal is also what a rebuild reads, so a document that reached the index some other way can disappear from it at the next rebuild. Use the connector, not a direct import, for anything a CMS owns.
CMS module detects a change
or a periodic pull
Durable, per-connector
Documents become searchable
Accepted is not the same as searchable
A webhook answers success once the change is in the journal. The queue applies it to the collection afterwards, so a document can be accepted and still not be searchable for a short while. Watch the job status, not only the webhook response.
Supported platforms
integrations/catalog.json lists the CMS modules and where each one stands:
| Platform | Status | Module | How it connects |
|---|---|---|---|
| 1C-Bitrix | beta | aacworkflow.aacsearch 1.8.x, not yet published on the Marketplace | installation key, or connector id and secret β see 1C-Bitrix module |
| PrestaShop 8β9 | beta | aacsearch, installed from a ZIP | installation key |
| Zen Cart 2.2.2 | experimental | aacsearch-module (Docker setup) | connector id and secret |
| WooCommerce | planned | none yet | β |
The connector API also accepts the providers bitrix24, woocommerce, yml,
sitemap and custom. The provider is a label on the connector: every provider
writes through the same webhook or pull path described below. To load a Yandex
Market feed into a collection without a module, use YML feeds.
Two ways to connect a shop
| Row label / Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ | Connector (Sources) | CMS installation |
|---|---|---|
| Created in | Sources β Add source (POST /connectors) | Integrations β CMS stores (POST /cms/installations) |
| Credential the shop stores | connector id + signing secret (cnsec_β¦), shown once | installation key aac_install_β¦, shown once |
| Grants | appending to the journal of one collection | the installation's own runtime endpoints for its bound sources |
| Settings live in | the module | the console, published to the module |
| Used by | Bitrix (settings page or wizard), Zen Cart | Bitrix 1.8.1+, PrestaShop |
Neither credential is an API key. A connector secret cannot search or read configuration, and an installation key is rejected by the tenant API. The shop never needs a full key in the browser: the rule from the widget page applies to every CMS module too, and the browser only ever uses a search-scoped key against our API.
Connectors
Create one
In the console, Sources β Add source asks for a name, the target
collection, the provider, the sync mode, a schedule and, in pull mode, a pull
URL and token. From code, createConnector:
curl -X POST https://api.aacsearch.com/v1/connectors \
-H "X-NOVA-API-KEY: $NOVA_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"Main catalogue","collection":"products","provider":"bitrix","sync_mode":"push"}'The 201 response carries the signing secret once. Later reads return only
secret_preview, and updateConnector never rotates it. Store the id and secret
in the module (connector_id / connector_secret).
An organization can have one connector per collection and provider. A second
bitrix connector for the same collection is refused, so if the module lost
its secret, paste the existing id and secret from Sources into the module
rather than creating another connector.
List, inspect and remove connectors
listConnectors (GET /connectors) lists every connector for the
organization; getConnector (GET /connectors/{connectorId}) returns one β
the secret is never included, only secret_preview. deleteConnector
(DELETE /connectors/{connectorId}) removes the connector, its journal and
its jobs; documents already indexed stay in the collection.
Before a module goes live it can call handshakeConnector
(POST /connectors/handshake) to declare what it is (cms, version),
which marketplace edition it runs as (sku) and which capabilities it can
provide. The response's effective array is the intersection of what was
declared, what the SKU allows and what the organization's plan covers;
denied explains each capability left out (not_declared, sku or plan,
with the minimum tier for a plan denial). Call it once after install and
again on a schedule β it is stateless, so the platform stores nothing from
it.
Push: the signed webhook
The shop posts catalogue events to POST /connectors/{connectorId}/webhook
(ingestConnectorWebhook). The request carries no API key. It is authenticated
by HMAC:
X-Signature-Timestampβ Unix seconds. A timestamp more than five minutes from the server clock is rejected.X-Signatureβ hex HMAC-SHA256 oftimestamp + "." + raw body, keyed with the connector secret. Sign the exact bytes you send; re-encoding the JSON after signing breaks the signature.
BODY='{"events":[{"event":"update","external_id":"42","name":"Cordless drill, 18V","price":84.0},{"event":"delete","external_id":"17"}]}'
TS=$(date +%s)
SIG=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$CONNECTOR_SECRET" -hex | sed 's/^.* //')
curl -X POST "https://api.aacsearch.com/v1/connectors/$CONNECTOR_ID/webhook" \
-H "Content-Type: application/json" \
-H "X-Signature-Timestamp: $TS" -H "X-Signature: $SIG" \
-d "$BODY"The body is either one event object or { "events": [ β¦ ] }:
| Field | Meaning |
|---|---|
external_id (or element_id, or id) | required; becomes both the document id and external_id |
event | delete (or deleted) removes the document; anything else is an update |
source_revision | optional non-negative integer; an event whose revision is not newer than the one already journaled is ignored |
event_id | optional, 1β128 characters |
| every other key | a document field |
event, element_id, iblock_id, source_revision and event_id are envelope
keys and are not stored on the document. Within one batch, the last event for an
external_id wins.
The answer counts what reached the journal and names the apply job:
{ "success": true, "data": { "received": 2, "upserted": 1, "deleted": 1, "job_id": "cnjob_β¦" } }What the apply job does
Each accepted batch becomes a connector job (kind: ingest_batch) on a queue.
The job reads the journal rows it names. It sends updates to the collection as
an emplace import, so the fields you send change and the rest are kept (see
write actions), and it deletes removed documents.
A job counts as done only when the engine confirms every document. A temporary
failure puts the job back in the queue to retry. A missing collection fails the
job and puts the connector into error with the message. A job left queued or
processing for more than 30 minutes is re-queued by a recovery cron.
So a successful webhook response means "in the journal", not "searchable yet". The job's status says when the collection has caught up.
Pull: for shops that cannot call out
Some hosts block outgoing connections. With sync_mode: "pull" the platform
fetches changes from the shop instead:
pull_urlis the shop's change-log endpoint. For the Bitrix module it ishttps://shop.example/bitrix/tools/aac.search/pull-outbox.php.pull_tokenis sent asX-AACSEARCH-TOKENand asAuthorization: Bearer. It is the module's ownpull_tokenoption, not an API key, and the API never returns it (pull_token_setsays whether one is stored).- The request is
GET pull_url?afterSequence=<cursor>&limit=100. The response is{ items: [{ sequence, externalId, action, data }], hasMore, sequence }(actionUPSERT/UPDATEorDELETE/DELETED). The platform stores the cursor and advances it only after the batch is queued. - Each tick fetches at most 10 pages. The pulled events go through the same
journal and apply queue as a job of
kind: pull.
schedule_cron must be one of the platform's triggers: */15 * * * * (the
default when empty) or 0 3 * * *.
Full and incremental sync
The platform has no "fetch the whole catalogue" call. Both kinds of sync are the shop sending events:
- Incremental β the module sends changed and deleted products as they happen (push) or exposes them in its change log (pull).
- Full β the module re-sends every product as update events. Unchanged documents are harmless to re-send: an update writes the same values again.
In the Bitrix module a full export is the Reindex page, the wizard's first export or a console command; see initial and delta indexing.
CMS installations
A CMS installation manages a shop from the console instead of from the module's settings page. It is used by the Bitrix module from 1.8.1 and by PrestaShop.
Connect a store
Integrations β CMS stores β Connect a store: store name, website origin,
platform and environment (production or staging). The installation key
is shown once.
Paste the key into the module
The key is pinned to that HTTPS origin, and a copy of the site on another domain needs its own installation.
Wait for discovery
The module reports what it found (stores, catalogues, their schemas and capabilities) and appears as Waiting for module, then Connected.
Manage settings
Add the discovered stores. Set each store's language and currency, choose
which native features to enable (search in the existing theme, smart
filters, recommendations), and bind each catalogue to a connector. Create
a data source for this catalog builds the collection and a push connector.
Publishing sends the configuration with the revision you read, and a stale
revision is refused (409).
First export
The module applies the revision, acknowledges it and starts the first full export of each bound source.
The console can also queue three commands for an installation: Reindex
catalog (reindex), Sync changes (resync) and Discover catalogs
(refresh_capabilities). The module takes one command at a time on a
120-second lease, renewing it and reporting progress. When a lease expires, the
next pass resumes the same command. A command is completed when the data
reached the journal. The index may still be processing it.
Where to watch sync status
- Sources (
/dashboard/sources) lists connectors with problems first: status (idle,syncing,error,paused), last sync, last error, and a quiet badge for an enabled source that has not synced in a day. - Source detail (
/dashboard/sources/{id}) shows the last 30 jobs (listConnectorJobs,GET /connectors/{id}/jobs, statusesqueued,processing,ready,error, with per-job stats and error, andlimitto page) and the journal (listConnectorDocuments,GET /connectors/{id}/documents, paginated withlimit/offset). It refreshes while a job is running. - CMS stores (
/dashboard/integrations/cms) shows each installation's last contact, applied revision, module and CMS versions, last error, and its recent commands with progress.
The console pages are described screen by screen in Console β Data.
Limits and failure codes
| Limit | Value |
|---|---|
| Events per webhook request | 500 (400 Batch exceeds 500 events.) |
| Signature clock window | Β±5 minutes (401 Invalid connector signature.) |
| Pull page size / pages per tick | 100 / 10 |
| Pull schedules | */15 * * * *, 0 3 * * * |
| Connectors per collection + provider | one per organization |
| Collections per connector | one |
| Stores in one installation configuration | 100 |
| Command lease | 120 seconds; the console lists the last 100 commands |
A disabled or unknown connector answers 404. Connector traffic is checked
against the organization's standing even though it carries no API key. A
suspended organization answers 402, an exhausted request quota 429, and a
standing that cannot be verified 503. The same checks run again before a
queued job writes to the collection.
Deleting a connector removes its journal and jobs. The documents already in the collection stay.
The CMS runtime protocol
Everything above is what your own server or a module's settings page calls.
A module also has its own machine-to-machine protocol against /cms/runtime/*
and /cms/installations/{id}/commands* β heartbeats, leasing and reporting on
the three commands from CMS installations, reading the
installation's entitlement and per-source schema, and enqueueing source events,
behavioural events and recommendations for a bound source. It authenticates with
the installation key, not an API key, and is meant for a CMS module's own code,
not for a shop owner to call by hand β see the
API reference for the full request and response shapes of each
cms operation rather than a hand-written walkthrough here.
Review a dataset and propose a schema
Submit a sample of your data, get a profiled proposal for the collection schema and field roles, check which capabilities it enables, then confirm it.
1C-Bitrix module
Install and connect the aacworkflow.aacsearch module, configure it, run the first and delta exports, place the aacsearch components, turn on the smart filter, SEO filter pages, voice search and recommendations, and troubleshoot.