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

# ServiceNow

> ServiceNow (ITSM / Service Management): the API posture, publish target and field mapping composerID publishes a decision reference through.

This page records how composerID publishes into ServiceNow: the vendor's API posture, the publish target and field mapping, and the documentation each claim rests on. It is for anyone evaluating the connection or building against it.

ServiceNow is the one destination where the journey can both start and finish: the Triage diagnostic runs as a Service Portal / Employee Center widget in the requester's existing session, and composerID publishes the decision back into the same instance. Writes go through the Import Set API with a transform map that coalesces on correlation\_id (the task table's standard field for external-system identifiers) so a replayed publish updates the existing record instead of creating a duplicate. Catalog requests go through the Service Catalog API, never raw Table API inserts.

<Info>
  Category: ITSM / Service Management. Coverage status: Specification mapped. Vendor documentation: public developer portal.
</Info>

## Integration path

How composerID connects to this destination, at a glance.

| Step                 | Detail                                                                                                                                                                  |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Authentication       | OAuth 2.0 or basic auth against a dedicated integration user flagged web-service-access-only, with a scoped least-privilege role plus snc\_platform\_rest\_api\_access. |
| composerID publishes | Record (via Import Set): POST /api/now/import/\{staging\_table} → transform map                                                                                         |
| Intent ID lands on   | `record` `correlation_id`, written into the destination record                                                                                                          |
| Back-sync            | Webhooks and polling: some lifecycle events are pushed, the rest are read on a schedule.                                                                                |

## Vendor documentation

<Columns cols={2}>
  <Card title="Table API (REST)" icon="external-link" href="https://www.servicenow.com/docs/r/api-reference/rest-apis/c_TableAPI.html" horizontal />

  <Card title="Import Set API (REST)" icon="external-link" href="https://www.servicenow.com/docs/r/api-reference/rest-apis/c_ImportSetAPI.html" horizontal />

  <Card title="Service Catalog API (REST)" icon="external-link" href="https://www.servicenow.com/docs/r/api-reference/rest-apis/c_ServiceCatalogAPI.html" horizontal />

  <Card title="Updating records using coalesce" icon="external-link" href="https://www.servicenow.com/docs/r/integrate-applications/system-import-sets/c_ImportSetCoalesce.html" horizontal />
</Columns>

## API posture

| Aspect         | Detail                                                                                                                                                                                                                                                                   |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Authentication | OAuth 2.0 or basic auth against a dedicated integration user flagged web-service-access-only, with a scoped least-privilege role plus snc\_platform\_rest\_api\_access. Inbound client-credentials grant requires enabling it on the instance (Washington DC and later). |
| Style          | REST, JSON or XML (Table API, Import Set API, Service Catalog API)                                                                                                                                                                                                       |
| Base URL       | https\://\{instance}.service-now\.com/api                                                                                                                                                                                                                                |
| Webhooks       | None native. Outbound events are customer-built Business Rules calling RESTMessageV2 asynchronously: at-most-once delivery, so reconciliation polling on sys\_updated\_on is the correctness mechanism, not a fallback.                                                  |
| Events posture | Webhooks and polling                                                                                                                                                                                                                                                     |
| Rate limits    | Per-instance inbound REST rate limits and concurrency semaphores (instance-configurable); asynchronous outbound waits are capped at 30 seconds (glide.http.outbound.max\_timeout).                                                                                       |
| Objects        | task (correlation\_id), sc\_request, sc\_req\_item, sn\_hr\_core\_case, import set staging tables                                                                                                                                                                        |

## Publish target and field mapping

Each object below pairs the canonical intent fields with the destination's own fields and operations. The mapping is indicative until it is confirmed against a tenant at onboarding.

<AccordionGroup>
  <Accordion title="Record (via Import Set)" icon="arrow-right-left" description="Idempotent create-or-update">
    | Mapping                  | Detail                                                                                                              |
    | ------------------------ | ------------------------------------------------------------------------------------------------------------------- |
    | Canonical to destination | role\_title, description, requested\_for, cost\_center, dates                                                       |
    | Target                   | POST /api/now/import/\{staging\_table} → transform map                                                              |
    | Requirement              | Required                                                                                                            |
    | Notes                    | The transform map coalesces on correlation\_id: a replayed publish updates the existing record, never duplicates it |
  </Accordion>

  <Accordion title="Intent ID correlation" icon="arrow-right-left" description="Carry the Intent ID">
    | Mapping                  | Detail                                                                                                                       |
    | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
    | Canonical to destination | intent\_id, intent\_version                                                                                                  |
    | Target                   | correlation\_id on the target task record                                                                                    |
    | Requirement              | Required                                                                                                                     |
    | Notes                    | Standard task-table field for external-system identifiers (string, max 100); index it in the tenant for reconciliation reads |
  </Accordion>

  <Accordion title="Catalog request" icon="arrow-right-left" description="Order a catalog item">
    | Mapping                  | Detail                                                                                                                          |
    | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
    | Canonical to destination | catalog\_item, variables\{}                                                                                                     |
    | Target                   | POST /api/sn\_sc/servicecatalog/items/\{sys\_id}/order\_now                                                                     |
    | Requirement              | Tenant required                                                                                                                 |
    | Notes                    | Catalog variables live in sc\_item\_option / sc\_item\_option\_mtom: never insert sc\_req\_item rows directly via the Table API |
  </Accordion>

  <Accordion title="Record read-back" icon="arrow-right-left" description="Read for reconciliation">
    | Mapping                  | Detail                                                                                                 |
    | ------------------------ | ------------------------------------------------------------------------------------------------------ |
    | Canonical to destination | state, assignment\_group, sys\_updated\_on                                                             |
    | Target                   | GET /api/now/table/\{table}?sysparm\_query=correlation\_id=\{intent\_id}                               |
    | Requirement              | Required                                                                                               |
    | Notes                    | Poll-first: outbound Business Rules are at-most-once, so drift detection reads back by correlation\_id |
  </Accordion>
</AccordionGroup>

<Note>
  Each ServiceNow instance is a separate tenant with its own tables, ACLs and transform maps. A scoped custom table extending task changes the customer's App Engine licensing position under ServiceNow's Custom Table Guide: verify the entitlement (paid Store apps carry their own tables' entitlement) before committing to a table design. ACLs fail silently on field reads: a publish can 201 while individual fields were dropped, which preflight must catch.
</Note>

## Next steps

<Columns cols={3}>
  <Card title="How composerID connects" icon="plug-zap" href="/guides/connect">
    The five ways composerID reaches a destination, and the minimum a destination must offer.
  </Card>

  <Card title="Publishing" icon="send" href="/concepts/publishing">
    Plan, preflight and publish: how a decision becomes a valid record in a destination.
  </Card>

  <Card title="All destinations" icon="plug" href="/destinations">
    Every destination composerID documents, with its category and coverage status.
  </Card>
</Columns>
