Search documents
Search one or more collections using natural language or keyword queries. Results are ranked by relevance using hybrid retrieval (dense + sparse). Pass collections (up to 5) to search several collections in one call and receive a single merged, relevance-ranked list with per-result origin labels.
/api/v1/search/queryAuthorization
BearerAuth API key authentication. Pass your key in the Authorization header as Bearer sk_live_.... An X-API-Key: sk_live_... header is also accepted as an alternative. Keys are created in the Redpine Connect dashboard under Settings > API Keys.
Keys come in two kinds. A live key (sk_live_...) searches real content and spends credits. A sandbox key (sk_test_...) returns canned results at no cost and never reaches licensed content, so you can build and test an integration before spending anything. Sandbox responses have the same shape as live ones and every result is marked synthetic, so going live is a matter of swapping the key. Check the X-Billing-Mode response header to confirm which you are using.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Provide exactly one of collection (single) or collections (multi-collection search).
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/api/v1/search/query" \ -H "Content-Type: application/json" \ -d '{ "query": "string" }'{ "discovery": { "callout": { "kind": "add_payment_method", "message": "string" }, "intent": "sources", "metricsNote": null, "nextActions": [ { "action": "string", "hint": "string" } ], "queryId": "string", "scopes": [ { "collection": "string", "displayName": "string", "issnValuesSeen": 0, "items": [ { "hIndex": null, "impactFactor": null, "issnL": null, "issns": [ "string" ], "kind": "journal", "publisher": null, "title": "string" } ], "note": null, "offset": 0, "publishers": [ "string" ], "rankedBy": null, "sampledEntries": 0, "shown": 0, "titleOnly": 0, "total": 0, "truncatedInventory": false, "unranked": [ { "hIndex": null, "impactFactor": null, "issnL": null, "issns": [ "string" ], "kind": "journal", "publisher": null, "title": "string" } ], "unresolvedIssns": 0 } ], "text": "string", "topic": null }, "filterWarnings": null, "filtersApplied": null, "journalMetricExpansions": null, "latencyMs": 0, "queryId": "string", "results": [ { "collection": null, "id": "string", "metadata": null, "relevance": null, "text": "string" } ]}Preview search results without charging POST
Run the same pipeline as POST /api/v1/search/query -- same entitlement checks, same retraction filtering, same relevance ranking -- but never charge for it. Every result of a new preview comes back locked, with a teaser snippet in `text` and the cost to unlock it. Works even at a zero balance. Consumes no credits, no trial query and no quota. Call POST /api/v1/search/unlock with the returned `queryId` to pay for and receive some or all of the results in full. Send an `Idempotency-Key` header to make retries safe: a repeat with the same key and body returns the original `queryId` instead of buying the same results again under a new one.
Pay for previewed results and receive them in full POST
Charges only for results not already unlocked by an earlier call against the same `queryId` -- re-sending the same ids costs nothing. Omit `resultIds` (or pass `null`) to unlock everything from the preview. Set `includeFigures` to receive figure images as base64 in `metadata.figures[].image_data`. Images are returned for every result unlocked under this `queryId`, including ones unlocked by an earlier call -- so re-sending ids you have already paid for is how you fetch images you skipped the first time, and it charges nothing. At most 50 images are fetched per call; the ids in `resultIds` (or, when it is omitted, the results this call unlocked) get that budget first. Figures are free: they are not priced into the token cost, so the flag changes latency and response size and never the charge. Use the preview's `figureCount` to decide whether to ask.