---
title: "Push a batch of customer contact records from SAP BTP"
method: POST
path: "/v2/integrations/providers/sap-btp/contacts"
tags: ["integrations"]
---

# Push a batch of customer contact records from SAP BTP

`POST /v2/integrations/providers/sap-btp/contacts`

## Request

- Base URL: `https://api.stuut.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.stuut.ai/v2/integrations/providers/sap-btp/contacts`
- Auth: HTTP bearer

Maximum 100 records per request. Each contact is upserted by ``id``
under the customer named by ``customer_id``.

## Request body

- union[]
  - union
    - ContactPayload: Standard contact with an explicit stable ID and parent customer ID. Updates preserve omitted optional fields; explicit nulls clear them. Supplied name components together replace the display name.
      - `custom_fields` object, nullable: Source-specific values without a standard field.
      - `id` string, required
      - `customer_id` string, required
      - `name` string, nullable
      - `given_name` string, nullable
      - `family_name` string, nullable
      - `email` string, nullable
      - `phone` string, nullable
      - `job_title` string, nullable
    - SapBtpContactPayload: Contact record in the existing Honeywell iFlow format. Updates preserve omitted optional fields; explicit nulls clear them. Without an explicit id, givenName carries the SAP Contact Person ID, except for the clerk internet label. It is not a display-name component. Supplied name components together replace the display name.
      - `id` string, nullable: KNVK-PARNR; contact person number from SAP
      - `customer_number` string, required: KNVK-KUNNR; must match a previously pushed customer_number
      - `given_name` string, nullable: SAP Contact Person ID when id is absent; clerk internet label is reserved
      - `family_name` string, nullable: KNVK-NAME1; last name
      - `email` string, nullable: ADR6-SMTP_ADDR
      - `phone` string, nullable: ADR2-TEL_NUMBER; Stuut parses using parent customer's country
      - `custom_fields` object, nullable: Flexible key-value pairs; e.g. company_code

## Response `200`

Successful Response

- SapBtpInboundResponse: Common envelope for processing results and request-level errors. Request-level errors retain their HTTP status and return one failed result with an empty remote_id. No unauthenticated body is parsed to identify records. Validation failures retain their per-record results. Server errors expose a generic message; their exception reporting remains with the API.
  - `received_at` string, date-time, required
  - `results` SapBtpRecordResult[], required
    - `remote_id` string, required
    - `success` boolean, required
    - `stuut_id` string, nullable, required
    - `error_code` string, nullable, required
    - `message` string, nullable, required

## Other responses

- `401`: Missing or invalid bearer token.
- `403`: Access denied.
- `413`: Batch exceeds the record limit.
- `422`: Batch rejected; no records processed.
- `429`: Rate limit exceeded.
- `500`: Internal server error.
- `default`: Request failed.

---

[API](https://skmtc.dev/stuut/apis/stuut-api.md) - [All operations](https://skmtc.dev/stuut/apis/stuut-api/llms.txt) - [OpenAPI document](https://skmtc.dev/stuut/apis/stuut-api/revisions/ff0ad16a55ff?raw)
