Track media coverage
Record a clipping, retain its UUID, and update coverage without duplicating records or confusing it with story publication.
Coverage records media mentions such as online articles, print clippings, and broadcasts. A coverage entry can refer to a newsroom, story, author, or organization. It is separate from publishing a story or sending a campaign.
Load your credential into PREZLY_API_TOKEN. Personal tokens need coverage:read for reads, both coverage:write and contacts:write for create/update, and coverage:write for delete. The account also needs the corresponding newsroom-data permissions. Create/update require the contact scope even when your example does not supply a contact: enrichment and contact resolution can create CRM records.
Read before importing
curl --fail-with-body --silent --show-error --get 'https://api.prezly.com/v2/coverage' \
--header "Authorization: Bearer $PREZLY_API_TOKEN" \
--header 'Accept: application/json' \
--data-urlencode 'limit=20' \
--data-urlencode 'offset=0' \
--data-urlencode 'sort=-published_at'The list response contains a coverage array, pagination, and sort. Follow pagination; the first page is not the whole collection. Retain each record's uuid and your import source's identity. A detail response instead contains one object under coverage:
curl --fail-with-body --silent --show-error 'https://api.prezly.com/v2/coverage/YOUR_COVERAGE_UUID' \
--header "Authorization: Bearer $PREZLY_API_TOKEN" \
--header 'Accept: application/json'List coverage → · Get coverage →
Record a clipping
Save this as coverage-create.json, replacing the newsroom UUID, source identifier, and clipping details:
{
"type": "print",
"headline": "Acme opens its new studio",
"newsroom": "YOUR_NEWSROOM_UUID",
"external_reference_id": "press-monitor:clipping-123",
"published_at": "2026-10-22T08:00:00Z",
"page": 12,
"note_content": { "text": "Interview in the October print edition of Example Magazine." }
}curl --fail-with-body --silent --show-error --request POST 'https://api.prezly.com/v2/coverage' \
--header "Authorization: Bearer $PREZLY_API_TOKEN" \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-binary @coverage-create.jsonNew entries return 201 Created with coverage; store coverage.uuid. The current validator requires type: online, social, print, radio, or television. A headline alone is insufficient: include a URL, attachment, note, PDF URL, or management URL. Uploaded attachments use the representations in Images and files.
For online/social/radio/television coverage, a minimal payload containing only type and url can reuse an existing exact URL in the account and return 200 OK, without applying a general update. That reuse also applies when the only additional fields explicitly set author and/or organisation to null. Adding a headline or other metadata changes this behavior; do not treat all POSTs as upserts. URL enrichment can fetch metadata and create author/organization contacts. Review the returned associations.
external_reference_id must be unique within the account when supplied; a duplicate produces 409, rather than updating the earlier entry. Persist the returned UUID and reconcile an uncertain creation before retrying. If you supply both story and newsroom, they must refer to the same destination; a mismatch returns 409.
Use integer IDs or single-key {"id":123} wrappers for author, organisation, and story. For contact references, a string such as "123" is a name, not an ID, and can create a CRM contact. Name wrappers can include a URL or social accounts for matching. Use the request schema for supported forms, and inspect the returned contacts before continuing. A story reference accepts an integer ID or ID wrapper, never a name or UUID.
Update or retire the stored record
PATCH changes selected fields and preserves omitted ones. For example:
curl --fail-with-body --silent --show-error --request PATCH 'https://api.prezly.com/v2/coverage/YOUR_COVERAGE_UUID' \
--header "Authorization: Bearer $PREZLY_API_TOKEN" \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data '{"headline":"Acme studio opening — print interview"}'The response is 200 OK with coverage. Read before editing associations; moving a clipping between newsrooms or changing its story must keep the pair aligned. The request accepts plain-text notes through note_content: { text: "…" } or serialized note content.
To retire an identified entry:
curl --fail-with-body --silent --show-error --request DELETE 'https://api.prezly.com/v2/coverage/YOUR_COVERAGE_UUID' \
--header "Authorization: Bearer $PREZLY_API_TOKEN" \
--header 'Accept: application/json'Deletion returns 204 No Content; do not parse JSON. It removes the active coverage record, not the external publication or related CRM contacts. API acceptance does not mean background indexing, screenshots, or related counters have finished. See Handling errors for deliberate retries.