# Update the organization's onboarding intent (skip/dismiss).

`PATCH https://api.suger.cloud/org/{orgId}/onboarding/info`

Updates the Get Started checklist intent for the organization. Only skippedSteps and dismissed are writable; omitted fields are left unchanged, and a body carrying any other field is rejected with 400.

skippedSteps is a FULL REPLACEMENT array, not a delta: whatever you send becomes the complete set of skipped steps, and omitting a step un-skips it. Build it from the skippedSteps array that GetOnboardingStatus returns — that field is the raw persisted intent, and rebuilding the array from the visible step states instead silently erases intent hidden behind steps that have since completed. Valid values are crm and notification.

The update is organization-scoped: any member's change applies to the whole organization, and there is no optimistic-concurrency check — the last write wins. Read with GetOnboardingStatus, modify, then write in one exchange; a copy held across another member's write is stale. Available for seller organizations; buyer, reseller and partner organizations receive 404.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgId` | path | string | yes | Organization ID |

## Request Body

Required.

Content-Type: `application/json` · Schema: `UpdateOnboardingInfoParams`

**`UpdateOnboardingInfoParams`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `dismissed` | boolean | no | Set or clear the org-scoped checklist dismissal. |
| `skippedSteps` | array<string> | no | Full replacement list of skipped step keys. Valid values: "crm", "notification". |

## Responses

### 200 — Success

Content-Type: `application/json` · Schema: `OnboardingInfo`

**`OnboardingInfo`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `dismissed` | boolean | no | Org-scoped checklist dismissal. |
| `orgReady` | NotificationLease | no |  |
| `readinessNotified` | object | no | Backend-owned. Keyed by identity.integration.id. |
| `skippedSteps` | array<string> | no | Org-scoped user intent: any member's skip applies to the org. Valid values: "crm", "notification". |

**`NotificationLease`** fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `claimedAt` | string | no |  |
| `sentAt` | string | no |  |

### 400 — Invalid step key, or a backend-owned field was present in the body

Content-Type: `application/json`

### 404 — Organization not found, or not a seller organization

Content-Type: `application/json`

### 500 — Internal server error

Content-Type: `application/json`

## Example

_Generated from this operation's schema. Values are placeholders — substitute your own ids, and set `SUGER_TOKEN` to a bearer token from the [OAuth client-credentials exchange](https://doc.suger.io/get-started/oauth-app/)._

### Request

```bash
curl -X PATCH 'https://api.suger.cloud/org/{orgId}/onboarding/info' \
  -H 'Authorization: Bearer $SUGER_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "dismissed": true,
  "skippedSteps": [
    "string"
  ]
}'
```

### Response — 200

```json
{
  "dismissed": true,
  "orgReady": {
    "claimedAt": "2026-01-31T12:00:00Z",
    "sentAt": "2026-01-31T12:00:00Z"
  },
  "readinessNotified": {},
  "skippedSteps": [
    "string"
  ]
}
```

### Error — 400

```json
"string"
```

---

Interactive API reference: https://doc.suger.io/api/
