---
title: "Confirm the compliance copy"
method: POST
path: "/api/v1/solo-accounts/{accountId}/content/{externalContentId}/compliance-copy"
tags: ["Solo Accounts"]
---

# Confirm the compliance copy

`POST /api/v1/solo-accounts/{accountId}/content/{externalContentId}/compliance-copy`

## Request

- Base URL: `https://easy2257.com`
- URL: `https://easy2257.com/api/v1/solo-accounts/{accountId}/content/{externalContentId}/compliance-copy`
- Auth: HTTP bearer

After you PUT the rendition to `complianceCopyUpload.url`, call this. Easy2257 verifies the object against the declared size and type, hashes it and records it, then fires `content_log.copy_stored`. Idempotent: confirming a stored copy returns the recorded facts. The path segment is your `externalContentId`; the `depictionId` from the create response is accepted in its place. No bytes travel through this endpoint and the Partner API never returns a copy: you hold your own original.

## Path parameters

- `accountId` string, required
- `externalContentId` string, required

## Response `200`

Copy stored, or already stored.

- ComplianceCopyConfirmResponse
  - `depictionId` string, required
  - `contentLogId` string, required
  - `complianceCopy` object, required
    - `state` 'stored', required
    - `sha256` string, required: Computed by Easy2257 from the stored copy; not the `fileHash` you sent on the create call.
    - `bytes` integer, required
    - `mimeType` string, required
    - `storedAt` string, date-time, required

## Other responses

- `400`: No copy was declared for this depiction (`code` `NOT_DECLARED`). Declare it on the create call.
- `401`: No `Authorization: Bearer` header, or a key that is unknown, revoked, or expired. The body carries only `error`, never a `code`.
- `403`: Rejected before the handler: a test-mode key (`TEST_MODE_UNAVAILABLE`) or a partner account that is not ACTIVE. Never used for cross-partner access, which returns 404.
- `404`: No such account for this partner, or no content under that key for this account.
- `409`: Three different situations, and only one of them wants a new create call. `NOT_UPLOADED`: the PUT has not landed, or its URL expired. The response carries a fresh `complianceCopyUpload`. Retry the PUT against that URL and call this endpoint again. Do NOT log the content a second time: the depiction already exists and re-logging it puts a duplicate in the custody record. `SIZE_MISMATCH` or `TYPE_MISMATCH`: the object did not match what you declared and was discarded. These two are the ones that need a new create call, declaring the real size and type, followed by a fresh upload. `CONTENT_REMOVED`: the depiction was taken down, and its copy can no longer be confirmed. Nothing to retry.
- `429`: Rate limit exceeded: 300 requests per 60 seconds per API key, shared across all `/api/v1` endpoints (requests without a `Bearer` key fall back to 60 per 60 seconds per client IP, and a per-address flood ceiling of 1200 per 60 seconds also applies). Honor `Retry-After`.
- `500`: Server error. Retry with exponential backoff.

---

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