Nuvelics documentation
APIAPI reference

Data sources

Add and manage the sources Nuvelics collects articles from, run one now, and see its harvest runs.

GET
/api/tenant/v1/datasources

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

sort?string

Sort order: "-field" descending, "field" ascending. Accepted: name, -name, createdAt, -createdAt, updatedAt, -updatedAt (default -updatedAt)

Response Body

A page of datasources, most-recently-updated first. Items carry health only when the request includes ?include=health.

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/datasources'
Example Response
{  "items": [    {      "id": "string",      "orgId": "string",      "name": "string",      "createdAt": "2019-08-24T14:15:22Z",      "updatedAt": "2019-08-24T14:15:22Z",      "version": 0,      "enabled": true,      "credentialId": "string",      "fetchConfig": {        "maxBodyBytes": 0,        "maxFeedItems": 0,        "timeoutMs": 0,        "userAgent": "string",        "throttleDelayMs": 0      },      "topic": "financial",      "location": "string",      "type": "web",      "url": "http://example.com",      "followLinks": true,      "iconId": "string",      "health": {        "state": "ok",        "since": "2019-08-24T14:15:22Z",        "lastError": "string"      }    }  ],  "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": {    "datasources": {      "property1": {        "id": "string",        "name": "string",        "type": "string",        "vendor": "datafactory",        "iconId": "string"      },      "property2": {        "id": "string",        "name": "string",        "type": "string",        "vendor": "datafactory",        "iconId": "string"      }    },    "credentials": {      "property1": {        "id": "string",        "name": "string",        "schemeType": "string"      },      "property2": {        "id": "string",        "name": "string",        "schemeType": "string"      }    },    "users": {      "property1": {        "id": "string",        "name": "string",        "email": "string"      },      "property2": {        "id": "string",        "name": "string",        "email": "string"      }    },    "articlePitches": {      "property1": [        {          "id": "string",          "title": "string",          "status": "string",          "newsdeskId": "string"        }      ],      "property2": [        {          "id": "string",          "title": "string",          "status": "string",          "newsdeskId": "string"        }      ]    }  }}

Register a datasource

POST
/api/tenant/v1/datasources

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.

Request Body

application/json
  1. body

Web datasource

name*string

Datasource display name

Length1 <= length
credentialId?string

The credential this source authenticates with when fetching, if it requires or accepts one.

fetchConfig?

Per-datasource HTTP fetch tuning overrides; all fields optional

topic?string

The one topic this source covers, for a source dedicated to a single topic. Leave empty for a mixed feed, where per-article classification decides. A routing hint, not a guarantee.

Value in"financial""global_news""global_sports""local_news""local_traffic""lottery""national_news""national_sports""other""politics""schools_closings""weather"
location?string

Optional single-valued editorial coverage hint: the one location this source is known to cover, for the minority of sources that are monolithic on this dimension. Omitted for mixed feeds, where per-event classification decides. A routing/classification prior, not authoritative. Distinct from a datasource kind's own params.location (e.g. a Grok x-search's free-text search target): this field describes the source's own editorial coverage, not a search parameter.

Length1 <= length
type*"web"
Value in"web"
url*string

Feed or article URL (https only)

Formaturi
followLinks?boolean

Enrich feed summaries with full body

Response Body

Datasource registered

application/json
  1. response

Web datasource

id*string

Datasource identifier

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

Owning organization identifier

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

Datasource display name

Length1 <= length
createdAt*string

ISO 8601 creation timestamp

Formatdate-time
updatedAt*string

ISO 8601 last-modified timestamp

Formatdate-time
version*integer

Monotonic row version; used as concurrency token

enabled*boolean

When false the datasource is excluded from harvesting

credentialId?string

The credential this source authenticates with when fetching, if it requires or accepts one.

fetchConfig?

Per-datasource HTTP fetch tuning overrides; all fields optional

topic?string

The one topic this source covers, for a source dedicated to a single topic. Leave empty for a mixed feed, where per-article classification decides. A routing hint, not a guarantee.

Value in"financial""global_news""global_sports""local_news""local_traffic""lottery""national_news""national_sports""other""politics""schools_closings""weather"
location?string

Optional single-valued editorial coverage hint: the one location this source is known to cover, for the minority of sources that are monolithic on this dimension. Omitted for mixed feeds, where per-event classification decides. A routing/classification prior, not authoritative. Distinct from a datasource kind's own params.location (e.g. a Grok x-search's free-text search target): this field describes the source's own editorial coverage, not a search parameter.

Length1 <= length
type*"web"
Value in"web"
url*string

Feed or article URL (https only)

Formaturi
followLinks?boolean

Enrich feed summaries with full body

iconId?string

Identifier addressing this source's fetched icon, for use with GET /icons/{iconId}. Derived from the source's configured URL origin; absent until the read model computes it.

Example Request
curl -X POST 'https://api.nuvelics.com/api/tenant/v1/datasources' \  -H 'Content-Type: application/json' \  -d '{  "name": "string",  "type": "web",  "url": "http://example.com"}'
Example Response
{  "id": "string",  "orgId": "string",  "name": "string",  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z",  "version": 0,  "enabled": true,  "credentialId": "string",  "fetchConfig": {    "maxBodyBytes": 0,    "maxFeedItems": 0,    "timeoutMs": 0,    "userAgent": "string",    "throttleDelayMs": 0  },  "topic": "financial",  "location": "string",  "type": "web",  "url": "http://example.com",  "followLinks": true,  "iconId": "string"}
GET
/api/tenant/v1/datasources/credential-opt-in-kinds

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.

Response Body

Datasource kinds that can be saved without a credential

application/json
  1. response
kinds*array<>

Datasource kinds that can be saved without a credential for this organization.

Example Request
curl -X GET 'https://api.nuvelics.com/api/tenant/v1/datasources/credential-opt-in-kinds'
Example Response
{  "kinds": [    "web"  ]}

Get a datasource by ID

GET
/api/tenant/v1/datasources/{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

Datasource identifier

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

Response Body

Datasource found

application/json
  1. response
id*string

Datasource identifier

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

Owning organization identifier

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

Datasource display name

Length1 <= length
createdAt*string

ISO 8601 creation timestamp

Formatdate-time
updatedAt*string

ISO 8601 last-modified timestamp

Formatdate-time
version*integer

Monotonic row version; used as concurrency token

enabled*boolean

When false the datasource is excluded from harvesting

credentialId?string

The credential this source authenticates with when fetching, if it requires or accepts one.

fetchConfig?

Per-datasource HTTP fetch tuning overrides; all fields optional

topic?string

The one topic this source covers, for a source dedicated to a single topic. Leave empty for a mixed feed, where per-article classification decides. A routing hint, not a guarantee.

Value in"financial""global_news""global_sports""local_news""local_traffic""lottery""national_news""national_sports""other""politics""schools_closings""weather"
location?string

Optional single-valued editorial coverage hint: the one location this source is known to cover, for the minority of sources that are monolithic on this dimension. Omitted for mixed feeds, where per-event classification decides. A routing/classification prior, not authoritative. Distinct from a datasource kind's own params.location (e.g. a Grok x-search's free-text search target): this field describes the source's own editorial coverage, not a search parameter.

Length1 <= length
type*"web"
Value in"web"
url*string

Feed or article URL (https only)

Formaturi
followLinks?boolean

Enrich feed summaries with full body

iconId?string

Identifier addressing this source's fetched icon, for use with GET /icons/{iconId}. Derived from the source's configured URL origin; absent until the read model computes it.

health*

Health of the datasource's most recent harvest run, null when never run

activity*

Derived acquisition state for a datasource, computed at read time from stored schedule state

Example Request
curl -X GET 'https://api.nuvelics.com/api/tenant/v1/datasources/string'
Example Response
{  "id": "string",  "orgId": "string",  "name": "string",  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z",  "version": 0,  "enabled": true,  "credentialId": "string",  "fetchConfig": {    "maxBodyBytes": 0,    "maxFeedItems": 0,    "timeoutMs": 0,    "userAgent": "string",    "throttleDelayMs": 0  },  "topic": "financial",  "location": "string",  "type": "web",  "url": "http://example.com",  "followLinks": true,  "iconId": "string",  "health": {    "status": "healthy",    "lastError": "string",    "updatedAt": "2019-08-24T14:15:22Z"  },  "activity": {    "state": "ok",    "since": "2019-08-24T14:15:22Z",    "lastError": "string"  }}
PATCH
/api/tenant/v1/datasources/{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

Datasource identifier

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

Request Body

application/json
  1. body
name?string
Length1 <= length
url?string
Formaturi
credentialId?string
Length1 <= length
fetchConfig?

Per-datasource HTTP fetch tuning overrides; all fields optional

enabled?boolean
topic?string
Value in"financial""global_news""global_sports""local_news""local_traffic""lottery""national_news""national_sports""other""politics""schools_closings""weather"null
location?string
Length1 <= length
params?

Kind-specific params patch, accepted opaquely; validated against the stored kind's concrete params schema in the use-case.

followLinks?boolean

Kind-scoped enrich flag (web/x-follows/x-status); applicability enforced in the use-case.

Response Body

Datasource updated

application/json
  1. response

Web datasource

id*string

Datasource identifier

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

Owning organization identifier

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

Datasource display name

Length1 <= length
createdAt*string

ISO 8601 creation timestamp

Formatdate-time
updatedAt*string

ISO 8601 last-modified timestamp

Formatdate-time
version*integer

Monotonic row version; used as concurrency token

enabled*boolean

When false the datasource is excluded from harvesting

credentialId?string

The credential this source authenticates with when fetching, if it requires or accepts one.

fetchConfig?

Per-datasource HTTP fetch tuning overrides; all fields optional

topic?string

The one topic this source covers, for a source dedicated to a single topic. Leave empty for a mixed feed, where per-article classification decides. A routing hint, not a guarantee.

Value in"financial""global_news""global_sports""local_news""local_traffic""lottery""national_news""national_sports""other""politics""schools_closings""weather"
location?string

Optional single-valued editorial coverage hint: the one location this source is known to cover, for the minority of sources that are monolithic on this dimension. Omitted for mixed feeds, where per-event classification decides. A routing/classification prior, not authoritative. Distinct from a datasource kind's own params.location (e.g. a Grok x-search's free-text search target): this field describes the source's own editorial coverage, not a search parameter.

Length1 <= length
type*"web"
Value in"web"
url*string

Feed or article URL (https only)

Formaturi
followLinks?boolean

Enrich feed summaries with full body

iconId?string

Identifier addressing this source's fetched icon, for use with GET /icons/{iconId}. Derived from the source's configured URL origin; absent until the read model computes it.

Example Request
curl -X PATCH 'https://api.nuvelics.com/api/tenant/v1/datasources/string' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "id": "string",  "orgId": "string",  "name": "string",  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z",  "version": 0,  "enabled": true,  "credentialId": "string",  "fetchConfig": {    "maxBodyBytes": 0,    "maxFeedItems": 0,    "timeoutMs": 0,    "userAgent": "string",    "throttleDelayMs": 0  },  "topic": "financial",  "location": "string",  "type": "web",  "url": "http://example.com",  "followLinks": true,  "iconId": "string"}

Delete a datasource

DELETE
/api/tenant/v1/datasources/{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

Datasource identifier

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

Response Body

Datasource deleted

Example Request
curl -X DELETE 'https://api.nuvelics.com/api/tenant/v1/datasources/string'
Example Response
Empty
POST
/api/tenant/v1/datasources/{id}/run

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

Datasource identifier

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

Response Body

Acquisition result (ok or not_modified)

application/json
  1. response

Per-URL acquisition outcome

url*string

The input URL, echoed for correlation

status*"ok"
Value in"ok"
warnings?array<>
articles*array<>
Example Request
curl -X POST 'https://api.nuvelics.com/api/tenant/v1/datasources/string/run'
Example Response
{  "url": "string",  "status": "ok",  "warnings": [    {      "type": "acquisition_items_truncated",      "detail": "string"    }  ],  "articles": [    {      "datasourceId": "string",      "title": "string",      "url": "string",      "publishedAt": "string",      "updatedAt": "string",      "authors": [        "string"      ],      "source": {        "kind": "feed",        "title": "string",        "url": "string"      },      "parts": [        {          "type": "text/markdown",          "role": "body",          "text": "string",          "lang": "string",          "signals": [            "paywalled"          ],          "provenance": []        }      ],      "links": [],      "priority": "ROUTINE",      "genre": "string",      "editorNote": "string",      "usageTerms": [        "string"      ],      "contentWarnings": [        "string"      ]    }  ]}
GET
/api/tenant/v1/datasources/{id}/runs

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

Datasource identifier

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

Query Parameters

cursor?string
limit?integer
Range0 <= value <= 100
sort?string

Sort order: "-field" descending, "field" ascending. Accepted: startedAt, -startedAt (default -startedAt)

Response Body

Paginated harvest runs for the datasource, newest 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/datasources/string/runs'
Example Response
{  "items": [    {      "id": "string",      "datasourceId": "string",      "status": "running",      "startedAt": "2019-08-24T14:15:22Z",      "finishedAt": "2019-08-24T14:15:22Z",      "stats": {        "property1": 0,        "property2": 0      }    }  ],  "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": {    "datasources": {      "property1": {        "id": "string",        "name": "string",        "type": "string",        "vendor": "datafactory",        "iconId": "string"      },      "property2": {        "id": "string",        "name": "string",        "type": "string",        "vendor": "datafactory",        "iconId": "string"      }    },    "credentials": {      "property1": {        "id": "string",        "name": "string",        "schemeType": "string"      },      "property2": {        "id": "string",        "name": "string",        "schemeType": "string"      }    },    "users": {      "property1": {        "id": "string",        "name": "string",        "email": "string"      },      "property2": {        "id": "string",        "name": "string",        "email": "string"      }    },    "articlePitches": {      "property1": [        {          "id": "string",          "title": "string",          "status": "string",          "newsdeskId": "string"        }      ],      "property2": [        {          "id": "string",          "title": "string",          "status": "string",          "newsdeskId": "string"        }      ]    }  }}

Report a problem with this page

On this page