After the initial sync you send only what changed: a price, a stock level, a new order. Resending is safe, and a snapshot every so often removes what your system deleted without saying so.

Single changes: observations

One or more entities, up to 500 per request, to POST /internal/v1/connections/{connection_id}/observations. Each one carries upsert or delete, and a delete carries no document.
The response is the same as a page’s: one result per position. How to read it is in Initial sync.

How you learn about a change

CrossUp doesn’t dictate how you find out. It gives you two ways to deliver, and you pick based on what your system has:

Resending is safe

Each entity is identified by its external_id, the id it has in your system. It can also carry a revision: an integer that only grows, such as an updated_at in epoch or a sequence number.
  • With revision: it’s applied only if it’s greater than the last one. An equal or lower one answers stale and overwrites nothing.
  • Without revision: CrossUp assigns the next one and compares the content. If it matches the last one, it answers unchanged and creates no work.
So you can resend a whole batch after an outage: nothing duplicates and nothing newer gets overwritten. If your system has nothing that only grows, leave revision out.

What was deleted silently: snapshots

If your system doesn’t report deletions, a periodic snapshot finds them. It’s the same process as the initial sync. On close, whatever of that type didn’t come is removed.
A snapshot means “everything”, not “what changed”. If you close an order run with today’s orders, the earlier ones are removed. New orders are better sent as observations.

What doesn’t validate: quarantine

An entity that doesn’t meet the contract comes back quarantined. Its reason names the field: document.quantity: required. The rest of the batch goes in. Fix that entity and resend it alone. Whatever comes back accepted belongs to CrossUp. It’s archived and reaches the catalog even if something on the other side is down. Your connector doesn’t need to retry it.

Glossary

  • Connection: your store in CrossUp. Its id is the connection_id (cn_…).
  • Observation: an entity that changed, with upsert or delete.
  • Snapshot: “here’s everything” for one entity type. When you close it, what didn’t come is removed.
  • Run: an open snapshot (snp_…). Left unclosed, it expires after 24 hours.
  • Revision: an integer that only grows and says which version is newest.
  • Quarantine: what didn’t validate; reason says why.

What you’ll see

Every change you send comes back accepted. A retry comes back unchanged or stale, and your catalog keeps the newest version.

If you don’t see it

The canonical model

Which fields each entity carries and which ones are omitted.

Connector SDK and protocol

The contract, and how to speak it in your language.