---
title: "Complete onboarding request (S2S only)"
method: POST
path: "/v1/internal/requests/{id}/complete"
tags: ["internal-requests"]
---

# Complete onboarding request (S2S only)

`POST /v1/internal/requests/{id}/complete`

Transitions request status to completed. Optionally change assignee via assignee_email parameter (omit to keep existing assignee, empty string to unassign, or provide valid email to reassign).

## Path parameters

- `id` string, required

## Request body

- InternalCompleteRequestReqDTO
  - `accountID` string
  - `adminID` string
  - `assignee_email` string — AssigneeEmail is optional. If provided: - Empty string ("") or null: unassigns the request (sets AssigneeEmail to nil) - Valid email: assigns the request to that email If not provided (nil): keeps existing assignee unchanged (backward compatible)
  - `id` string, required

## Response `200`

OK

- object — Standard response containing data and its metadata if any
  - `data` RequestResDTO
    - `account_id` string — AccountID is required only for Client auth mode, it can be empty for S2S mode
    - `assigned_at` string
    - `assignee_email` string
    - `audit_history` RequestAuditLogResDTO[] — Audit trail - populated when fetching single request details
      - `action_type` string — assigned, unassigned, reassigned, status_changed, field_updated
      - `actor` string — Who performed the action (from JWT admin_id)
      - `created_at` string
      - `field_name` string — Which field was changed
      - `id` string
      - `new_value` string — Value after change (empty for removal)
      - `note` string — Optional human-readable note
      - `previous_value` string — Value before change (empty for initial)
      - `request_id` string
    - `cancelled_at` string
    - `changes` object — Changes gives an old/new view per submitted kyb_data field for account_update requests: old is the organization's current value (fetched live from Core API), new is the submitted value. Populated on the internal detail endpoint only.
    - `completed_at` string
    - `created_at` string
    - `declined_at` string
    - `id` string
    - `internal_note` string
    - `kam_ids` string[]
    - `kyb_data` integer[]
    - `organization_data` integer[]
    - `pending_clarification_at` string
    - `processed_at` string
    - `product_code` string
    - `request_type` string, required
    - `requester_id` string, required
    - `status` string
    - `submitted_at` string
    - `updated_at` string
  - `has_more` boolean

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `404` — Not Found
- `500` — Internal Server Error

---

[API](https://skmtc.net/paymongo/apis/paymongo-api.md) · [All operations](https://skmtc.net/paymongo/apis/paymongo-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/paymongo/paymongo-api/revisions/c18f9a027b2c/schema)
