> ## Documentation Index
> Fetch the complete documentation index at: https://docs.conare.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Connector data policy

> What each connector syncs and excludes: 24-month backfill cap, credential and gov-ID field excludes for Gmail, Slack, Affinity, Salesforce, HubSpot, Attio.

Every connector is governed by a data policy that decides what leaves the source and what lands in a container. The policy is enforced twice — once when Conare configures the upstream sync (source-side field disables, obfuscation, row filters, cutoff) and again in the ingest mapper as rows stream through — so a source that silently ignores an upstream knob still never lands an excluded value in memory.

Six connectors are governed by the launch policy today: **Gmail, Slack, Affinity, Salesforce, HubSpot, and Attio**.

## Global guarantees

These apply to every connector under the policy:

* **24-month backfill cap.** Activity older than 24 months (emails, messages, CRM activities, tasks, notes, engagements) is not synced.
* **Evergreen CRM entities are always included.** Current-state CRM records — `accounts`, `contacts`, `companies`, `organizations`, `persons`/`people`, `opportunities`, `deals`, `leads`, `lists`, `list_entries`, `field_values`, `pipelines`, `products` — sync in full regardless of age. A 5-year-old account still lands. Only their activity streams are capped.
* **Credentials and government/financial IDs are stripped at the source.** Fields matching credential/secret patterns (`password`, `secret`, `api_key`, `token`, `client_secret`, `private_key`, `access_key`) and government/financial-ID patterns (`ssn`, `social_security`, `tax_id`, `ein`, `vat`, `iban`, `swift`/`bic`, `routing_number`, `credit_card`, `cvv`/`cvc`, `passport`, `national_id`, `drivers_license`, `aadhaar`, `bank_account`, `bank_number`) are disabled before rows leave the source system.
* **Deal amounts and revenue are kept.** Business-critical numeric fields (`amount`, `annual_revenue`, `account_number` as a CRM identifier) are explicitly preserved — the exclusion list targets secrets and personally identifying financial IDs, not commercial data.

## Per-connector policy

### Gmail

|                  |                                                                    |
| ---------------- | ------------------------------------------------------------------ |
| Backfill         | Last 24 months of mail                                             |
| Excluded labels  | `SPAM`, `TRASH`, `DRAFT`, `CATEGORY_PROMOTIONS`, `CATEGORY_SOCIAL` |
| What lands       | Subject, from, to, and text body                                   |
| What never lands | Attachments, raw MIME, transport headers                           |

Excluded labels are filtered at the source with an `ArrayDoesNotContain` row filter on `labelIds`, so promotional and social mail never lands in the blob to begin with. The 24-month cap is re-applied in the ingest mapper because the Gmail source-side cutoff is best-effort.

### Slack

|                  |                                                                 |
| ---------------- | --------------------------------------------------------------- |
| Backfill         | Last 24 months of messages                                      |
| Channel scope    | The end user's channel selection (from the hosted consent link) |
| What lands       | Channel, speaker, text                                          |
| What never lands | Bot/system events, file binaries                                |

Slack respects the per-entry channel allowlist the end user picks during the consent flow. Channels not on the allowlist are excluded from the sync — pass the desired channel ids as `collections` on the connect link or on `POST /api/v1/connectors/sync`.

### Affinity, Salesforce, HubSpot, Attio (CRM)

|                  |                                                                                                                                                                                                             |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Backfill         | Last 24 months of activity; evergreen entities always included                                                                                                                                              |
| Excluded schemas | Attachment and file-binary collections (`attachment`, `content_document`, `content_version`, `files`, `documents`); audit and history trails (`audit`, `history`, `login_history`, `event_log`, `apex_log`) |
| Excluded fields  | Credential/secret and bank/tax/government-ID fields (see the global list above)                                                                                                                             |
| Kept             | Deal amounts, revenue, account numbers, all other business fields                                                                                                                                           |

Requesting an excluded collection explicitly (e.g. `"collections": ["attachments"]`) fails loud with a `400` — attachments and audit trails are refused, not silently dropped. Unrecognized schemas default to capped, never to uncapped, so a new activity-like object added by the CRM vendor won't backfill unbounded.

## Backfill: partner path vs. dashboard

The 24-month cap is enforced on the **partner path** — end users your Integration connects through the hosted OAuth link (`POST /api/v1/connectors/link`). Personal accounts connected directly in the Conare dashboard sync their full history; the cap applies to partner-minted connections only.

## Working with the policy

**On the collections endpoint.** `GET /api/v1/connectors/{type}/collections` never lists policy-excluded collections — the ids you get back are the ids you're allowed to request.

```bash theme={null}
curl https://api.conare.ai/api/v1/connectors/salesforce/collections \
  -H "Authorization: Bearer $CONARE_KEY"
# → { "collections": [{ "id": "account", "name": "Account" }, ...] }
# Attachment and history schemas are absent by design.
```

**On the connect link.** Pass `collections` to narrow further. For Slack this scopes to channels; for CRM sources it scopes to entity schemas. Omit it to sync every non-excluded collection.

```bash theme={null}
curl https://api.conare.ai/api/v1/connectors/link \
  -H "Authorization: Bearer $CONARE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "endUserId": "u_123",
    "type": "salesforce",
    "collections": ["account", "contact", "opportunity"]
  }'
```

Requesting a policy-excluded id returns a `400`:

```json theme={null}
{
  "statusCode": 400,
  "code": "invalid_request",
  "message": "collections excluded by data policy for salesforce: attachment (attachments and audit trails are never synced)",
  "requestId": "req_..."
}
```

**On field-level exclusions.** Credential and government/financial-ID fields are matched by segment-bounded name patterns against the source's field ids and their normalized snake-case output names — the policy is a convention across CRM schemas, not a per-CRM list, so a new custom field named `passport_number__c` on Salesforce is excluded automatically.

## Related

* [Integrations overview](/integrations/overview) — the connector catalog and sync cadence
* [Connectors API reference](/api-reference) — full request and response shapes
