Overview

API Endpoints

SeekStorm is a Search as a service and a Crawler as a Service: index and search your own documents or build your custom web and news search API. Documents and websites are indexed in real-time and the search API allows instant full-text search.

The SeekStorm REST API consists of three resources: indices, documents and crawljobs. We use resource-oriented URLs, accept JSON-encoded request bodies, return JSON-encoded responses, and utilize standard HTTP response codes and verbs. Regardless of the status code, each response contains a status object providing consistent information about the success or failure of the request. The REST API supports gzip, br (brotli), and deflate compression, both for requests and responses.

Read our Quickstart guide on how to create a SeekStorm account and project. Learn how to use dashboard and REST API to index and query documents.

Create index

POST https://{server}.seekstorm.com/indices

Create a new index.
Create index either programmatically via REST API or manually in the dashboard.
Supports CORS cross-origin resource sharing.

Body-Parameters:

name string

A short name to describe the indexes purpose. Purely informational.

fields object

fields
Before indexing documents the index structure has to be defined by the fields object. The keys of the fields object are the field names and the values contain the field options. The field optinons define how the individual fields will be indexed and/or stored.

The number of facet fields (type stringFacet, integerFacet, floatFacet, dateFacet) is limited to 10 per index. The number of index fields (types: title, url, text, index) together is limited to an additional 16. Of this, the number of type title, url, text is each limited to 1. The number of fields of NoIndex type is unlimited. NoIndex fields can be of any JSON type (number, string, boolean). They are not indexed and not searchable. But with the property store=true they are stored and can be retrieved as a payload in the search results. The string length of any field name is limited to 100 characters.

{FIELD-NAME} object

createAutocompleteDictionary boolean default: true

Create an autocomplete dictionary from all terms of all indexed fields of all documents of this index (default=true). This works for all languages and domain or user specific vocabulary. If enabled, then for this index an individual autocompletion dictionary is created. This dictionary is used for autocompletion in query documents, if there the parameter completion=true is set.

stemming string default: NounLemmatizationEN

Singular and plural forms of nouns are folded together during indexing and search. Searching for "cars" will return documents containing "car" and vice versa. Verbs are not stemmed as for the average use case that would introduce too much noise and degrade the search result precision.
Off : stemming disabled
NounLemmatizationEN : stemming of English nouns
NounLemmatizationDE : stemming of German nouns

Get all indices

GET https://{server}.seekstorm.com/indices

Get all active indices belonging to the the API key
Get all indices either programmatically via REST API or manually in the dashboard.
Supports CORS cross-origin resource sharing.

This endpoint has no parameters

Get index

GET https://{server}.seekstorm.com/indices/{indexId}

Get all properties and stats of the targeted index.
Get index either programmatically via REST API or manually in the dashboard.
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId integer

ID of the targeted index

Query-Parameters:

facetvalueslength integer

Facet values length sets the maximum number of returned values per facet field, if there are too many distinct values. The parameter facetvalueslength allows limiting the number of returned distinct values per facet field (default=10). With facetvalueslength=0 no facts are returned at all. The values are sorted by the frequency of the appearance of the value within the indexed documents matching the query in descending order. Example: facetvalueslength=5.

facetvaluesfilter string

Facet values filter allows to filter the returned facet values to those matching a given prefix, if there are too many distinct values per facet field. Example: facetvaluesfilter={"language":"ger","brand":"a"}.

Delete index

DELETE https://{server}.seekstorm.com/indices/{indexId}

Delete the targeted index.
Delete index either programmatically via REST API or manually in the dashboard.
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId integer

ID of the targeted index

Create/Reset public key

POST https://{server}.seekstorm.com/indices/{indexId}/public-key

API keys are required to authorize the user to carry out operations within his project. Main API keys are valid within your whole project, for all indices, and all operations. Public API keys are valid only for a single index and have limited rights. They only allow two operations: "query document" and "get document(s)", and only for the single index, they are assigned to. All other operations, especially those adding, changing, or deleting information are available for main API keys only. Public API keys are distinguished by the prefix pub_ followed by a 32-char code.

While main API keys should always be kept confidential, public API keys can be used in end-user facing front-end code. A typical example is site search.

Every index can be assigned a single public API key. Per default, no public API key is assigned. Public API keys can be generated by any user possessing the main API key. With every request to create a public API key a new public API key is generated, while the previous one is invalidated.

All operations caused by the usage of a public API key are deducted from the contingent of your main API key (the chosen plan of your project).
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId integer

Index document(s)

POST https://{server}.seekstorm.com/indices/{indexId}/documents

Add a single document or an array of documents into the targeted index. Before indexing documents, the index and its fields have to be created with create index.
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId integer

ID of the targeted index

Body-Parameters:

oneOf

object

Document
A document is any valid JSON document, with any number of fields.
Every field is defined by a key-value pair, with the key as field name (string) and the value of any valid JSON type (string, number, array, boolean, object).

See Create index for the meaning of the different field types: title, url, text, index, boost, noIndex, stringFacet, integerFacet, floatFacet, dateFacet.

A field of type boost defines the terms for which a document will rank above all other search results for this query. This might be useful for advertising, promotion or sales campaigns.

The maximum size of a single document is limited to 1 MByte

Returned documents contain following additional auto generated keys:
_docId - document ID, created at index time
_summary - KWIC (keyword in context), created at query time, the document field from which the result field _summary field is derieved, is defined with the query parameter summary
_indexDate - index date, created at index time: the number of milliseconds that have passed between now and the beginning of 1970 (in Unix time format).

or

array of objects

An array of documents

The maximum size of the array of documents to upload/index within one POST request is limited to 100 MByte. Larger document collections should be split into chunks with a maximumsize of 100 MByte. The maximum size of a single document is limited to 1 MByte

Query documents (GET)

GET https://{server}.seekstorm.com/indices/{indexId}/documents

Query documents in the targeted index.
Query documents either programmatically via REST API or manually in the dashboard.
Supports CORS cross-origin resource sharing.

Warning: When using the API cross-domain (e.g. with JavaScript in the browser), each GET request with a changing query causes an additional CORS OPTIONS request which can not be cached. The additional HTTP roundtrip time significantly increases the latency. It is therefore advised to use Query documents (POST) instead.

Depending on your chosen plan, query documents is subject to rate limits. When exceeding the rate limit for 10 consecutive requests, the requests will return an HttpStatusCode 429 "TooManyRequests", with the information "Rate limit exceeded". After the average requests per second fall again below the threshold, the request will again be answered successfully. The longer and more intense the rate limit is exceeded, the longer the requests are blocked.

Path-Parameters:

indexId integer

ID of the targeted index

Query-Parameters:

query string

Query to search documents by. Needs do be encoded/escaped before sending (C# : System.Uri.EscapeDataString or System.Web.HttpUtility.UrlEncode; JavaScript: encodeURIComponent), use "" for phrase, - for NOT. Additional field filters like site: and in{fieldname}: and allin{fieldname}: are allowed within the query string - see Create Index. If the query is empty then all documents in the range [offset...offset+length] are returned, sorted by recency of indexDate.
Performance considerations: If an empty query is used in conjunction with the parameter sort, filter, or ranges potentially the entire index ist processed. This might affect the query latency. Especially the ranges parameter is expensive.

queryType string default: search enum: search, instant, suggestionsOnly

search : search exactly for the submitted query, and additionally return spelling correction and/or query completion suggestion.
instant : automatically rewrite the submitted query with the best spelling correction and/or query completion suggestion and return the results for the modified query.
suggestionsOnly : return only spelling correction and/or query completion suggestions for the submitted query, but no search results.

length integer default: 10

Maximum number of results that should be returned

offset integer default: 1

Number of documents the result should be offset by - used for pagination

correction boolean default: true

enable spelling correction suggestions

completion boolean default: false

enable query completion suggestions

fields array of strings default: [All fields]

fields allows to restrict the search to specific fields. If no fields parameter is specified then per default all fields are searched. Example:
fields=["title","text","url"]

result array of strings default: {All fields will be returned}

defines fields which are returned in results

summary string

defines which field is used to create a KWIC (keyword in context) summary. If undefined no summary will be created.

suggestionslength integer

Maximum number of suggestions that should be returned

facetvalueslength integer

Facet values length sets the maximum number of returned values per facet field, if there are too many distinct values. The parameter facetvalueslength allows limiting the number of returned distinct values per facet field (default=10). With facetvalueslength=0 no facts are returned at all. The values are sorted by the frequency of the appearance of the value within the indexed documents matching the query in descending order. Example: facetvalueslength=5.

facetvaluesfilter string

Facet values filter allows to filter the returned facet values to those matching a given prefix, if there are too many distinct values per facet field.
Examples:
facetvaluesfilter={"field":"language","prefix":"ger"}
facetvaluesfilter=[{"field":"language","prefix":"ger"},{"field":"brand","prefix":"a"}]

sort string

Sort field and order: Search results are sorted by the specified facet field, either in ascending or descending order. If no sort field is specified, then the search results are sorted by rank in descending order per default. If there are multiple sort field specified, then the results are ordered by the first field, and then by the second field. Example:
sort={"field":"price","order":"desc"}
sort=[{"field":"price","order":"desc"},{"field":"language","order":"asc"}]

Custom ranking

The sort parameter takes a single or multiple facet fields as sorting criteria. Multiple sort fields are combined by a "sort by, then sort by"-algorithm (sometimes called "tie-breaking"-algorithm). The results are sorted by the first field, and only for those results where the first field value is identical (tie) the results are sub-sorted by the second field, until the n-th field value is either not equal or the last field is reached. Seekstorm provides a special _rank field, an internally calculated rank reflecting how relevant the result is for a given search query (phrase match, match in title etc.). The final result ranking can be customized by using and combining the special _rank field and any of the other sort fields as primary, secondary or n-th search criterium. During indexing, Seekstorm recognizes fields of type boost, which allow to define terms for which a document will rank above all other search results for this query. This might be useful for advertising, promotion or sales campaigns.

filter string

Facet filter: Search results are filtered to documents matching specific values in the facet fields. The filter parameter filters the returned results to those documents both matching the query AND matching for all (boolean AND) stated facet filter fields at least one (boolean OR) of the stated values. If the query is changed then both facet counts and search results are changed. If the facet filter is changed then only the search results are changed, while facet counts remain unchanged. The facet counts depend only from the query and not which facet filters are selected. Examples:
filter={"field":"language","value":"german"} (facet filter)

filter=[{"field":"language","value":"german"},{"field":"brand","value":["apple","google"]}] (value filter)

filter={"field":"price","value":{"from":3000,"to":5000,"type":"InclusiveInclusive"}} (range filter: 3000..5000, including boundaries)

filter={"field":"price","value":{"from":3000,"type":"InclusiveInclusive"}} (range filter >= 3000)

filter={"field":"price","value":{"to":5000,"type":"InclusiveInclusive"}} (range filter: <= 5000)

ranges string

Numeric range facet definition: For range facets, we have to explicitly define the ranges we want to distinguish and count. The ranges can be defined arbitrarily. Different bucket widths are allowed within the same range facet field. The lower boundary is defined explicitly (including the number itself). The upper boundary is defined implicitly by the following boundary (excluding the number itself) or the maximum value allowed for the numeric type. The ranges may be defined differently for each query. This allows to define facets ranges like last hour=current date - 1 hour, last day=current date - 24 hours, where the meaning of last hour changes dynamically, when you look at the absolute value of the date of the indexed documents you want to include in the results. Examples:
ranges={ "field":"score", "sectionType":"ExclusiveExlusive","sections":[10,100] }
The number of of distinct ranges per range facet field is limited to 100, excess ranges are ignored.

group string default: No grouping

The query parameter group allows the grouping of the returned results into a nested structure, where all results with the same field value are grouped together and limited to a number specified by the length property. Often results are dominated by results with the same value in a specific field, while the existing diversity is hidden in the long tail and not immediately visible. E.g. all search results are from the same popular domain or all shirts are from the same company or color. The group parameter allows enforcing variety in the results, by limiting results with the same value for a given facet field to a number specified by the length property. When length is set to 1 then all results are distinct for the specified field value. The field property defines for which field the results with the same field value will be grouped together and limited or distinct. Together with the order property it also defines the sort order of the groups. The length property defines how many results for the same field value will be returned. The groups are sorted by the field value of the group (which is identical for all results within the same group), while the sort order is defined by the order property. The results within a group are sorted as defined by the query parameter sort.
Example: group={"field":"color","order":"asc","length":3}

Update document by query

PATCH https://{server}.seekstorm.com/indices/{indexId}/documents

Update a single document in the targeted index. The document is specified with a query (like in query document). If the query matches none or multiple documents an error will be returned.
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId integer

ID of the targeted index

Query-Parameters:

query string

Query to find the desired document. Needs do be encoded/escaped before sending (C# : System.Uri.EscapeDataString or System.Web.HttpUtility.UrlEncode; JavaScript: encodeURIComponent), use "" for phrase, - for NOT. Additional field filters like "site:" and "in{fieldname}:" are allowed - see Create Index.

Delete documents by query

DELETE https://{server}.seekstorm.com/indices/{indexId}/documents

Delete a single or multiple documents in the targeted index. The documents are specified with a query (like in query document). The maximum number of documents to be deleted can be specified with parameter max (default=1).
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId integer

ID of the targeted index

Query-Parameters:

query string

Query to find the desired document(s). Needs do be encoded/escaped before sending (C# : System.Uri.EscapeDataString or System.Web.HttpUtility.UrlEncode; JavaScript: encodeURIComponent), use "" for phrase, - for NOT. Additional field filters like "site:" and "in{fieldname}:" are allowed - see Create Index.

max integer default: 1

The amount of how many documents matching the query at most will be deleted

Get document

GET https://{server}.seekstorm.com/indices/{indexId}/documents/{documentId}

Get the targeted document.
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId integer

ID of the targeted index. The ID is returned by "Index document". Alternatively can be addressed by a query string.

documentId string

ID of the targeted document

Update document

PATCH https://{server}.seekstorm.com/indices/{indexId}/documents/{documentId}

Update the targeted document

Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId integer

ID of the targeted index. The ID is returned by "Index document". Alternatively can be addressed by a query string.

documentId string

ID of the targeted document

Delete document

DELETE https://{server}.seekstorm.com/indices/{indexId}/documents/{documentId}

Delete the targeted document

Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId integer

ID of the targeted index. The ID is returned by "Index document". Alternatively can be addressed by a query string.

documentId string

ID of the targeted document

Query documents (POST)

POST https://{server}.seekstorm.com/indices/{indexId}/documents/query

Query documents in the targeted index.
Query documents either programmatically via REST API or manually in the dashboard.
Supports CORS cross-origin resource sharing.

Depending on your chosen plan, query documents is subject to rate limits. When exceeding the rate limit for 10 consecutive requests, the requests will return an HttpStatusCode 429 "TooManyRequests", with the information "Rate limit exceeded". After the average requests per second fall again below the threshold, the request will again be answered successfully. The longer and more intense the rate limit is exceeded, the longer the requests are blocked.

Path-Parameters:

indexId integer

ID of the targeted index

Body-Parameters:

query string

Query to search documents by. Needs do be encoded/escaped before sending (C# : System.Uri.EscapeDataString or System.Web.HttpUtility.UrlEncode; JavaScript: encodeURIComponent), use "" for phrase, - for NOT. Additional field filters like site: and in{fieldname}: and allin{fieldname}: are allowed within the query string - see Create Index. If the query is empty then all documents in the range [offset...offset+length] are returned, sorted by recency of indexDate.
Performance considerations: If an empty query is used in conjunction with the parameter sort, filter, or ranges potentially the entire index ist processed. This might affect the query latency. Especially the ranges parameter is expensive.

queryType string enum: search, instant, suggestionsOnly

search : search exactly for the submitted query, and additionally return spelling correction and/or query completion suggestion.

instant : automatically rewrite the submitted query with the best spelling correction and/or query completion suggestion and return the results for the modified query.

suggestionsOnly : return only spelling correction and/or query completion suggestions for the submitted query, but no search results.

length integer default: 10

Maximum number of results that should be returned

offset integer default: 0

Number of documents the result should be offset by - used for pagination

correction boolean default: true

enable spelling correction suggestions,
with a maximum Damerau-Levenshtein edit distance of 2. See details.

completion boolean default: true

enable query completion suggestions. See details.

fields array of strings

fields allows to restrict the search to specific fields. If no fields parameter is specified then per default all fields are searched. Field names are case-insensitive. Example:
"fields":["title","text","url"]

result array of strings

defines fields which are returned in results

summary string

defines which field is used to create a KWIC (keyword in context) summary. If undefined no summary will be created.

suggestionslength integer default: 4

Maximum number of suggestions that should be returned, for correction or completion.

facetvalueslength integer default: 10

Facet values length sets the maximum number of returned values per facet field, if there are too many distinct values. The parameter facetvalueslength allows limiting the number of returned distinct values per facet field (default=10). With facetvalueslength=0 no facts are returned at all. The values are sorted by the frequency of the appearance of the value within the indexed documents matching the query in descending order. Example: facetvalueslength=5.

facetvaluesfilter oneOf

Facet values filter allows to filter the returned facet values to those matching a given prefix, if there are too many distinct values per facet field. Examples:
"facetvaluesfilter":{"field":"language","prefix":"ger"}
"facetvaluesfilter":[{"field":"language","prefix":"ger"},{"field":"brand","prefix":"a"}]

object

FacetValueFilter
Each filter entry defines a filters for a specific field.

or

array of objects

filter oneOf default: Test

Facet filter: Search results are filtered to documents matching specific values in the facet fields. The filter parameter filters the returned results to those documents both matching the query AND matching for all (boolean AND) stated facet filter fields at least one (boolean OR) of the stated values. If the query is changed then both facet counts and search results are changed. If the facet filter is changed then only the search results are changed, while facet counts remain unchanged. The facet counts depend only from the query and not which facet filters are selected. Examples:
"filter":{"field":"language","value":"german"} (facet filter)

"filter":[{"field":"language","value":"german"},{"field":"brand","value":["apple","google"]}] (value filter)

"filter":{"field":"price","value":{"from":3000,"to":5000,"type":"InclusiveInclusive"}} (range filter: 3000..5000, including boundaries)

"filter":{"field":"price","value":{"from":3000,"type":"InclusiveInclusive"}} (range filter >= 3000)

"filter":{"field":"price","value":{"to":5000,"type":"InclusiveInclusive"}} (range filter: <= 5000)

object

FilterEntry
Each filter entry defines a filters for a specific field.

or

array of objects

ranges oneOf

Numeric range facet definition: For range facets, we have to explicitly define the ranges we want to distinguish and count. The ranges can be defined arbitrarily. Different bucket widths are allowed within the same range facet field. The lower boundary is defined explicitly (including the number itself).
The upper boundary is defined implicitly by the following boundary (excluding the number itself) or the maximum value allowed for the numeric type.
The ranges may be defined differently for each query. This allows to define facets ranges like last hour=current date - 1 hour, last day=current date - 24 hours, where the meaning of last hour changes dynamically, when you look at the absolute value of the date of the indexed documents you want to include in the results. Examples:
"ranges":{
"field":"score",
"sectionType":"ExclusiveExlusive",
"sections":[10,100]
}


The number of of distinct ranges per range facet field is limited to 100, excess ranges are ignored.

object

Range entry
Defines the range sections for a number field (of type dateFacet, integerFacet, floatFacet).

or

array of objects

sort oneOf

Sort field and order: Search results are sorted by the specified facet field, either in ascending or descending order. If no sort field is specified, then the search results are sorted by rank in descending order per default. If there are multiple sort field specified, then the results are ordered by the first field, and then by the second field. Field names are case-insensitive. Example:

"sort":{"field":"price","order":"desc"}
"sort":[{"field":"price","order":"desc"},{"field":"language","order":"asc"}]

Custom ranking

The sort parameter takes a single or multiple facet fields as sorting criteria. Multiple sort fields are combined by a "sort by, then sort by"-algorithm (sometimes called "tie-breaking"-algorithm). The results are sorted by the first field, and only for those results where the first field value is identical (tie) the results are sub-sorted by the second field, until the n-th field value is either not equal or the last field is reached.

Seekstorm provides a special _rank field, an internally calculated rank reflecting how relevant the result is for a given search query (phrase match, match in title etc.). The final result ranking can be customized by using and combining the special _rank field and any of the other sort fields as primary, secondary or n-th search criterium.

During indexing, Seekstorm recognizes fields of type boost, which allow to define terms for which a document will rank above all other search results for this query. This might be useful for advertising, promotion or sales campaigns.

object

Sort entry
Defines by which facet field and sort order the search results are sorted.

or

array of objects

group object default: No grouping

The query parameter group allows the grouping of the returned results into a nested structure, where all results with the same field value are grouped together and limited to a number specified by the length property.
Often results are dominated by results with the same value in a specific field, while the existing diversity is hidden in the long tail and not immediately visible. E.g. all search results are from the same popular domain or all shirts are from the same company or color.
The group parameter allows enforcing variety in the results, by limiting results with the same value for a given facet field to a number specified by the length property. When length is set to 1 then all results are distinct for the specified field value.
The field property defines for which field the results with the same field value will be grouped together and limited or distinct. Together with the order property it also defines the sort order of the groups. The length property defines how many results for the same field value will be returned.
The groups are sorted by the field value of the group (which is identical for all results within the same group), while the sort order is defined by the order property. The results within a group are sorted as defined by the query parameter sort.

field string

The field property defines for which field the number of results with the same field value will be limited or distinct. It also defines the sort order of the groups. The field must be of field type stringFacet, integerFacet, floatFacet or dateFacet.
Value groups: If the field is of field type stringFacet then a group is created for each distinct value occuring in that field. E.g. group per domain, company, country, color, name.
Range groups: If the field is of field type integerFacet, floatFacet or dateFacet AND ranges are defined for that field, then a group is created for each defined range section. E.g. group per price range, by sallary range, per data range.

order string default: asc enum: asc, desc

Groups are ordered by field value, in the order defined by the order parameter (asc or desc).

length number default: 3

Length defines the maximum number of results per group, the results are sorted within groups by the sort parameter.
Top-k results: The results within a group are not just limited to n=length arbitrary results matching the group field condition, but top-k (=length) results according to the sort parameter, e.g. top-k most relevant news per time-period group, or the top-k least expensive cars per color group.

Create Crawljob(s)

POST https://{server}.seekstorm.com/indices/{indexId}/crawljobs

Create crawljob(s) creates either a single crawljob or a list of crawljobs.

Before creating a crawljob you have to create an index with create index, where the crawljob will store the crawled documents. The following mandatory fields of specific field types are required for crawljob compatibility:

title title stored
content text stored
url url stored
domain noindex stored

Any auxiliaryFields defined in create crawljob must be defined in create index as well.
Supports CORS cross-origin resource sharing.

Disclaimer: SeekStorm crawling is intended for consensual crawling only. You need to own or obtain all rights and licenses required to crawl the content and you need to obey all restrictions and limits imposed by the website owner. SeekStorm doesn't allow, encourage nor provide tools (e.g. proxies) to break restrictions imposed by the website owner. Please see our terms of service for detailed information.

Path-Parameters:

indexId string

ID of the targeted index

Body-Parameters:

oneOf

object

Crawljob
Definition of crawljob parameters

or

array of objects

A list of crawljobs

Get all Crawljobs

GET https://{server}.seekstorm.com/indices/{indexId}/crawljobs

Get crawljob retrieves information about all crawljobs of a specific index.
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId string

ID of the targeted index

Get crawljob

GET https://{server}.seekstorm.com/indices/{indexId}/crawljobs/{crawljobId}

Get crawljob retrieves information about a specific crawljob.
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId string

ID of the targeted index

crawljobId string

ID of the targeted crawljob

Delete crawljob

DELETE https://{server}.seekstorm.com/indices/{indexId}/crawljobs/{crawljobId}

Delete crawljob deletes a specific crawljob.
Supports CORS cross-origin resource sharing.

Path-Parameters:

indexId string

ID of the targeted index

crawljobId string

ID of the targeted crawljob