Connector sync
Connector marked offline, heartbeat failing, sync jobs stuck — diagnose connector tokens, network reachability, sync mode mismatch, and dashboard cache.
A connector is "online" when the server has received a heartbeat from it within the last 5 minutes. "Unknown" between 5 and 30 minutes. "Offline" past 30 minutes.
If your connector flips offline unexpectedly, work through these checks.
Symptom
| Dashboard shows | Likely cause |
|---|---|
| Status: offline | Connector process not running, or auth failing |
| Status: unknown | Recent heartbeat skipped — wait 1–2 min |
| Status: online but sync jobs failing | Per-job validation; see Ingest failures |
| Status: online but data stale | Connector running but not pushing — check delta cursor |
403 invalid_or_revoked_key from CMS module | Token revoked or never matched |
Decision tree
Connector status = offline?
├─ Heartbeat call returning 200?
│ ├─ no → see [Auth errors](/troubleshooting/auth-errors)
│ └─ yes → connector process is silently dropping; check process logs
└─ Status sync delay; refresh after 2 min
Sync job stuck in "running"?
├─ Job > 30 min? → likely worker throttle; see [Ingest failures](/troubleshooting/ingest-failures)
└─ Job < 30 min? → wait; large catalogs take time
Data stale despite "online"?
├─ Was the delta cursor reset?
└─ Are document changes reaching the connector at all?Check 1: heartbeat works end-to-end
From the host running the connector:
curl -i -X POST https://app.aacsearch.com/api/connectors/<connectorId>/heartbeat \
-H "Authorization: Bearer ss_connector_..." \
-H "Content-Type: application/json"Expect:
HTTP/1.1 200 OK
{ "status": "ok", "timestamp": "2026-05-11T12:00:00.000Z" }If 401, see Auth errors. If 200 but the dashboard still shows offline, wait 2 minutes — the dashboard caches lastUsedAt for performance.
Check 2: handshake successful
Every connector should call handshake on startup. Re-run it manually:
curl -X POST https://app.aacsearch.com/api/connectors/handshake \
-H "Authorization: Bearer ss_connector_..." \
-H "Content-Type: application/json" \
-d '{ "moduleVersion": "1.0.0", "platform": "prestashop" }'Expect a 200 with projectId, indexSlug, connector metadata. The projectId returned here is what you pass as :projectId in subsequent sync calls.
If the response says the connector is disabled or not_found, re-enable it from Connectors → the connector → Settings.
Check 3: sync job lifecycle
A sync job goes through:
pending → running → completed (or failed)curl -X GET https://app.aacsearch.com/api/v1/projects/<projectId>/sync-jobs \
-H "Authorization: Bearer aa_admin_..."Job rows include status, documentsTotal, documentsProcessed, error, startedAt, completedAt.
| Status | Action |
|---|---|
pending > 5 min | Worker queue full — see Ingest failures |
running > 30 min for < 10k docs | Investigate; share job ID with support |
failed | Inspect the error field; see common errors below |
completed but data still stale | Delta cursor; see Check 5 |
Check 4: full vs delta mode
Different connectors support different modes. The handshake response declares which:
{
"connector": {
"id": "prestashop",
"syncModes": ["full", "delta"]
}
}If your connector only supports full and you call sync/delta, the request returns 400 sync_mode_not_supported. Switch to sync/full (slower but always works).
For high-frequency change tracking, sync/delta is the right choice — it sends only documents changed since the last cursor.
Check 5: delta cursor stuck
sync/delta is driven by a cursor stored in the connector. If the cursor is wrong (e.g., reset to a far-future timestamp), nothing new will be picked up.
Reset the cursor from the connector's own admin UI (each CMS module has a "force full re-sync" button), or call sync/full once to backfill.
# Reset and re-baseline
curl -X POST https://app.aacsearch.com/api/projects/<projectId>/sync/full \
-H "Authorization: Bearer ss_connector_..." \
-H "Content-Type: application/json" \
-d '{ "products": [...] }'After a successful sync/full, the connector's local cursor should advance to "now".
Check 6: network reachability
If the host running the connector is in a private network, it must be able to reach https://app.aacsearch.com outbound on port 443. Check:
curl -v https://app.aacsearch.com/api/health
# expect HTTP/1.1 200 OKIf this fails, the firewall or proxy is blocking egress. Allowlist app.aacsearch.com.
Check 7: connector token scope
A connector token must have scope connector_write. If you minted a ss_search_* key by mistake and tried to use it as a connector token, every connector call will return 403 forbidden.
// Server-side, with admin key
const keys = await admin.listKeys();
const yours = keys.find((k) => k.id === "key_...");
console.log(yours.scopes); // must include "connector_write"Mint the right kind from Search → API Keys → Create key → type "Connector". See API keys.
Common job errors
error on a failed job | Likely cause |
|---|---|
validation_failed | Per-document schema mismatch — see Ingest failures |
batch_too_large | More than 1000 docs in one batch |
payload_too_large | One doc > 1 MB |
index_not_found | indexSlug does not exist for this org |
quota_exceeded | Plan limit reached — see Billing limits |
worker_timeout | Worker took longer than the per-job ceiling — split into smaller batches |
Fix matrix
| Diagnosis | Fix |
|---|---|
| Heartbeat 401/403 | Mint a fresh connector token |
| Process not running | Restart connector; tail its log |
| Dashboard cache | Wait 2 min after a successful heartbeat |
| Sync mode mismatch | Switch to a mode the connector advertises |
| Delta cursor stuck | Force a sync/full to re-baseline |
| Network blocked | Allowlist app.aacsearch.com:443 outbound |
| Wrong scope | Recreate the token with connector_write scope |
| Job timeout | Split into batches of < 500 docs |
Diagnostics packet
| Field | Notes |
|---|---|
| Organization ID | required |
| Connector ID | from Connectors list view |
| Connector token prefix | first 12 chars only |
| Last successful heartbeat (UTC) | from connector log |
| Last sync job ID and status | from sync-jobs list |
| Connector module version | from the CMS module's "About" page |
| Sample failed batch | if applicable |
CMS modules log the full request/response of each sync call. Attach the connector log around the failure window — it usually shows the cause without further investigation.
Related
- Connector API lifecycle — full endpoint reference
- Connector onboarding
- Ingest failures
- Auth errors