README
@ttab/api-client
Browser-friendly TypeScript client for TT Nyhetsbyrån public APIs. The client code (and this README file) has been automatically generated from the API definition located at https://api.tt.se/docs.
Instructions for building the client are here.
- Getting started
- API Reference
- ContentV1
- UserV1
- CollectionV1
- Exported types
Getting started
Prerequisites
To access the APIs you need to have a registered user account at TT Nyhetsbyrån.
The API uses OAuth2 token authentication. To be able to generate an OAuth2 token you will need a OAuth2 client registered with TT Nyhetsbyrån. If you don't have one, please contact support@tt.se.
Obtaining an OAuth2 token
The OAuth2 endpoints are documented
here. In short, to obtain a token
you call the https://tt.se/o/oauth2/token
endpoint like this:
curl -XPOST -d username="<USERNAME>" \
-d password="<PASSWORD>" \
-d grant_type=password \
-d scope="roles" \
-d client_id="<CLIENT_ID>" \
-d client_secret="<CLIENT_SECRET>" \
https://tt.se/o/oauth2/token
You will get a JSON payload back. One of the properties is called access_token
and contains the the OAuth2 token you need to connect to the API. To run the
examples below it is handy to have this token exported as an environment
variable:
export TOKEN="a.DV_8caPCk7CVQs_jr4_MpqZSxj4e25N3GbTEGXk2w4MUwzB..."
Searching
Searching the database for matching items is a common operation. You supply the
mediaType
(image
, text
, video
, etc.) and an object with query
parameters, and get a result object with an array of search hits
.
This is a basic query, looking for panda pictures:
import { Api } from '@ttab/api-client'
let api = new Api({ token: process.env.TOKEN || '' })
api.content.search('image', { q: 'panda' }).then(res => {
res.hits.forEach(hit => {
console.log(hit.uri, hit.product)
})
})
The search result is restricted to only match items allowed by the customer
agreements linked to your user account. If you wish to further restrict the
search result to match a given agreement you can use the agr
parameter:
api.content.search('image', { q: 'panda', agr: [20031] }).then(res => {
res.hits.forEach(hit => {
console.log(hit.uri, hit.product)
})
})
You can also restrict the search result to only contain items matching one or more product codes:
api.content
.search('image', { q: 'panda', p: ['FOGNRE', 'FOGNREEJ'] })
.then(res => {
res.hits.forEach(hit => {
console.log(hit.uri, hit.product)
})
})
Streaming data
While the api.content.search() method only returns items that are already present in the database, api.content.stream() provides a way to get a near real-time stream of new items as they are being indexed.
The api.content.stream() method accepts roughly the same arguments as api.content.search(), with the exception of arguments that affect time ranges and result pagination. They don't make any sense while streaming data, as we will always return the latest items added.
api.content.stream() also accepts two additional
parameters. wait
is the maximum time (in seconds) to wait for new items before
the call returns with an empty result. last
is the uri
of the last item that
the client received. The idea is that if items has been added to the database
since the client received the last result, the call will return immediately with
those new items.
Utilizing the last
parameter you can write a simple loop like this, that
prints the uri, source and headline for each new image as it is added to the
database:
import { Api } from '@ttab/api-client'
let api = new Api({ token: process.env.TOKEN || '' })
function loop(last?: string) {
return api.content.stream('image', { last: last }).then(result => {
let _last = null
result.hits.forEach(hit => {
console.log(hit.uri, hit.source, hit.headline)
_last = hit.uri
})
return loop(_last)
})
}
loop().catch(err => {
console.error(err)
})
The ContentStream class
While you can handle stream loops yourself, the API client supplies a utility class to make content streaming easier.
Methods
constructor(api, mediaType, parameters)
-api
- anApi
instancemediaType
andparameters
- the same arguments accepted by api.content.stream()
stop()
- request that the content stream be stopped. When the stream has closed down and no moredata
events can be expected a finalclose
event will be emitted.
Events
data
- emitted once for every hit.error
- emitted on error. It is up to the user to decide how to handle this error and if/when to close the content stream.close
- emitted when the content stream is closed. No moredata
events will be emitted.
Error handling
On errors which the client is unlikely to recover from by itself (i.e. HTTP
4XX), the stream will automatically emit a close
event and stop.
When encountering other errors (HTTP 5xx, connections errors, etc.) the stream uses an exponential backoff algorithm to determine an appropriate delay before retrying the request. The initial delay is 50ms and doubles after each consecutive error, up to 60s. The delay is reset to zero when a request completes successfully.
Example
The following code is equivalent to the loop in the previous section. It prints
the uri
, source
and headline
for each new image as it is added to the
database. It handles errors by printing a stack trace and closing down the
stream.
import { Api, ContentStream } from '@ttab/api-client'
let api = new Api({ token: process.env.TOKEN || '' })
let stream = new ContentStream(api, 'image', {})
stream.on('data', hit => {
console.log(hit.uri, hit.source, hit.headline)
})
stream.on('error', err => {
console.log('err', err)
stream.close()
})
stream.on('close', () => {
console.log('closed')
})
Errors
Errors reported by the API or caused by the HTTP connection have the type
ApiError
.
API Reference
ContentV1
search(mediaType, parameters)
Searching the TT archives.
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar" | "stockfoto"
- Only return items of this media type. - parameters:
q?: string
- A query string used for free text searching.p?: Array<string>
- A list of product codes. Only items matching at least one of these codes will be returned. The list of current product codes is here. Individual product codes may be prefixed with a '-' sign, indicating that the code should instead be excluded from the search result.agr?: Array<number>
- A list of customer agreement IDs belonging to the current user. Only items covered by at least one of there agreements will be returned.tr?: "h" | "d" | "w" | "m" | "y"
- Time range: last hour, day, week, month, or year.trs?: string
- Start datetre?: string
- End dates?: number
- Size of search result.fr?: number
- Index into the search result. Used for pagination. It is recommended to make this value a multiple of the search result size (s
), as some media types do not support arbitrary values here.sort?: "default:desc" | "default:asc" | "date:desc" | "date:asc" | "versioncreated:desc" | "versioncreated:asc" | "versionstored:desc" | "versionstored:asc" | "relevance"
- Sort order for the result. Documentation on various date fields can be found here.- default:desc / default:asc - Sort on the internal field '_tstamp' in descending or ascending order respectively.
- date:desc / date:asc - Sort on the field 'date' in descending or ascending order respectively.
- versioncreated:desc / versioncreated:asc - Sort on the field 'versioncreated' in descending or ascending order respectively.
- versionstored:desc / versionstored:asc - Sort on the field 'versionstored' in descending or ascending order respectively.
- relevance - Sort on relevance. The most relevant matches first.
facets?: Array<"copyrightholder" | "person.name" | "place.name" | "product.code" | "subject.code">
- Enable search facets; in addition to the regular search result the API will also return one or more additional facets which contain information about how many search results can be expected if the current query is narrowed down using popular subject codes, product codes, etc.layout?: "bare" | "full"
- By default the full TTNinjs document is returned for each search hit. This may be too cumbersome for some use cases; for example when the client requests a large search result to be displayed in a list form. This parameter allows the client to control the layout of the items in the search result:- full - (default) return the full TTNinjs document
- bare - return only
headline
,date
,uri
,renditions
,associations
,pubstatus
,originaltransmissionreference
,copyrightholder
. In addition, allassociations
except the first are stripped away, andrenditions
will only contain the thumbnail rendition.
Returns
- Promise<{ 'hits': Array<ttninjs>; 'total': number; 'facets'?: { 'subject.code'?: Array<facet>; 'product.code'?: Array<facet>; 'place.name'?: Array<facet>; 'person.name'?: Array<facet>; 'copyrightholder'?: Array<facet>;};}>
Example
api.content
.search('image', {
q: 'panda',
p: ['FOGNRE', '-FOGNREEJ'],
agr: [20031, 20035],
tr: 'w',
sort: 'date:asc'
})
.then(result => {
// do something with result
})
stream(mediaType, parameters)
Realtime delivery of content.
Long poll call that will wait for a specified time period (default: 60s, max
300s) until a matching item is published. The parameters are similar to those
for search
, with the exception that time ranges and pagination doesn't make
sense in this context (we will always return the most recent item).
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar"
- Only return items of this media type. - parameters:
q?: string
- A query string used for free text searching.p?: Array<string>
- A list of product codes. Only items matching at least one of these codes will be returned. The list of current product codes is here. Individual product codes may be prefixed with a '-' sign, indicating that the code should instead be excluded from the search result.agr?: Array<number>
- A list of customer agreement IDs belonging to the current user. Only items covered by at least one of there agreements will be returned.sort?: "default:desc" | "default:asc" | "date:desc" | "date:asc" | "versioncreated:desc" | "versioncreated:asc" | "versionstored:desc" | "versionstored:asc" | "relevance"
- Sort order for the result. Documentation on various date fields can be found here.- default:desc / default:asc - Sort on the internal field '_tstamp' in descending or ascending order respectively.
- date:desc / date:asc - Sort on the field 'date' in descending or ascending order respectively.
- versioncreated:desc / versioncreated:asc - Sort on the field 'versioncreated' in descending or ascending order respectively.
- versionstored:desc / versionstored:asc - Sort on the field 'versionstored' in descending or ascending order respectively.
- relevance - Sort on relevance. The most relevant matches first.
layout?: "bare" | "full"
- By default the full TTNinjs document is returned for each search hit. This may be too cumbersome for some use cases; for example when the client requests a large search result to be displayed in a list form. This parameter allows the client to control the layout of the items in the search result:- full - (default) return the full TTNinjs document
- bare - return only
headline
,date
,uri
,renditions
,associations
,pubstatus
,originaltransmissionreference
,copyrightholder
. In addition, allassociations
except the first are stripped away, andrenditions
will only contain the thumbnail rendition.
last?: string
- The uri of the last item received.wait?: number
- The time (in seconds) to wait for updates before returning an empty result.
Returns
- Promise<{ 'hits': Array<ttninjs>;}>
Example
api.content
.stream('image', {
q: 'panda',
p: ['FOGNRE', '-FOGNREEJ'],
agr: [20031, 20035],
sort: 'date:asc'
})
.then(result => {
// do something with result
})
getNotifications(mediaType)
List all notifications
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar"
- Only return items of this media type.
Returns
- Promise<Array<notification>>
Example
api.content.getNotifications('image').then(result => {
// do something with result
})
addNotificationMobile(mediaType, parameters)
Create a new mobile notification
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar"
- Only return items of this media type. - parameters:
q?: string
- A query string used for free text searching.p?: Array<string>
- A list of product codes. Only items matching at least one of these codes will be returned. The list of current product codes is here. Individual product codes may be prefixed with a '-' sign, indicating that the code should instead be excluded from the search result.agr?: Array<number>
- A list of customer agreement IDs belonging to the current user. Only items covered by at least one of there agreements will be returned.title: string
-
Returns
- Promise<notification>
Example
api.content
.addNotificationMobile('image', {
q: 'panda',
p: ['FOGNRE', '-FOGNREEJ'],
agr: [20031, 20035],
title: 'my mobile notification'
})
.then(result => {
// do something with result
})
addNotificationEmail(mediaType, parameters)
Create a new email notification
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar"
- Only return items of this media type. - parameters:
q?: string
- A query string used for free text searching.p?: Array<string>
- A list of product codes. Only items matching at least one of these codes will be returned. The list of current product codes is here. Individual product codes may be prefixed with a '-' sign, indicating that the code should instead be excluded from the search result.agr?: Array<number>
- A list of customer agreement IDs belonging to the current user. Only items covered by at least one of there agreements will be returned.title: string
-email: string
- The email address to send emails to.
Returns
- Promise<notification>
Example
api.content
.addNotificationEmail('image', {
q: 'panda',
p: ['FOGNRE', '-FOGNREEJ'],
agr: [20031, 20035],
title: 'my email notification',
email: 'my.email@address.com'
})
.then(result => {
// do something with result
})
addNotificationScheduledEmail(mediaType, parameters)
Create a new scheduled email notification
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar"
- Only return items of this media type. - parameters:
q?: string
- A query string used for free text searching.p?: Array<string>
- A list of product codes. Only items matching at least one of these codes will be returned. The list of current product codes is here. Individual product codes may be prefixed with a '-' sign, indicating that the code should instead be excluded from the search result.agr?: Array<number>
- A list of customer agreement IDs belonging to the current user. Only items covered by at least one of there agreements will be returned.tr?: "h" | "d" | "w" | "m" | "y"
- Time range: last hour, day, week, month, or year.title: string
-email: string
- The email address to send emails to.schedule: string
- A cron expression.timezone?: string
- A valid time zone name
Returns
- Promise<notification>
Example
api.content
.addNotificationScheduledEmail('image', {
q: 'panda',
p: ['FOGNRE', '-FOGNREEJ'],
agr: [20031, 20035],
tr: 'w',
title: 'my scheduled email notification',
email: 'my.email@address.com',
schedule: '0 0 12 * * MON-FRI',
timezone: 'Europe/Stockholm'
})
.then(result => {
// do something with result
})
updateNotificationMobile(mediaType, id, parameters)
Update an existing mobile notification
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar"
- Only return items of this media type. - id:
string
- An notification UUID string. - parameters:
q?: string
- A query string used for free text searching.p?: Array<string>
- A list of product codes. Only items matching at least one of these codes will be returned. The list of current product codes is here. Individual product codes may be prefixed with a '-' sign, indicating that the code should instead be excluded from the search result.agr?: Array<number>
- A list of customer agreement IDs belonging to the current user. Only items covered by at least one of there agreements will be returned.title: string
-
Returns
- Promise<notification>
Example
api.content
.updateNotificationMobile('image', '4a37869c-808f-496f-b549-3da0821ce187', {
q: 'panda',
p: ['FOGNRE', '-FOGNREEJ'],
agr: [20031, 20035],
title: 'my mobile notification'
})
.then(result => {
// do something with result
})
updateNotificationEmail(mediaType, id, parameters)
Update an existing email notification
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar"
- Only return items of this media type. - id:
string
- An notification UUID string. - parameters:
q?: string
- A query string used for free text searching.p?: Array<string>
- A list of product codes. Only items matching at least one of these codes will be returned. The list of current product codes is here. Individual product codes may be prefixed with a '-' sign, indicating that the code should instead be excluded from the search result.agr?: Array<number>
- A list of customer agreement IDs belonging to the current user. Only items covered by at least one of there agreements will be returned.title: string
-email: string
- The email address to send emails to.
Returns
- Promise<notification>
Example
api.content
.updateNotificationEmail('image', '4a37869c-808f-496f-b549-3da0821ce187', {
q: 'panda',
p: ['FOGNRE', '-FOGNREEJ'],
agr: [20031, 20035],
title: 'my email notification',
email: 'my.email@address.com'
})
.then(result => {
// do something with result
})
updateNotificationScheduledEmail(mediaType, id, parameters)
Update an existing scheduled email notification
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar"
- Only return items of this media type. - id:
string
- An notification UUID string. - parameters:
q?: string
- A query string used for free text searching.p?: Array<string>
- A list of product codes. Only items matching at least one of these codes will be returned. The list of current product codes is here. Individual product codes may be prefixed with a '-' sign, indicating that the code should instead be excluded from the search result.agr?: Array<number>
- A list of customer agreement IDs belonging to the current user. Only items covered by at least one of there agreements will be returned.tr?: "h" | "d" | "w" | "m" | "y"
- Time range: last hour, day, week, month, or year.title: string
-email: string
- The email address to send emails to.schedule: string
- A cron expression.timezone?: string
- A valid time zone name
Returns
- Promise<notification>
Example
api.content
.updateNotificationScheduledEmail(
'image',
'4a37869c-808f-496f-b549-3da0821ce187',
{
q: 'panda',
p: ['FOGNRE', '-FOGNREEJ'],
agr: [20031, 20035],
tr: 'w',
title: 'my scheduled email notification',
email: 'my.email@address.com',
schedule: '0 0 12 * * MON-FRI',
timezone: 'Europe/Stockholm'
}
)
.then(result => {
// do something with result
})
removeNotification(mediaType, id)
Remove an existing notification
Arguments
- mediaType:
"_all" | "image" | "video" | "graphic" | "text" | "feature" | "page" | "planning" | "calendar"
- Only return items of this media type. - id:
string
- An notification UUID string.
Returns
- Promise<string>
Example
api.content
.removeNotification('image', '4a37869c-808f-496f-b549-3da0821ce187')
.then(result => {
// do something with result
})
UserV1
getAgreements()
Get the current customer agreements.
Return a list of applicable customer agreements for the current user. An agreement that has a truthy value of isSuperAgreement will override any agreement of Subscription type.
Arguments
Returns
- Promise<Array<agreement>>
Example
api.user.getAgreements().then(result => {
// do something with result
})
getProfile()
Get the profile for the current user.
The user profile is an unstructured JSON object containing non-secret application data (settings and such). Web applications are free to access this information as they see fit.
Arguments
Returns
- Promise<{ }>
Example
api.user.getProfile().then(result => {
// do something with result
})
updateProfile(profile)
Update the profile for the current user.
Replaces the entire user profile with the object passed in the request body.
For more controlled updates of the user profile, use the
PUT /user/v1/profile/{property}
endpoint.
Arguments
- profile?:
{ }
Returns
- Promise<string>
Example
api.user.updateProfile({ property1: 'customValue' }).then(result => {
// do something with result
})
getProfileByProperty(property)
Get selected properties of the profile for the current user.
The user profile is an unstructured JSON object containing non-secret application data (settings and such). Web applications are free to access this information as they see fit. Often, applications are not interested in the whole user profile. This endpoint returns only selected properties.
Arguments
- property:
Array<string>
- A list of property names.
Returns
- Promise<{ }>
Example
api.user.getProfileByProperty(['property1', 'property2']).then(result => {
// do something with result
})
updateProfileByProperty(property, profile)
Update selected properties of the profile for the current user.
Replaces selected properties, but doesn't modify the rest of the user profile.
This is a more controlled version of the PUT /user/v1/profile
endpoint.
Given a profile
object like
{
"property1": { ... },
"property2": { ... },
...
}
and a property
parameter like property1,property2
, this endpoint will update
the given properties, but leave the rest of the user profile intact. Properties
present in profile
but not listed in property
will not be written.
Conversely, properties listed in property
but not present in profile
will
not be overwritten with null
.
Arguments
- property:
Array<string>
- A list of property names. - profile?:
{ }
Returns
- Promise<string>
Example
api.user
.updateProfileByProperty(['property1', 'property2'], {
property1: 'customValue'
})
.then(result => {
// do something with result
})
updateDevice(token, parameters)
Register a new mobile device.
Arguments
- token:
string
- - parameters:
type: "ios" | "ios-sandbox" | "android"
- The type of device:ios
(for the production environment)ios-sandbox
(for the APN sandbox)android
name?: string
- The name of this mobile device.model: string
- The model of this mobile device.
Returns
- Promise<string>
Example
api.user
.updateDevice(
'5a21a38a24857b344c66aadade0abf2a748fcacf2ddf466e83e4fcd1cefab66a',
{ type: 'ios', name: 'my iPhone', model: 'iPhone 8' }
)
.then(result => {
// do something with result
})
removeDevice(token)
Unregister a mobile device.
Arguments
- token:
string
-
Returns
- Promise<string>
Example
api.user
.removeDevice(
'5a21a38a24857b344c66aadade0abf2a748fcacf2ddf466e83e4fcd1cefab66a'
)
.then(result => {
// do something with result
})
CollectionV1
getCollections()
List all collections
Returns a list of all collections belonging to the current user.
Arguments
Returns
- Promise<Array<collection>>
Example
api.collection.getCollections().then(result => {
// do something with result
})
addCollection(collection)
Create a new collection.
Creates an new named collection for the current user. This operation is
asynchronous, and there may be a delay before the change is visible using the
GET /collection/v1/collection
endpoint.
Arguments
- collection:
{ 'name': string; 'public'?: boolean;}
Returns
- Promise<collection>
Example
api.collection.addCollection({ name: 'my collection' }).then(result => {
// do something with result
})
getCollection(id)
Get collection properties and contents
Returns all properties and contents of a single collection.
Arguments
- id:
string
- ID of a collection.
Returns
- Promise<collectionItem>
Example
api.collection.getCollection('123').then(result => {
// do something with result
})
updateCollection(id, collection)
Update collection properties
Updates an existing collection belonging to the current user. This operation is
asynchronous, and there may be a delay before the change is visible using the
GET /collection/v1/collection
endpoint.
Arguments
- id:
string
- ID of a collection. - collection:
{ 'name': string; 'public'?: boolean;}
Returns
- Promise<collection>
Example
api.collection
.updateCollection('123', { name: 'my collection' })
.then(result => {
// do something with result
})
removeCollection(id)
Remove an existing collection
Removes an existing collection belonging to the current user. This operation is
asynchronous, and there may be a delay before the change is visible using the
GET /collection/v1/collection
endpoint.
Arguments
- id:
string
- ID of a collection.
Returns
- Promise<string>
Example
api.collection.removeCollection('123').then(result => {
// do something with result
})
addCollectionItems(id, items)
Add items to collection
Adds any number of items to a given collection belonging to the current user.
The items must exist in the content database and be visible for the user. If
not, this call will still return successfully, but the collection remain
unchanged. This operation is asynchronous, and there may be a delay before
changes are visible using the GET /collection/v1/collection/{id}
endpoint.
Arguments
- id:
string
- ID of a collection. - items:
Array<{ 'uri': string;}>
Returns
- Promise<string>
Example
api.collection
.addCollectionItems('123', [{ uri: 'http://tt.se/media/image/sdltd8f4d87' }])
.then(result => {
// do something with result
})
removeCollectionItems(id, items)
Remove items from collection
Removes any number of items from a given collection belonging to the current
user. If one or more items do not currently belong to the collection, this call
will still return successfully, but those items will be ignored. This operation
is asynchronous, and there may be a delay before changes are visible using the
GET /collection/v1/collection/{id}
endpoint.
Arguments
- id:
string
- ID of a collection. - items:
Array<{ 'uri': string;}>
Returns
- Promise<string>
Example
api.collection
.removeCollectionItems('123', [
{ uri: 'http://tt.se/media/image/sdltd8f4d87' }
])
.then(result => {
// do something with result
})
Exported types
Interface ttninjs
interface ttninjs {
uri: string
type?:
| 'text'
| 'audio'
| 'video'
| 'picture'
| 'graphic'
| 'composite'
| 'planning'
| 'component'
| 'event'
mimetype?: string
representationtype?: 'complete' | 'incomplete' | 'associated'
profile?: 'PUBL' | 'DATA' | 'INFO' | 'RAW'
version?: string
firstcreated?: string
versioncreated?: string
versionstored?: string
embargoed?: string
embargoedreason?: string
date?: string
datetime?: string
enddate?: string
enddatetime?: string
job?: string
pubstatus?: 'usable' | 'withheld' | 'canceled' | 'replaced' | 'commissioned'
urgency?: number
copyrightholder?: string
copyrightnotice?: string
usageterms?: string
ednote?: string
language?: string
week?: number
webprio?: number
source?: string
commissioncode?: string
description_text?: string
description_usage?: string
body_text?: string
body_html5?: string
body_richhtml5?: string
body_event?: {
arena?: string
city?: string
address?: string
country?: string
eventurl?: string
eventphone?: string
eventweb?: string
organizer?: string
organizeraddress?: string
organizercity?: string
organizercountry?: string
organizerurl?: string
organizerphone?: string
organizermail?: string
eventstatus?: string
eventstatus_text?: string
region?: string
region_text?: string
municipality?: string
municipality_text?: string
eventtags?: string
eventtype?: string
eventtype_text?: string
note_extra?: string
note_pm?: string
accreditation?: string
extraurl?: string
createddate?: string
createdby?: string
changeddate?: string
changedby?: string
courtcasenumber?: string
}
body_sportsml?: string
body_pages?: {}
commissionedby?: Array<string>
person?: Array<{
name?: string
rel?: string
scheme?: string
code?: string
}>
organisation?: Array<{
name?: string
rel?: string
scheme?: string
code?: string
symbols?: Array<{
ticker?: string
exchange?: string
}>
}>
place?: Array<{
name?: string
rel?: string
scheme?: string
code?: string
geometry_geojson?: {
type?: 'Point'
coordinates?: Array<number>
}
}>
subject?: Array<{
name?: string
rel?: string
scheme?: string
code?: string
}>
event?: Array<{
name?: string
rel?: string
scheme?: string
code?: string
}>
object?: Array<{
name?: string
rel?: string
scheme?: string
code?: string
}>
infosource?: Array<{
name?: string
rel?: string
scheme?: string
code?: string
}>
title?: string
byline?: string
bylines?: Array<{
byline?: string
firstname?: string
lastname?: string
role?: string
email?: string
jobtitle?: string
internal?: string
phone?: string
initials?: string
affiliation?: string
}>
headline?: string
slug?: string
slugline?: string
located?: string
charcount?: number
wordcount?: number
renditions?: {}
associations?: {}
altids?: {
originaltransmissionreference?: string
}
originaltransmissionreference?: string
trustindicator?: Array<{
scheme?: string
code?: string
title?: string
href?: string
}>
$standard?: {
name?: string
version?: string
schema?: string
}
genre?: Array<{
name?: string
scheme?: string
code?: string
}>
signals?: {
pageproduct?: string
multipagecount?: number
paginae?: Array<string>
pagecode?: string
pagevariant?: string
}
product?: Array<{
name?: string
scheme?: string
code?: string
}>
replacing?: Array<string>
replacedby?: string
assignments?: {}
revisions?: Array<{
uri: string
slug?: string
replacing?: Array<string>
}>
sector?: 'INR' | 'UTR' | 'EKO' | 'KLT' | 'SPT' | 'FEA' | 'NOJ' | 'PRM'
fixture?: Array<{
name?: string
rel?: string
scheme?: string
code?: string
}>
advice?: Array<{
role?: 'publish'
environment?: Array<{
code?: string
scheme?: string
}>
importance?: {
code?: string
scheme?: string
}
lifetime?: {
code?: string
scheme?: string
}
}>
}
Interface agreement
interface agreement {
id?: number
description?: {}
type?: 'Subscription' | 'Direct' | 'Normal' | 'Sketch'
isSuperAgreement?: boolean
products?: Array<product>
}
Interface collection
interface collection {
id: string
owner: string
name: string
collDate: string
public?: boolean
}
Interface collectionItem
interface collectionItem {
id: string
owner: string
name: string
collDate: string
public?: boolean
items: Array<ttninjs>
}
Interface product
interface product {
name?: string
description?: {}
code?: string
}
Interface notification
interface notification {
id: string
title: string
type: 'mobile' | 'email' | 'scheduled-email'
mediaType:
| '_all'
| 'image'
| 'video'
| 'graphic'
| 'text'
| 'feature'
| 'page'
| 'planning'
| 'calendar'
q?: string
p?: Array<string>
agr?: Array<number>
schedule?: string
timezone?: string
email?: string
}
Interface facet
interface facet {
key?: string
count?: number
}