Nuvelics documentation
APIAPI reference

Stories

Read stories with their research, follow and repeat their enrichment, push them to your newsroom system, and manage their photos and dismissed items.

List stories (paginated)

GET
/api/tenant/v1/stories

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Query Parameters

limit?integer

Maximum items per page (1–100, default 25)

Range1 <= value <= 100
Default25
cursor?string

Opaque cursor from a prior nextCursor

include?|array<string>

Repeat for each sideload, each keyed by story id under included: contributingPublishers (the sources chip) and signals (the row signals: NRCS state, key claims, story checks, outputs). Omitted by default, so the ordinary list pays no extra query.

Response Body

A page of stories, most recent activity (updatedAt) first

application/json
  1. response
items*array<>
pagination*
sort*
filters*
facets?

Value/count breakdown for each field requested via ?facets=. Present only when facets were requested.

included?
Example Request
curl -X GET 'https://api.nuvelics.com/api/tenant/v1/stories'
Example Response
{  "items": [    {      "id": "string",      "orgId": "string",      "source": "pitch",      "newsdeskId": "string",      "pitchId": "string",      "title": "string",      "summary": "string",      "whyItMatters": "string",      "contentLanguage": "string",      "enrichmentStatus": "pending",      "enrichmentAttempts": 0,      "lastEnrichmentError": "string",      "origin": "string",      "nrcsDropped": "archived",      "enrichedContentSha": "string",      "storyType": "PLANNED",      "lifecyclePhase": "DEVELOPING",      "phaseEnteredAt": "2019-08-24T14:15:22Z",      "sequenceNumber": 0,      "createdAt": "2019-08-24T14:15:22Z",      "updatedAt": "2019-08-24T14:15:22Z"    }  ],  "pagination": {    "nextCursor": "string"  },  "sort": {    "applied": "string",    "default": "string",    "available": [      "string"    ]  },  "filters": {    "applied": {      "property1": null,      "property2": null    },    "available": [      {        "field": "string",        "kind": "string",        "facetable": true      }    ]  },  "facets": {    "property1": {      "values": [        {          "value": "string",          "count": 0        }      ],      "capped": true    },    "property2": {      "values": [        {          "value": "string",          "count": 0        }      ],      "capped": true    }  },  "included": {    "contributingPublishers": {      "property1": {        "publishers": [          {            "publisherKey": "string",            "name": "string",            "iconUrl": "string"          }        ],        "sourceCount": 0      },      "property2": {        "publishers": [          {            "publisherKey": "string",            "name": "string",            "iconUrl": "string"          }        ],        "sourceCount": 0      }    },    "signals": {      "property1": {        "nrcs": {          "state": "string",          "externalUpdatedAt": "2019-08-24T14:15:22Z",          "hydrated": true        },        "keyClaims": {          "state": "confirmed",          "counts": {            "confirmed": 0,            "unverified": 0,            "contested": 0          }        },        "checks": {          "flagged": 0,          "state": "current"        },        "outputs": [          {            "id": "string",            "type": "web_article",            "status": "pending",            "needsAttention": true          }        ]      },      "property2": {        "nrcs": {          "state": "string",          "externalUpdatedAt": "2019-08-24T14:15:22Z",          "hydrated": true        },        "keyClaims": {          "state": "confirmed",          "counts": {            "confirmed": 0,            "unverified": 0,            "contested": 0          }        },        "checks": {          "flagged": 0,          "state": "current"        },        "outputs": [          {            "id": "string",            "type": "web_article",            "status": "pending",            "needsAttention": true          }        ]      }    }  }}
GET
/api/tenant/v1/stories/enrichment-summary

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Query Parameters

bucket*string
Value in"day""month"
groupBy?"newsdesk"
Value in"newsdesk"

Response Body

The caller's own org's enrichment runs bucketed by day or month, optionally grouped by newsdesk

application/json
  1. response
rows*array<>
capped*boolean
Example Request
curl -X GET 'https://api.nuvelics.com/api/tenant/v1/stories/enrichment-summary?bucket=day'
Example Response
{  "rows": [    {      "bucket": "string",      "key": "string",      "count": 0    }  ],  "capped": true}
GET
/api/tenant/v1/stories/{id}

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Response Body

The story with its seven enrichment blocks

application/json
  1. response
id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
orgId*string

Owning organization identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
source?string

Where the story came from: an approved pitch or the newsroom system (NRCS)

Default"pitch"
Value in"pitch""nrcs"
newsdeskId*string

Owning newsdesk; null for a story minted from the NRCS, which has no pitch

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
pitchId*string

Minting pitch; null for a story minted from the NRCS

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
title*string

Story title, inherited from the minting pitch or kept in sync from the NRCS record

summary*string

The story's summary: the minting pitch's, read through at request time, or the NRCS story's own

whyItMatters*string

The story's rationale: the minting pitch's, read through at request time, or the NRCS story's own

contentLanguage?string

Language code of the story's content; present only on an NRCS story (a pitch story's lives on its pitch)

enrichmentStatus*string

Claim-loop status of the enrichment worker

Value in"pending""running""enriched""failed"
enrichmentAttempts*integer

Transient-failure retry count; enrichment_status lands failed once this hits the ceiling

Range0 <= value
lastEnrichmentError?string

Failure reason from the most recent enrichment run; present only when enrichmentStatus is failed and a run captured an error (absent for failures predating this field or terminal retry-ceiling failures with no captured run error)

origin?string

Where the story came from: engine for a pitch the engine generated, manual for a pitch a person created, or the vendor of the NRCS record (for example saga) for a story minted from the NRCS. Derived on read; present on list and detail reads

nrcsDropped?string

Why the newsroom system dropped this story, archived or deleted; null while it is live and always null for a pitch story. Present on list and detail reads. A dropped story refuses new and regenerated outputs and leaves the default list

Value in"archived""deleted"null
enrichedContentSha?string

Digest of the NRCS text the story's enrichment was last computed from; null until an NRCS story is first enriched and always null for a pitch story. Present on a detail read. Compared with an NRCS record's contentSha to tell whether the enrichment is outdated

storyType*string

SOM story_type, stored verbatim

Value in"PLANNED""ACTIVE""KILLED""SPIKED""ARCHIVED""ORPHAN"
lifecyclePhase?string

SOM lifecycle_phase; present if and only if storyType is ACTIVE

Value in"DEVELOPING""READY_TO_AIR""BREAKING""PUBLISHED"
phaseEnteredAt?string

ISO 8601 timestamp the story entered its current lifecycle phase

Formatdate-time
sequenceNumber*integer

Monotonic SOM sequence_number, bumped on every consumer-ordered mutation

Range0 <= value
createdAt*string

ISO 8601 creation timestamp

Formatdate-time
updatedAt*string

ISO 8601 timestamp of the most recent update

Formatdate-time
sources*array<>

Both source origins: frozen originals plus research-discovered additional sources

meaning?

5W1H meaning block; absent until the story has been enriched

factCheck?

Overall fact-check assessment; absent until the story has been enriched

claims*array<>

Key claims with fact-check status and cited sources; empty until enriched

entities*array<>

Key entities; empty until enriched

timeline*array<>

Chronologically ordered story events; empty until enriched

quotes*array<>

Key quotes in rank order, dismissed ones included and flagged; empty until enriched, and for a story enriched before quotes existed

media*array<>

Related media projected from the contributing articles; empty until enriched

ugcPosts*array<>

Candidate eyewitness/UGC posts surfaced by the UGC search step, dismissed ones included and flagged; empty until enriched

mamAssets*array<>

Photos and videos surfaced from the org's own MAM archive, dismissed ones included and flagged; empty until enriched, and empty for an org with no MAM connection

nrcsPushes*array<>

NRCS connections this story has been pushed to; empty until pushed at least once

nrcsRecords?array<>

The newsroom-system records behind this story, oldest first; present on GET /stories/{id}, empty for a pitch story never pushed

enrichmentPlan*

The research plan computed for this story's latest completed enrichment run; null for a pre-enrichment story or one enriched before this field existed

enrichmentFreshness?||

Where the story's enrichment stands (dropped, running, not_enriched, failed, outdated, no_sources, current); present on GET /stories/{id}

Example Request
curl -X GET 'https://api.nuvelics.com/api/tenant/v1/stories/string'
Example Response
{  "id": "string",  "orgId": "string",  "source": "pitch",  "newsdeskId": "string",  "pitchId": "string",  "title": "string",  "summary": "string",  "whyItMatters": "string",  "contentLanguage": "string",  "enrichmentStatus": "pending",  "enrichmentAttempts": 0,  "lastEnrichmentError": "string",  "origin": "string",  "nrcsDropped": "archived",  "enrichedContentSha": "string",  "storyType": "PLANNED",  "lifecyclePhase": "DEVELOPING",  "phaseEnteredAt": "2019-08-24T14:15:22Z",  "sequenceNumber": 0,  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z",  "sources": [    {      "id": "string",      "storyId": "string",      "origin": "original",      "articleId": "string",      "url": "string",      "title": "string",      "publisher": "string",      "publisherKey": "string",      "snippet": "string",      "excerpt": "string",      "publishedAt": "2019-08-24T14:15:22Z",      "fetched": true,      "position": 0,      "useAsMedia": true,      "articleAcquiredVia": "datasource",      "seedAddedAt": "2019-08-24T14:15:22Z",      "iconUrl": "string",      "recall": {        "kind": "kill",        "note": "string"      }    }  ],  "meaning": {    "who": "string",    "what": "string",    "when": "string",    "where": "string",    "why": "string",    "how": "string",    "summary": "string",    "confidence": 0  },  "factCheck": {    "assessment": "confirmed",    "summary": "string"  },  "claims": [    {      "claim": "string",      "status": "confirmed",      "note": "string",      "sourceIds": [        "string"      ],      "assertions": [        {          "sourceId": "string",          "value": "string",          "quote": "string",          "fragmentMatches": true        }      ]    }  ],  "entities": [    {      "type": "person",      "name": "string",      "description": "string",      "role": "string",      "isPrimary": true    }  ],  "timeline": [    {      "headline": "string",      "day": "2019-08-24",      "occurredAt": "2019-08-24T14:15:22Z",      "status": "confirmed",      "sourceIds": [        "string"      ]    }  ],  "quotes": [    {      "text": "string",      "original": {        "text": "string",        "language": "string"      },      "version": {        "kind": "rendering",        "text": "string",        "sourceId": "string",        "publisher": "string"      },      "spokenLanguage": "string",      "speaker": "string",      "speakerRole": "string",      "entity": "string",      "isPrimarySpeaker": true,      "context": "string",      "saidOn": "2019-08-24",      "kind": "spoken",      "origin": "passage",      "fragment": true,      "soundbite": {        "partUrl": "string",        "posterUrl": "string",        "startMs": 0,        "endMs": 0      },      "sourceIds": [        "string"      ],      "ugcPostUrl": "string",      "rank": 0,      "dismissed": true,      "dismissedVia": "quote"    }  ],  "media": [    {      "mediaType": "image",      "assetUrl": "string",      "posterUrl": "string",      "caption": "string",      "width": 0,      "height": 0,      "durationMs": 0,      "credit": "string",      "usageTerms": [        "string"      ],      "sourceArticleId": "string",      "assetId": "string",      "photoVendor": true,      "dismissed": true,      "dismissKey": "string"    }  ],  "ugcPosts": [    {      "source": "x",      "postUrl": "string",      "authorHandle": "string",      "authorName": "string",      "text": "string",      "postedAt": "2019-08-24T14:15:22Z",      "hasMedia": true,      "mediaType": "string",      "rank": 0,      "possibleReuse": true,      "possibleReuseNote": "string",      "dismissed": true    }  ],  "mamAssets": [    {      "mamConfigId": "string",      "itemId": "string",      "itemType": "image",      "title": "string",      "description": "string",      "mediaCreatedOn": "2019-08-24T14:15:22Z",      "durationMs": 0,      "whyRelevant": "string",      "matchedFields": [        "string"      ],      "thumbnailUrl": "string",      "thumbnailUrlExpiresAt": "2019-08-24T14:15:22Z",      "rank": 0,      "itemUrl": "string",      "dismissed": true    }  ],  "nrcsPushes": [    {      "id": "string",      "storyId": "string",      "orgId": "string",      "nrcsConfigId": "string",      "vendor": "string",      "externalId": "string",      "pushedBy": "string",      "pushedAt": "2019-08-24T14:15:22Z"    }  ],  "nrcsRecords": [    {      "id": "string",      "vendor": "saga",      "nrcsConfigId": "string",      "externalId": "string",      "entityType": "story",      "state": "string",      "assignedMemberIds": [        "string"      ],      "bodyText": "string",      "externalUrl": "string",      "contentSha": "string",      "status": "active"    }  ],  "enrichmentPlan": {    "research": "full",    "researchRule": "string",    "ugcSearch": "searched",    "ugcRule": "string",    "researchOutcome": "query-gen-failed",    "mamSearch": "searched",    "mamRule": "string",    "quotesRequested": true,    "quotesFailed": true,    "synthesisSections": [      "meaning"    ]  },  "enrichmentFreshness": {    "state": "dropped"  }}
GET
/api/tenant/v1/stories/{id}/checks

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Response Body

Every check applicable to the story, ordered by createdAt ascending (tie-broken by id), each carrying its current-content run and its last completed run; empty for a story with no NRCS record

application/json
  1. response
contentSha*string

SHA-256 hex digest of the story's current processable content

items*array<>
Example Request
curl -X GET 'https://api.nuvelics.com/api/tenant/v1/stories/string/checks'
Example Response
{  "contentSha": "string",  "items": [    {      "id": "string",      "name": "string",      "outputKind": "findings",      "currentRun": {        "status": "running",        "contentSha": "string",        "checkVersion": 0,        "completedAt": "2019-08-24T14:15:22Z",        "result": {          "verdict": "pass",          "findings": [            {              "severity": "inform",              "title": "string",              "detail": "string",              "excerpt": "string"            }          ],          "truncated": true        }      },      "lastCompletedRun": {        "status": "running",        "contentSha": "string",        "checkVersion": 0,        "completedAt": "2019-08-24T14:15:22Z",        "result": {          "verdict": "pass",          "findings": [            {              "severity": "inform",              "title": "string",              "detail": "string",              "excerpt": "string"            }          ],          "truncated": true        }      },      "awaitingRun": true    }  ]}
GET
/api/tenant/v1/stories/{id}/media/{itemId}

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
itemId*string

The vendor item id an ap-media: or afp: media reference the story shows

Length1 <= length <= 200

Response Body

The image behind an ap-media: or afp: reference of the story, fetched from the vendor with the datasource's own credential at view time

response?fileimage/*
Formatbinary
Example Request
curl -X GET 'https://api.nuvelics.com/api/tenant/v1/stories/string/media/string'
Example Response
"string"
GET
/api/tenant/v1/stories/{id}/enrichment

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Query Parameters

cursor?string

Opaque cursor from a previous response's logsCursor -- returns only log rows after it, so a poll doesn't re-fetch lines it already has. Omit to get the earliest rows of the run, up to limit. See the response's logsTruncated for whether more rows exist past what's returned.

limit?integer

Maximum log rows to return (server default when omitted, hard cap 1000). See the response's logsTruncated for whether more rows existed past this limit.

Range0 <= value <= 1000

Response Body

The latest enrichment run with its counters and log entries — the progress feed. run is null when the story has never been claimed yet.

application/json
  1. response
run*

The latest run, or null when the story has never been claimed

logs*array<>

Log rows the latest run has accumulated, oldest first — up to limit rows since the request's cursor (or since the start of the run when it carried none). See logsTruncated for whether more rows exist past what's returned here.

logsCursor*string

Opaque cursor for the last log row returned; feed it back as ?cursor= on the next poll to fetch only newer rows. Null when there is no run yet to bind a cursor to.

logsTruncated*boolean

True when more log rows existed past logs than the request's limit allowed — the next poll's cursor still picks up where this response left off, so a caller that never surfaces this flag just sees the rest arrive over subsequent polls.

Example Request
curl -X GET 'https://api.nuvelics.com/api/tenant/v1/stories/string/enrichment'
Example Response
{  "run": {    "id": "string",    "storyId": "string",    "attempt": 1,    "status": "running",    "model": "string",    "newsdeskVersion": 0,    "promptVersion": "string",    "startedAt": "2019-08-24T14:15:22Z",    "finishedAt": "2019-08-24T14:15:22Z",    "error": "string",    "queriesGenerated": 0,    "sourcesSearched": 0,    "sourcesFetched": 0,    "entitiesCount": 0,    "claimsCount": 0,    "mediaProjected": 0  },  "logs": [    {      "id": "string",      "runId": "string",      "occurredAt": "2019-08-24T14:15:22Z",      "step": "string",      "level": "info",      "message": "string"    }  ],  "logsCursor": "string",  "logsTruncated": true}
POST
/api/tenant/v1/stories/{id}/reenrich

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Response Body

Re-enrichment requested; the story returns to pending

application/json
  1. response
id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
orgId*string

Owning organization identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
source?string

Where the story came from: an approved pitch or the newsroom system (NRCS)

Default"pitch"
Value in"pitch""nrcs"
newsdeskId*string

Owning newsdesk; null for a story minted from the NRCS, which has no pitch

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
pitchId*string

Minting pitch; null for a story minted from the NRCS

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
title*string

Story title, inherited from the minting pitch or kept in sync from the NRCS record

summary?string

Story summary; present only on an NRCS story (a pitch story's lives on its pitch)

whyItMatters?string

Why the story matters; present only on an NRCS story (a pitch story's lives on its pitch)

contentLanguage?string

Language code of the story's content; present only on an NRCS story (a pitch story's lives on its pitch)

enrichmentStatus*string

Claim-loop status of the enrichment worker

Value in"pending""running""enriched""failed"
enrichmentAttempts*integer

Transient-failure retry count; enrichment_status lands failed once this hits the ceiling

Range0 <= value
lastEnrichmentError?string

Failure reason from the most recent enrichment run; present only when enrichmentStatus is failed and a run captured an error (absent for failures predating this field or terminal retry-ceiling failures with no captured run error)

origin?string

Where the story came from: engine for a pitch the engine generated, manual for a pitch a person created, or the vendor of the NRCS record (for example saga) for a story minted from the NRCS. Derived on read; present on list and detail reads

nrcsDropped?string

Why the newsroom system dropped this story, archived or deleted; null while it is live and always null for a pitch story. Present on list and detail reads. A dropped story refuses new and regenerated outputs and leaves the default list

Value in"archived""deleted"null
enrichedContentSha?string

Digest of the NRCS text the story's enrichment was last computed from; null until an NRCS story is first enriched and always null for a pitch story. Present on a detail read. Compared with an NRCS record's contentSha to tell whether the enrichment is outdated

storyType*string

SOM story_type, stored verbatim

Value in"PLANNED""ACTIVE""KILLED""SPIKED""ARCHIVED""ORPHAN"
lifecyclePhase?string

SOM lifecycle_phase; present if and only if storyType is ACTIVE

Value in"DEVELOPING""READY_TO_AIR""BREAKING""PUBLISHED"
phaseEnteredAt?string

ISO 8601 timestamp the story entered its current lifecycle phase

Formatdate-time
sequenceNumber*integer

Monotonic SOM sequence_number, bumped on every consumer-ordered mutation

Range0 <= value
createdAt*string

ISO 8601 creation timestamp

Formatdate-time
updatedAt*string

ISO 8601 timestamp of the most recent update

Formatdate-time
Example Request
curl -X POST 'https://api.nuvelics.com/api/tenant/v1/stories/string/reenrich'
Example Response
{  "id": "string",  "orgId": "string",  "source": "pitch",  "newsdeskId": "string",  "pitchId": "string",  "title": "string",  "summary": "string",  "whyItMatters": "string",  "contentLanguage": "string",  "enrichmentStatus": "pending",  "enrichmentAttempts": 0,  "lastEnrichmentError": "string",  "origin": "string",  "nrcsDropped": "archived",  "enrichedContentSha": "string",  "storyType": "PLANNED",  "lifecyclePhase": "DEVELOPING",  "phaseEnteredAt": "2019-08-24T14:15:22Z",  "sequenceNumber": 0,  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z"}
POST
/api/tenant/v1/stories/{id}/push

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Request Body

application/json
  1. body
nrcsConfigId*string

NRCS connection identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Response Body

Story pushed to the NRCS connection

application/json
  1. response
id*string

Story-to-NRCS push record identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
storyId*string

Pushed story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
orgId*string

Owning organization identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
nrcsConfigId*string

Target NRCS connection identifier; null once the connection has been deleted

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
vendor*string

NRCS vendor snapshotted at push time (e.g. saga)

externalId*string

Identifier the vendor returned for the created Pitch

pushedBy*string

User who performed the push

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
pushedAt*string

ISO 8601 timestamp the push completed

Formatdate-time
Example Request
curl -X POST 'https://api.nuvelics.com/api/tenant/v1/stories/string/push' \  -H 'Content-Type: application/json' \  -d '{  "nrcsConfigId": "string"}'
Example Response
{  "id": "string",  "storyId": "string",  "orgId": "string",  "nrcsConfigId": "string",  "vendor": "string",  "externalId": "string",  "pushedBy": "string",  "pushedAt": "2019-08-24T14:15:22Z"}
POST
/api/tenant/v1/stories/{id}/dismissals

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Request Body

application/json
  1. body
kind*"quote"
Value in"quote"
original*string

The quote's original text, as returned in StoryKeyQuote.original.text

Length1 <= length <= 10000

Response Body

The element is dismissed (a no-op when it already was); the story is returned with it flagged dismissed, and outputs no longer use it

application/json
  1. response
id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
orgId*string

Owning organization identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
source?string

Where the story came from: an approved pitch or the newsroom system (NRCS)

Default"pitch"
Value in"pitch""nrcs"
newsdeskId*string

Owning newsdesk; null for a story minted from the NRCS, which has no pitch

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
pitchId*string

Minting pitch; null for a story minted from the NRCS

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
title*string

Story title, inherited from the minting pitch or kept in sync from the NRCS record

summary*string

The story's summary: the minting pitch's, read through at request time, or the NRCS story's own

whyItMatters*string

The story's rationale: the minting pitch's, read through at request time, or the NRCS story's own

contentLanguage?string

Language code of the story's content; present only on an NRCS story (a pitch story's lives on its pitch)

enrichmentStatus*string

Claim-loop status of the enrichment worker

Value in"pending""running""enriched""failed"
enrichmentAttempts*integer

Transient-failure retry count; enrichment_status lands failed once this hits the ceiling

Range0 <= value
lastEnrichmentError?string

Failure reason from the most recent enrichment run; present only when enrichmentStatus is failed and a run captured an error (absent for failures predating this field or terminal retry-ceiling failures with no captured run error)

origin?string

Where the story came from: engine for a pitch the engine generated, manual for a pitch a person created, or the vendor of the NRCS record (for example saga) for a story minted from the NRCS. Derived on read; present on list and detail reads

nrcsDropped?string

Why the newsroom system dropped this story, archived or deleted; null while it is live and always null for a pitch story. Present on list and detail reads. A dropped story refuses new and regenerated outputs and leaves the default list

Value in"archived""deleted"null
enrichedContentSha?string

Digest of the NRCS text the story's enrichment was last computed from; null until an NRCS story is first enriched and always null for a pitch story. Present on a detail read. Compared with an NRCS record's contentSha to tell whether the enrichment is outdated

storyType*string

SOM story_type, stored verbatim

Value in"PLANNED""ACTIVE""KILLED""SPIKED""ARCHIVED""ORPHAN"
lifecyclePhase?string

SOM lifecycle_phase; present if and only if storyType is ACTIVE

Value in"DEVELOPING""READY_TO_AIR""BREAKING""PUBLISHED"
phaseEnteredAt?string

ISO 8601 timestamp the story entered its current lifecycle phase

Formatdate-time
sequenceNumber*integer

Monotonic SOM sequence_number, bumped on every consumer-ordered mutation

Range0 <= value
createdAt*string

ISO 8601 creation timestamp

Formatdate-time
updatedAt*string

ISO 8601 timestamp of the most recent update

Formatdate-time
sources*array<>

Both source origins: frozen originals plus research-discovered additional sources

meaning?

5W1H meaning block; absent until the story has been enriched

factCheck?

Overall fact-check assessment; absent until the story has been enriched

claims*array<>

Key claims with fact-check status and cited sources; empty until enriched

entities*array<>

Key entities; empty until enriched

timeline*array<>

Chronologically ordered story events; empty until enriched

quotes*array<>

Key quotes in rank order, dismissed ones included and flagged; empty until enriched, and for a story enriched before quotes existed

media*array<>

Related media projected from the contributing articles; empty until enriched

ugcPosts*array<>

Candidate eyewitness/UGC posts surfaced by the UGC search step, dismissed ones included and flagged; empty until enriched

mamAssets*array<>

Photos and videos surfaced from the org's own MAM archive, dismissed ones included and flagged; empty until enriched, and empty for an org with no MAM connection

nrcsPushes*array<>

NRCS connections this story has been pushed to; empty until pushed at least once

nrcsRecords?array<>

The newsroom-system records behind this story, oldest first; present on GET /stories/{id}, empty for a pitch story never pushed

enrichmentPlan*

The research plan computed for this story's latest completed enrichment run; null for a pre-enrichment story or one enriched before this field existed

enrichmentFreshness?||

Where the story's enrichment stands (dropped, running, not_enriched, failed, outdated, no_sources, current); present on GET /stories/{id}

Example Request
curl -X POST 'https://api.nuvelics.com/api/tenant/v1/stories/string/dismissals' \  -H 'Content-Type: application/json' \  -d '{  "kind": "quote",  "original": "string"}'
Example Response
{  "id": "string",  "orgId": "string",  "source": "pitch",  "newsdeskId": "string",  "pitchId": "string",  "title": "string",  "summary": "string",  "whyItMatters": "string",  "contentLanguage": "string",  "enrichmentStatus": "pending",  "enrichmentAttempts": 0,  "lastEnrichmentError": "string",  "origin": "string",  "nrcsDropped": "archived",  "enrichedContentSha": "string",  "storyType": "PLANNED",  "lifecyclePhase": "DEVELOPING",  "phaseEnteredAt": "2019-08-24T14:15:22Z",  "sequenceNumber": 0,  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z",  "sources": [    {      "id": "string",      "storyId": "string",      "origin": "original",      "articleId": "string",      "url": "string",      "title": "string",      "publisher": "string",      "publisherKey": "string",      "snippet": "string",      "excerpt": "string",      "publishedAt": "2019-08-24T14:15:22Z",      "fetched": true,      "position": 0,      "useAsMedia": true,      "articleAcquiredVia": "datasource",      "seedAddedAt": "2019-08-24T14:15:22Z",      "iconUrl": "string",      "recall": {        "kind": "kill",        "note": "string"      }    }  ],  "meaning": {    "who": "string",    "what": "string",    "when": "string",    "where": "string",    "why": "string",    "how": "string",    "summary": "string",    "confidence": 0  },  "factCheck": {    "assessment": "confirmed",    "summary": "string"  },  "claims": [    {      "claim": "string",      "status": "confirmed",      "note": "string",      "sourceIds": [        "string"      ],      "assertions": [        {          "sourceId": "string",          "value": "string",          "quote": "string",          "fragmentMatches": true        }      ]    }  ],  "entities": [    {      "type": "person",      "name": "string",      "description": "string",      "role": "string",      "isPrimary": true    }  ],  "timeline": [    {      "headline": "string",      "day": "2019-08-24",      "occurredAt": "2019-08-24T14:15:22Z",      "status": "confirmed",      "sourceIds": [        "string"      ]    }  ],  "quotes": [    {      "text": "string",      "original": {        "text": "string",        "language": "string"      },      "version": {        "kind": "rendering",        "text": "string",        "sourceId": "string",        "publisher": "string"      },      "spokenLanguage": "string",      "speaker": "string",      "speakerRole": "string",      "entity": "string",      "isPrimarySpeaker": true,      "context": "string",      "saidOn": "2019-08-24",      "kind": "spoken",      "origin": "passage",      "fragment": true,      "soundbite": {        "partUrl": "string",        "posterUrl": "string",        "startMs": 0,        "endMs": 0      },      "sourceIds": [        "string"      ],      "ugcPostUrl": "string",      "rank": 0,      "dismissed": true,      "dismissedVia": "quote"    }  ],  "media": [    {      "mediaType": "image",      "assetUrl": "string",      "posterUrl": "string",      "caption": "string",      "width": 0,      "height": 0,      "durationMs": 0,      "credit": "string",      "usageTerms": [        "string"      ],      "sourceArticleId": "string",      "assetId": "string",      "photoVendor": true,      "dismissed": true,      "dismissKey": "string"    }  ],  "ugcPosts": [    {      "source": "x",      "postUrl": "string",      "authorHandle": "string",      "authorName": "string",      "text": "string",      "postedAt": "2019-08-24T14:15:22Z",      "hasMedia": true,      "mediaType": "string",      "rank": 0,      "possibleReuse": true,      "possibleReuseNote": "string",      "dismissed": true    }  ],  "mamAssets": [    {      "mamConfigId": "string",      "itemId": "string",      "itemType": "image",      "title": "string",      "description": "string",      "mediaCreatedOn": "2019-08-24T14:15:22Z",      "durationMs": 0,      "whyRelevant": "string",      "matchedFields": [        "string"      ],      "thumbnailUrl": "string",      "thumbnailUrlExpiresAt": "2019-08-24T14:15:22Z",      "rank": 0,      "itemUrl": "string",      "dismissed": true    }  ],  "nrcsPushes": [    {      "id": "string",      "storyId": "string",      "orgId": "string",      "nrcsConfigId": "string",      "vendor": "string",      "externalId": "string",      "pushedBy": "string",      "pushedAt": "2019-08-24T14:15:22Z"    }  ],  "nrcsRecords": [    {      "id": "string",      "vendor": "saga",      "nrcsConfigId": "string",      "externalId": "string",      "entityType": "story",      "state": "string",      "assignedMemberIds": [        "string"      ],      "bodyText": "string",      "externalUrl": "string",      "contentSha": "string",      "status": "active"    }  ],  "enrichmentPlan": {    "research": "full",    "researchRule": "string",    "ugcSearch": "searched",    "ugcRule": "string",    "researchOutcome": "query-gen-failed",    "mamSearch": "searched",    "mamRule": "string",    "quotesRequested": true,    "quotesFailed": true,    "synthesisSections": [      "meaning"    ]  },  "enrichmentFreshness": {    "state": "dropped"  }}
POST
/api/tenant/v1/stories/{id}/dismissals/restore

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Request Body

application/json
  1. body
kind*"quote"
Value in"quote"
original*string

The quote's original text, as returned in StoryKeyQuote.original.text

Length1 <= length <= 10000

Response Body

The element's dismissal is removed (a no-op when it was not dismissed); the story is returned

application/json
  1. response
id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
orgId*string

Owning organization identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
source?string

Where the story came from: an approved pitch or the newsroom system (NRCS)

Default"pitch"
Value in"pitch""nrcs"
newsdeskId*string

Owning newsdesk; null for a story minted from the NRCS, which has no pitch

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
pitchId*string

Minting pitch; null for a story minted from the NRCS

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
title*string

Story title, inherited from the minting pitch or kept in sync from the NRCS record

summary*string

The story's summary: the minting pitch's, read through at request time, or the NRCS story's own

whyItMatters*string

The story's rationale: the minting pitch's, read through at request time, or the NRCS story's own

contentLanguage?string

Language code of the story's content; present only on an NRCS story (a pitch story's lives on its pitch)

enrichmentStatus*string

Claim-loop status of the enrichment worker

Value in"pending""running""enriched""failed"
enrichmentAttempts*integer

Transient-failure retry count; enrichment_status lands failed once this hits the ceiling

Range0 <= value
lastEnrichmentError?string

Failure reason from the most recent enrichment run; present only when enrichmentStatus is failed and a run captured an error (absent for failures predating this field or terminal retry-ceiling failures with no captured run error)

origin?string

Where the story came from: engine for a pitch the engine generated, manual for a pitch a person created, or the vendor of the NRCS record (for example saga) for a story minted from the NRCS. Derived on read; present on list and detail reads

nrcsDropped?string

Why the newsroom system dropped this story, archived or deleted; null while it is live and always null for a pitch story. Present on list and detail reads. A dropped story refuses new and regenerated outputs and leaves the default list

Value in"archived""deleted"null
enrichedContentSha?string

Digest of the NRCS text the story's enrichment was last computed from; null until an NRCS story is first enriched and always null for a pitch story. Present on a detail read. Compared with an NRCS record's contentSha to tell whether the enrichment is outdated

storyType*string

SOM story_type, stored verbatim

Value in"PLANNED""ACTIVE""KILLED""SPIKED""ARCHIVED""ORPHAN"
lifecyclePhase?string

SOM lifecycle_phase; present if and only if storyType is ACTIVE

Value in"DEVELOPING""READY_TO_AIR""BREAKING""PUBLISHED"
phaseEnteredAt?string

ISO 8601 timestamp the story entered its current lifecycle phase

Formatdate-time
sequenceNumber*integer

Monotonic SOM sequence_number, bumped on every consumer-ordered mutation

Range0 <= value
createdAt*string

ISO 8601 creation timestamp

Formatdate-time
updatedAt*string

ISO 8601 timestamp of the most recent update

Formatdate-time
sources*array<>

Both source origins: frozen originals plus research-discovered additional sources

meaning?

5W1H meaning block; absent until the story has been enriched

factCheck?

Overall fact-check assessment; absent until the story has been enriched

claims*array<>

Key claims with fact-check status and cited sources; empty until enriched

entities*array<>

Key entities; empty until enriched

timeline*array<>

Chronologically ordered story events; empty until enriched

quotes*array<>

Key quotes in rank order, dismissed ones included and flagged; empty until enriched, and for a story enriched before quotes existed

media*array<>

Related media projected from the contributing articles; empty until enriched

ugcPosts*array<>

Candidate eyewitness/UGC posts surfaced by the UGC search step, dismissed ones included and flagged; empty until enriched

mamAssets*array<>

Photos and videos surfaced from the org's own MAM archive, dismissed ones included and flagged; empty until enriched, and empty for an org with no MAM connection

nrcsPushes*array<>

NRCS connections this story has been pushed to; empty until pushed at least once

nrcsRecords?array<>

The newsroom-system records behind this story, oldest first; present on GET /stories/{id}, empty for a pitch story never pushed

enrichmentPlan*

The research plan computed for this story's latest completed enrichment run; null for a pre-enrichment story or one enriched before this field existed

enrichmentFreshness?||

Where the story's enrichment stands (dropped, running, not_enriched, failed, outdated, no_sources, current); present on GET /stories/{id}

Example Request
curl -X POST 'https://api.nuvelics.com/api/tenant/v1/stories/string/dismissals/restore' \  -H 'Content-Type: application/json' \  -d '{  "kind": "quote",  "original": "string"}'
Example Response
{  "id": "string",  "orgId": "string",  "source": "pitch",  "newsdeskId": "string",  "pitchId": "string",  "title": "string",  "summary": "string",  "whyItMatters": "string",  "contentLanguage": "string",  "enrichmentStatus": "pending",  "enrichmentAttempts": 0,  "lastEnrichmentError": "string",  "origin": "string",  "nrcsDropped": "archived",  "enrichedContentSha": "string",  "storyType": "PLANNED",  "lifecyclePhase": "DEVELOPING",  "phaseEnteredAt": "2019-08-24T14:15:22Z",  "sequenceNumber": 0,  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z",  "sources": [    {      "id": "string",      "storyId": "string",      "origin": "original",      "articleId": "string",      "url": "string",      "title": "string",      "publisher": "string",      "publisherKey": "string",      "snippet": "string",      "excerpt": "string",      "publishedAt": "2019-08-24T14:15:22Z",      "fetched": true,      "position": 0,      "useAsMedia": true,      "articleAcquiredVia": "datasource",      "seedAddedAt": "2019-08-24T14:15:22Z",      "iconUrl": "string",      "recall": {        "kind": "kill",        "note": "string"      }    }  ],  "meaning": {    "who": "string",    "what": "string",    "when": "string",    "where": "string",    "why": "string",    "how": "string",    "summary": "string",    "confidence": 0  },  "factCheck": {    "assessment": "confirmed",    "summary": "string"  },  "claims": [    {      "claim": "string",      "status": "confirmed",      "note": "string",      "sourceIds": [        "string"      ],      "assertions": [        {          "sourceId": "string",          "value": "string",          "quote": "string",          "fragmentMatches": true        }      ]    }  ],  "entities": [    {      "type": "person",      "name": "string",      "description": "string",      "role": "string",      "isPrimary": true    }  ],  "timeline": [    {      "headline": "string",      "day": "2019-08-24",      "occurredAt": "2019-08-24T14:15:22Z",      "status": "confirmed",      "sourceIds": [        "string"      ]    }  ],  "quotes": [    {      "text": "string",      "original": {        "text": "string",        "language": "string"      },      "version": {        "kind": "rendering",        "text": "string",        "sourceId": "string",        "publisher": "string"      },      "spokenLanguage": "string",      "speaker": "string",      "speakerRole": "string",      "entity": "string",      "isPrimarySpeaker": true,      "context": "string",      "saidOn": "2019-08-24",      "kind": "spoken",      "origin": "passage",      "fragment": true,      "soundbite": {        "partUrl": "string",        "posterUrl": "string",        "startMs": 0,        "endMs": 0      },      "sourceIds": [        "string"      ],      "ugcPostUrl": "string",      "rank": 0,      "dismissed": true,      "dismissedVia": "quote"    }  ],  "media": [    {      "mediaType": "image",      "assetUrl": "string",      "posterUrl": "string",      "caption": "string",      "width": 0,      "height": 0,      "durationMs": 0,      "credit": "string",      "usageTerms": [        "string"      ],      "sourceArticleId": "string",      "assetId": "string",      "photoVendor": true,      "dismissed": true,      "dismissKey": "string"    }  ],  "ugcPosts": [    {      "source": "x",      "postUrl": "string",      "authorHandle": "string",      "authorName": "string",      "text": "string",      "postedAt": "2019-08-24T14:15:22Z",      "hasMedia": true,      "mediaType": "string",      "rank": 0,      "possibleReuse": true,      "possibleReuseNote": "string",      "dismissed": true    }  ],  "mamAssets": [    {      "mamConfigId": "string",      "itemId": "string",      "itemType": "image",      "title": "string",      "description": "string",      "mediaCreatedOn": "2019-08-24T14:15:22Z",      "durationMs": 0,      "whyRelevant": "string",      "matchedFields": [        "string"      ],      "thumbnailUrl": "string",      "thumbnailUrlExpiresAt": "2019-08-24T14:15:22Z",      "rank": 0,      "itemUrl": "string",      "dismissed": true    }  ],  "nrcsPushes": [    {      "id": "string",      "storyId": "string",      "orgId": "string",      "nrcsConfigId": "string",      "vendor": "string",      "externalId": "string",      "pushedBy": "string",      "pushedAt": "2019-08-24T14:15:22Z"    }  ],  "nrcsRecords": [    {      "id": "string",      "vendor": "saga",      "nrcsConfigId": "string",      "externalId": "string",      "entityType": "story",      "state": "string",      "assignedMemberIds": [        "string"      ],      "bodyText": "string",      "externalUrl": "string",      "contentSha": "string",      "status": "active"    }  ],  "enrichmentPlan": {    "research": "full",    "researchRule": "string",    "ugcSearch": "searched",    "ugcRule": "string",    "researchOutcome": "query-gen-failed",    "mamSearch": "searched",    "mamRule": "string",    "quotesRequested": true,    "quotesFailed": true,    "synthesisSections": [      "meaning"    ]  },  "enrichmentFreshness": {    "state": "dropped"  }}
GET
/api/tenant/v1/stories/{id}/photos

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Query Parameters

include?|array<string>

Relations to sideload. uploadedBy populates included.users with the users who attached the photos.

Response Body

The photos uploaded to the story, oldest first, each with a preview URL

application/json
  1. response
items*array<>
included?
Example Request
curl -X GET 'https://api.nuvelics.com/api/tenant/v1/stories/string/photos'
Example Response
{  "items": [    {      "assetId": "string",      "storyId": "string",      "credit": "string",      "caption": "string",      "width": 0,      "height": 0,      "uploadedBy": "string",      "createdAt": "2019-08-24T14:15:22Z",      "previewUrl": "string"    }  ],  "included": {    "users": {      "property1": {        "id": "string",        "name": "string",        "email": "string"      },      "property2": {        "id": "string",        "name": "string",        "email": "string"      }    }  }}
POST
/api/tenant/v1/stories/{id}/photos

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Request Body

application/json
  1. body
assetId*string

Asset identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
credit?string

Credit line as entered, e.g. a photographer's name; shown on a card with a prefix

Length1 <= length <= 200
caption?string

What the photo shows; read as the photo's caption and to write alt text from

Length1 <= length <= 500

Response Body

The completed upload is attached; its size was read from the stored bytes

application/json
  1. response
assetId*string

Asset identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
storyId*string

UUID v7, base32-encoded (26 Crockford chars)

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
credit*string

Credit line as entered, e.g. a photographer's name; shown on a card with a prefix

Length1 <= length <= 200
caption*string

What the photo shows; read as the photo's caption and to write alt text from

Length1 <= length <= 500
width*integer

Pixel width read from the stored image's header

Range0 <= value
height*integer

Pixel height read from the stored image's header

Range0 <= value
uploadedBy*string

User who attached the photo; null for a service key

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
createdAt*string
Formatdate-time
Example Request
curl -X POST 'https://api.nuvelics.com/api/tenant/v1/stories/string/photos' \  -H 'Content-Type: application/json' \  -d '{  "assetId": "string"}'
Example Response
{  "assetId": "string",  "storyId": "string",  "credit": "string",  "caption": "string",  "width": 0,  "height": 0,  "uploadedBy": "string",  "createdAt": "2019-08-24T14:15:22Z"}
POST
/api/tenant/v1/stories/{id}/photos/from-url

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Request Body

application/json
  1. body
url*string

A publicly reachable https URL of a JPEG, PNG or WebP image, at most 20 MiB. Fetched once; not stored

Formaturi
Lengthlength <= 2048
credit?string

Credit line as entered, e.g. a photographer's name; shown on a card with a prefix

Length1 <= length <= 200
caption?string

What the photo shows; read as the photo's caption and to write alt text from

Length1 <= length <= 500

Response Body

The image was fetched, stored as a story photo and attached; its size was read from the bytes

application/json
  1. response
assetId*string

Asset identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
storyId*string

UUID v7, base32-encoded (26 Crockford chars)

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
credit*string

Credit line as entered, e.g. a photographer's name; shown on a card with a prefix

Length1 <= length <= 200
caption*string

What the photo shows; read as the photo's caption and to write alt text from

Length1 <= length <= 500
width*integer

Pixel width read from the stored image's header

Range0 <= value
height*integer

Pixel height read from the stored image's header

Range0 <= value
uploadedBy*string

User who attached the photo; null for a service key

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
createdAt*string
Formatdate-time
Example Request
curl -X POST 'https://api.nuvelics.com/api/tenant/v1/stories/string/photos/from-url' \  -H 'Content-Type: application/json' \  -d '{  "url": "http://example.com"}'
Example Response
{  "assetId": "string",  "storyId": "string",  "credit": "string",  "caption": "string",  "width": 0,  "height": 0,  "uploadedBy": "string",  "createdAt": "2019-08-24T14:15:22Z"}
POST
/api/tenant/v1/stories/{id}/photos/caption-suggestion

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Request Body

application/json
  1. body
assetId*string

Asset identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Response Body

A caption a model suggests for the photo, for a person to review before it is attached. Nothing is stored

application/json
  1. response
caption*string

What the photo shows; read as the photo's caption and to write alt text from

Length1 <= length <= 500
Example Request
curl -X POST 'https://api.nuvelics.com/api/tenant/v1/stories/string/photos/caption-suggestion' \  -H 'Content-Type: application/json' \  -d '{  "assetId": "string"}'
Example Response
{  "caption": "string"}
DELETE
/api/tenant/v1/stories/{id}/photos/{assetId}

Authorization

headerx-api-key<token>

A service key (nvs_...) in the x-api-key header. A service key belongs to one organization: an X-Org-Id header is optional and, when sent, must name that organization. This header also accepts any credential the bearer scheme does, and when a request sends both headers, this one is used.

Path Parameters

id*string

Story identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$
assetId*string

Asset identifier

Match^[0-7][0-9A-HJKMNP-TV-Z]{25}$

Response Body

The photo and its file are removed

Example Request
curl -X DELETE 'https://api.nuvelics.com/api/tenant/v1/stories/string/photos/string'
Example Response
Empty

Report a problem with this page

On this page