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

# iCIMS ATS

> Feature coverage and implementation details for the iCIMS integration

## Implementation Overview

**Implementation Type:** Kombo-based Integration
**Note Format:** Plain Text
**Status:** Production Ready

iCIMS is a thin Kombo-based provider. Reading jobs, applications, and candidates, moving
applications between stages, and creating applications all work through Kombo's unified
API. Job custom fields are the exception: Kombo's unified iCIMS payload never populates
them, so the configured "Tenzo Enabled" job field is fetched directly from iCIMS via the
passthrough API (see below).

## Configuration

| Property            | Value                                     |
| ------------------- | ----------------------------------------- |
| Provider Enum       | `icims`                                   |
| Note Format         | `PLAIN`                                   |
| Disposition Reasons | Not supported (rejection is a stage move) |
| Passthrough URL     | `/passthrough/icims/default`              |

## Interview Summary & PDF Writeback (Passthrough)

Because Kombo's unified iCIMS connector has no note endpoint and rejects non-CV
attachments, interview results are written back through the **iCIMS passthrough API** by
PATCHing the applicant workflow directly. The applicant-workflow id used is the Kombo
application's `remote_id` (not the Kombo internal `id`).

These destinations are configured **per org** in the ATS Integration UI, under the
**Custom Field Mapping** section, as free-text field ids (e.g. `field675560`). They are
free-text rather than dropdowns because these applicant-workflow field ids are not
surfaced by Kombo's unified custom-fields endpoint.

<AccordionGroup>
  <Accordion title="Interview Summary (Supported)" defaultOpen>
    Set **iCIMS Interview Summary Field ID** to the applicant-workflow custom field id that
    should receive the interview summary text. When set, the post-call flow writes the
    summary via:

    ```
    PATCH /applicantworkflows/{application.remote_id}
    { "<field id>": "<summary text>" }
    ```

    Gated purely on the presence of the configured field id (leave it blank to skip). The
    PATCH overwrites the same field, so a redelivered post-call flow is idempotent. Write
    failures do not prevent the independent PDF write from being attempted, but they propagate
    through post-processing retries. Persistent failures ultimately dead-letter for investigation.
  </Accordion>

  <Accordion title="Interview PDF (Supported)">
    Set **iCIMS Interview PDF Field ID** to the applicant-workflow **binary** field id that
    should receive the interview PDF. When set, the post-call flow writes the PDF via:

    ```
    PATCH /applicantworkflows/{application.remote_id}/fields/{field id}/binary
    Content-Type: multipart/form-data; boundary=...
    Content-Disposition: attachment; filename="..."

    --boundary
    Content-Disposition: form-data; name="file"; filename="..."
    Content-Type: application/pdf
    Content-Transfer-Encoding: base64

    <base64-encoded PDF>
    --boundary--
    ```

    The PDF rides as a `Content-Transfer-Encoding: base64` part so the request body stays
    ASCII and survives Kombo passthrough's UTF-8 forwarding intact (verified byte-identical
    round-trip); iCIMS decodes it back to the original bytes on receipt. Gated purely on the
    presence of the configured field id (leave it blank to skip). Skips cleanly when the call
    produced no PDF (no gradeable content, or the org has no PDF template). The PATCH
    overwrites the same binary field, so a redelivered post-call flow is idempotent. Write
    failures do not undo the independently attempted summary write, but they propagate through
    post-processing retries. Persistent failures ultimately dead-letter for investigation.
  </Accordion>

  <Accordion title="Tenzo Enabled Job Field (Supported)">
    Set **iCIMS Tenzo Enabled Job Field ID** to the **job** custom field id (e.g.
    `field51234`) that marks a job as Tenzo enabled. When set, job enrichment fetches the
    value directly from iCIMS via:

    ```
    GET /jobs/{job.remote_id}?fields=<field id>
    ```

    The field then appears in the integration rules editor as a boolean job custom field
    (`custom_field_values.<field id>`) and rules evaluate against it. Yes/no and true/false
    values are normalized to booleans. Gated purely on the presence of the configured field
    id (leave it blank to skip). Fetch failures are logged and fail soft — the job still
    syncs, just without custom field values. After configuring the field id, re-sync jobs:
    cached enhanced jobs won't carry the field until re-synced.
  </Accordion>
</AccordionGroup>

## Known Limitations

<Note>
  **Notes & non-CV attachments not supported via Kombo**
  Kombo's iCIMS connector exposes no note endpoint and its attachment endpoint accepts
  CV/resume attachments only. Interview summaries and the interview PDF are instead written
  to configured applicant-workflow custom fields via passthrough (see above).
</Note>

<Info>
  **Disposition Reasons**
  iCIMS does not expose a disposition reason bank through Kombo, so rejection and
  not-interested flows are handled as stage moves.
</Info>

## Related Files

* Implementation: `server/ats/icims/icims_ats_client.py`
* Models: `server/ats/icims/icims_models.py`
* Config fields: `server/ats/config/models.py` (`IcimsInterviewSummaryCustomField`, `IcimsInterviewPdfCustomField`, `IcimsTenzoEnabledJobCustomField`)
* Config registration: `server/ats/config/providers.py` (`IcimsConfig`)
* Typed accessors: `server/ats/org_config.py` (`icims_interview_summary_custom_field`, `icims_interview_pdf_custom_field`, `icims_tenzo_enabled_job_custom_field`)
* Field Mappings: `server/ats/field_type_mapper.py` (`ICIMS_FIELD_MAPPINGS`)

## See Also

* [ATS Coverage Matrix](/internal/ats-coverage)
