---
title: "Log a content depiction"
method: POST
path: "/api/v1/solo-accounts/{accountId}/content"
tags: ["Solo Accounts"]
---

# Log a content depiction

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

## Request

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

Registers a piece of content against a verified performer's Easy2257 identity record, creating the cross-reference index required by 28 CFR 75.2 and the per-depiction trail behind 18 U.S.C. § 2257(b)(1). Instrument this call and alert on failure: a silent non-2xx means a published depiction has no record of custody. Idempotent on `externalContentId`, falling back to `contentUrl` when you do not send one. Declare the compliance copy (`complianceCopy`) on this call: Easy2257 keeps a reduced copy of every depiction it records (28 CFR 75.2(a)(1)(iii)). PUT the file to `complianceCopyUpload.url`, then confirm with `POST .../content/{externalContentId}/compliance-copy`.

## Path parameters

- `accountId` string, required

## Request body

- LogContentBody
  - `contentUrl` string, uri, required: Required. Canonical URL where the content is hosted. Stored as the per-depiction audit trail.
  - `title` string, required: Required. Human-readable title. Appears in the Easy2257 records view and the compliance archive.
  - `contentType` string: Media type of the depiction, stored as a label on the record. Defaults to `video`. Use `video`, `image`, `audio`, or `other`: those are the four values Easy2257's own views and reports expect. This field is not validated against that list today, so a value outside it is stored exactly as you sent it rather than rejected, and it will read as an unknown type wherever the record is displayed. Treat the four as a contract with your own future self.
  - `externalContentId` string: Your own content id, and the idempotency key: re-logging the same id returns the existing record. Always send it. It is the only handle you can later address for a takedown, and a depiction logged without one cannot be removed through the API.
  - `platform` string: Optional label. Defaults to your partner company name.
  - `productionDate` string, date-time: Optional. Defaults to now. This date starts the 7-year retention clock for the record.
  - `fileHash` string: Optional but recommended. SHA-256 hex digest of the file, which is what satisfies 28 CFR 75.2(f) record integrity.
  - `complianceCopy` object: The reduced copy Easy2257 keeps as the copy of the depiction. Required for platform-plan partners (400 `COMPLIANCE_COPY_REQUIRED` without it). After the create call, PUT the file to `complianceCopyUpload.url` with the given `Content-Type`, then call the compliance-copy confirm endpoint.
    - `mimeType` 'image/jpeg' | 'image/png' | 'image/webp' | 'video/mp4' | 'video/webm' | 'video/quicktime', required: Type of the reduced rendition you will upload.
    - `sizeBytes` integer, required: Exact byte length of that rendition. Images up to 5 MB, video up to 500 MB. The upload URL is bound to this length; a PUT of a different length is rejected by storage.

## Response `200`

Already logged. Existing record returned, nothing created.

- object: Replay of an already-logged depiction. Note there is no `createdAt` on this shape.
  - `contentLogId` string, required
  - `depictionId` string, required
  - `duplicate` true, required: Always true on this response. The existing record was returned and nothing new was created.
  - `complianceCopy` 'stored' | 'pending' | 'missing', required: `stored`: verified and hashed by Easy2257. `pending`: declared, upload not yet confirmed. `missing`: not declared (JuicyStarz pipeline only; platform-plan partners must declare).
  - `complianceCopyUpload` object, nullable, required: A fresh upload URL while the existing record's copy is still `pending` (the first one lasts 15 minutes); `null` otherwise.
    - `url` string, uri, required: Presigned PUT URL, valid 15 minutes.
    - `method` 'PUT', required
    - `headers` object, required: Send exactly these headers with the PUT.
      - `Content-Type` string, required
    - `expiresAt` string, date-time, required
    - `maxBytes` integer, required: The declared length.

## Other responses

- `201`: Depiction logged.
- `400`: `contentUrl` or `title` missing, `contentUrl` not a valid URL, or `complianceCopy` missing for a platform-plan partner or malformed (`code` `COMPLIANCE_COPY_REQUIRED`).
- `401`: No `Authorization: Bearer` header, or a key that is unknown, revoked, or expired. The body carries only `error`, never a `code`.
- `402`: The copy would take the creator's account past its depiction-copy storage allowance (`code` `STORAGE_ALLOWANCE_EXCEEDED`). Send a smaller rendition.
- `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, or it belongs to another partner.
- `409`: Three codes, and they do not share a remedy, so switch on `code` rather than on the status. `CONSENT_PENDING` (the creator has been asked to approve the link to your platform and has not answered) and `CONSENT_DECLINED` (they refused): treat both as "not publishable yet" and hold the content. `uploader_not_solo_active`: the creator's own Easy2257 account is no longer active, so there is no verified identity record to attach the depiction to. Retrying will not clear this one. Send the creator back through onboarding, then log the content.
- `422`: The account exists but has no linked Easy2257 user yet, so there is no identity record to attach the depiction to.
- `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)
