Execute Import
POST /imports/{importId}/execute
/imports/{importId}/executeRequired Tokens
| Field | Type | Required | Description |
|---|---|---|---|
| Bearer | Authorization: Bearer <api-key> | Optional | Your API key. Pass it as the Bearer token on every request. |
| Event token | x-Event-Token | Optional | Run **Get Tokens** in the Authorization folder, or call `GET /Events/{eventId}/authorize` manually. |
Commits the stored plan. No body — nothing is re-sent, because the rows the user reviewed are already persisted.
Writing is batched: the target is loaded once and committed once, with each row built inside its own
try/catch. A row that throws is recorded Failed and the run continues; everything that
succeeded lands in a single transaction.
Writes go through each target's own domain path, never a generic column writer — so proposal lines flow through the proposal evaluator exactly like hand-entered ones and the acceptance lock still applies, and imported events go through the event lifecycle.
Matches are re-resolved here, not trusted. A record that was planned for update but has since
been deleted or archived reports Failed on its own row while the rest of the import completes.
That row keeps the matchedRecordId and matchedRecordLabel it planned against, which is the
record of what would have been written.
Events created by import land as Draft. A held draft consumes no license seat, which is what
makes a bulk create possible at all. Activate them the usual way once they are real.
Requires EventAdmin permission on the event.
Response
| Field | Type | Description |
|---|---|---|
| importId | Guid | |
| status | string | `Completed` even when individual rows failed. |
| createdCount / updatedCount / skippedCount / failedCount | int | |
| rows[].rowNumber | int | |
| rows[].plannedOutcome | string | Unchanged from the plan. |
| rows[].result | string | `Created`, `Updated`, `Skipped` or `Failed`. |
| rows[].matchedRecordId | Guid | The created or updated record. |
| rows[].matchedRecordLabel | string| null | That record's display name. Null on rows that matched nothing. |
| rows[].reason | string | The domain's own message when the row failed. |
Row failures return 200. A row that failed is data, not an HTTP error. 500 is reserved for
the run itself dying, which leaves the import Failed.
Errors
| Status | Meaning |
|---|---|
400 | Status is not Planned — the double-submit guard. Clicking start twice does not import twice. |
404 | No such import, or it belongs to another event or organization. |
500 | The run itself failed. The import is left Failed and is re-readable. |