---
title: "Push All Leads"
method: POST
path: "/integrations/crm-sync/leads/push"
tags: ["Integrations"]
---

# Push All Leads

`POST /integrations/crm-sync/leads/push`

## Request

- Base URL: `https://be.graph8.com/api/v1`
- URL: `https://be.graph8.com/api/v1/integrations/crm-sync/leads/push`
- Auth: HTTP bearer

Push graph8 people into Salesforce as Leads. THIS WRITES TO THEIR SYSTEM.

Returns a job - the work happens in the background. Poll
`GET /integrations/crm-sync/jobs/{job_id}`.

Over the app's population threshold the JOB is refused unless
`large_population_confirmed` is true - the request itself is still a 202,
and the refusal is what the job's status reports. Run
`POST /integrations/crm-sync/leads/previews` first to learn the count you
would be acknowledging.

## Headers

- `Authorization` string, nullable
- `X-Target-Org-Id` string, nullable

## Request body

- PushAllLeadsRequest: Push graph8 people into Salesforce as first-class Leads. Salesforce is the CRM that distinguishes a Lead from a Contact; the other providers do not, which is why this is a separate surface from `/integrations/crm-sync/contacts/push` rather than an `entity_type` on it.
  - `connection_id` string, required: Which CRM connection to push into.
  - `limit` integer, nullable: Ceiling on records pushed. Omit for the app's default.
  - `chunk_size` integer, nullable: Records per batch.
  - `max_parallel` integer, nullable: Concurrent batches.
  - `use_file_import` boolean, nullable: Use the provider's bulk file import instead of the API.
  - `file_import_threshold` integer, nullable: Record count above which the file import is used.
  - `crm_list_id` string, nullable: Target list in the CRM.
  - `sync_list_mode` 'no_list' | 'new_list' | 'existing_list', nullable: `no_list` (the app's default), `new_list` or `existing_list`. Sending `crm_list_id` with no mode implies `existing_list`.
  - `source_mode` 'all_qualified' | 'saved_segment' | 'segments_union' | 'all_contacts', nullable: Which population to push. `saved_segment` REQUIRES `audience_id`; `segments_union` REQUIRES `audience_ids`. Omit for the app's default (`all_qualified`).
  - `audience_id` integer, nullable: graph8 audience for `saved_segment`.
  - `audience_ids` integer[], nullable: graph8 audiences for `segments_union`.
  - `salesforce_campaign_id` string, nullable: Add every pushed lead to this Salesforce Campaign as a CampaignMember.
  - `lead_id` integer, nullable: Push a single graph8 lead row.
  - `status_qualified` string, nullable: Salesforce `Lead.Status` API name to set on qualified leads. Read the valid values from `/integrations/crm-sync/leads/statuses` - Lead.Status is an OPEN picklist, so Salesforce stores whatever is sent and an invented value silently becomes a real status.
  - `status_unqualified` string, nullable: Salesforce `Lead.Status` API name for unqualified leads.
  - `large_population_confirmed` boolean, nullable: Acknowledge that this job covers a population large enough that the app asks first. Leave unset to keep that refusal in place; set true ONLY when you have read the preview's record count and accept it. This is a safety interlock, not a tuning option - the records land in the customer's Salesforce and cannot be un-pushed.
  - `auto_assign_on_create` boolean, nullable: Run Salesforce's assignment rules on each created lead.

## Response `202`

Successful Response

- ApiResponseSyncJobResponse
  - `data` SyncJobResponse, required: A bulk job, or its status. Open-shaped - the payload carries per-provider progress detail that differs between CRMs and grows with them.
    - `job_id` string, nullable
    - `status` string, nullable
  - `pagination` PaginationMeta
    - `page` integer, required: Current page number (1-indexed)
    - `limit` integer, required: Items per page
    - `total` integer, required: Total number of items
    - `has_next` boolean, required: Whether there are more pages
    - `next_cursor` string, nullable: Opaque cursor for the next page; null when there are no more items. Pass it back as the `cursor` query param to fetch the following page without computing page numbers.
    - `total_available` integer, nullable: Search endpoints only: how many records really match, when known. Can be larger than `total`, which is capped at the 10,000 results that can be paged. For company search this is a distinct-company estimate. Null when unknown; absent outside search.
    - `total_is_lower_bound` boolean, nullable: Search endpoints only: true when more records match than `total` shows (the result set is larger than the 10,000 results that can be paged). Absent outside search.
    - `notes` string[], nullable: Search endpoints only: plain-language notes about the result, e.g. that more records match than can be paged, or that a reversed `between` range was put in order.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/graph8/apis/graph8-developer-api.md) · [All operations](https://skmtc.dev/graph8/apis/graph8-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/graph8/apis/graph8-developer-api/revisions/2e7cfa0ca921?raw)
