---
title: "Accept the latest pending submission (default workspace only; org.write_data)"
method: POST
path: "/supplier-portal/requests/{requestId}/submissions/{submissionId}/accept"
tags: ["Supplier portal"]
---

# Accept the latest pending submission (default workspace only; org.write_data)

`POST /supplier-portal/requests/{requestId}/submissions/{submissionId}/accept`

Writes the supplier's SBTi status and energy instruments to Net Zero as the supplier portal (source supplier_portal, suppliedBy the contact's email) and records the supplier-provided figure. Every answer is checked first (the request's active sites and supply points, Net Zero's field rules); a refusal writes nothing and answers 400 VALIDATION_ERROR with details.fields [{path, code}]. A figure over a period overlapping one already accepted for the supplier is 409 OVERLAPPING_PERIOD. A submitted request stays reviewable after its expiry. A retry after a failure part-way updates the Net Zero rows already written instead of duplicating them. 409 codes: INVALID_STATE (not the latest pending submission of a submitted request), OVERLAPPING_PERIOD, REVIEW_IN_PROGRESS (another accept, return or cancel of this request, or another accept for this supplier, is running; nothing was written), WORKSPACE_SCOPE_UNSUPPORTED.

## Path parameters

- `requestId` string, required
- `submissionId` string, required

## Response `200`

The accepted request

- SupplierPortalRequestResponse
  - `data` SupplierPortalRequestDetail, required
    - `acceptedAt` string, date-time, nullable, required
    - `cancelledAt` string, date-time, nullable, required
    - `contactEmail` string, required
    - `contactName` string, required
    - `dueDate` string, date, nullable, required
    - `emailStatus` 'pending' | 'sent' | 'logged' | 'failed' | 'self', required — Outcome of GreenTally's email: pending, sent, logged (no relay configured) or failed; "self" when the customer sent the link from their own mailbox (no email from Core). After a self reminder it still describes the last GreenTally email.
    - `expiresAt` string, date-time, required
    - `id` string, required
    - `lastRemindedAt` string, date-time, nullable, required
    - `nextReminderAt` string, date-time, nullable, required — Earliest time a GreenTally reminder may go out: one calendar month after the last email GreenTally sent (the initial send or a reminder; self-delivered sends do not count). When GreenTally sent none it is the request's sentAt, so a reminder is allowed now. Null when the stored status takes no reminder (submitted, accepted, cancelled). May lie in the past, meaning a reminder is allowed now. A self reminder is never capped.
    - `openedAt` string, date-time, nullable, required
    - `pendingSubmissionId` string, required — Empty unless the latest submission awaits review.
    - `periodEnd` string, date, required
    - `periodStart` string, date, required
    - `reminderCount` integer, required
    - `sections` SupplierPortalSections, required
      - `activityData` boolean, required
      - `allocation` boolean, required
      - `evidenceFiles` boolean, required
      - `productFootprint` boolean, required
      - `sbtiStatus` boolean, required
    - `sentAt` string, date-time, required
    - `status` 'sent' | 'opened' | 'submitted' | 'returned' | 'accepted' | 'cancelled' | 'expired', required
    - `submittedAt` string, date-time, nullable, required
    - `supplierId` string, required
    - `supplierName` string, required
    - `files` SupplierPortalFile[], required
      - `contentType` string, required
      - `fileName` string, required
      - `id` string, required
      - `sizeBytes` integer, required
      - `uploadedAt` string, date-time, required
    - `leftoverNetZeroRows` SupplierPortalLeftoverRows
      - `instruments` integer, required
      - `sbti` boolean, required
    - `message` string, required
    - `sites` SupplierPortalSite[], required
      - `id` string, required
      - `name` string, required
      - `supplyPoints` string[], required
    - `submissions` SupplierPortalSubmission[], required
      - `answers` SupplierPortalAnswers, required — The questionnaire answers (supplierportal.Answers); validated in Go.
      - `id` string, required
      - `reviewComment` string, required
      - `reviewStatus` 'pending' | 'accepted' | 'returned', required
      - `reviewedAt` string, date-time, nullable, required
      - `reviewedBy` string, required
      - `submittedAt` string, date-time, required
      - `version` integer, required

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `409` — Conflict

## Changes

- **2026-10-05** `04eabb8ebb47` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/greentally/apis/esgai-api/changes/supplier-portal/requests/:requestId/submissions/:submissionId/accept/post.md)

---

[API](https://skmtc.dev/greentally/apis/esgai-api.md) · [All operations](https://skmtc.dev/greentally/apis/esgai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/greentally/apis/esgai-api/revisions/461a0ebc7731?raw)
