Search tech news stories by keyword
Searches stories by keyword, filtered by time window and minimum points, sorted by relevance or date.
Request
GEThttps://tech-news.p.apihiver.com/v1/search?q=python&limit=3
*
String. Keywords, e.g. 'rust', 'openai', 'kubernetes'.
String. How far back: 1h, 6h, 12h, 1d, 3d, 1w, 2w, 1m, 3m, 1y (default
1m). String. newest or relevance (default
newest). Number. Only stories with at least this many upvotes (0–10000, default
0). Number. Maximum number of results (1–100, default
20). Language
Client
1curl --request GET \
2 --url 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3' \
3 --header 'Accept: application/json' \
4 --header 'X-API-Key: YOUR_API_KEY'Search tech news stories by keyword: Tech News API reference
Searches stories by keyword, filtered by time window and minimum points, sorted by relevance or date. This endpoint is part of the Tech News API: Top, new and best tech stories from Hacker News, full-text news search, story details with comments, and Ask/Show HN.
Search tech news stories by keyword: example requests in every language
GET /v1/search in Shell (cURL)
curl --request GET \
--url 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3' \
--header 'Accept: application/json' \
--header 'X-API-Key: YOUR_API_KEY'GET /v1/search in Shell (HTTPie)
http GET 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3' \
Accept:application/json \
X-API-Key:YOUR_API_KEYGET /v1/search in Shell (Wget)
wget --quiet \
--method GET \
--header 'Accept: application/json' \
--header 'X-API-Key: YOUR_API_KEY' \
--output-document \
- 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3'GET /v1/search in Node.js (http)
const http = require('https');
const options = {
method: 'GET',
hostname: 'tech-news.p.apihiver.com',
port: null,
path: '/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3',
headers: {
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY'
}
};
const req = http.request(options, function (res) {
const chunks = [];
res.on('data', function (chunk) {
chunks.push(chunk);
});
res.on('end', function () {
const body = Buffer.concat(chunks);
console.log(body.toString());
});
});
req.end();GET /v1/search in Node.js (Request)
const request = require('request');
const options = {
method: 'GET',
url: 'https://tech-news.p.apihiver.com/v1/search',
qs: {
q: 'python',
timespan: '{timespan}',
sort: '{sort}',
min_points: '{min_points}',
limit: '3'
},
headers: {Accept: 'application/json', 'X-API-Key': 'YOUR_API_KEY'}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});GET /v1/search in Node.js (Unirest)
const unirest = require('unirest');
const req = unirest('GET', 'https://tech-news.p.apihiver.com/v1/search');
req.query({
q: 'python',
timespan: '{timespan}',
sort: '{sort}',
min_points: '{min_points}',
limit: '3'
});
req.headers({
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY'
});
req.end(function (res) {
if (res.error) throw new Error(res.error);
console.log(res.body);
});GET /v1/search in Node.js (Axios)
const axios = require('axios').default;
const options = {
method: 'GET',
url: 'https://tech-news.p.apihiver.com/v1/search',
params: {
q: 'python',
timespan: '{timespan}',
sort: '{sort}',
min_points: '{min_points}',
limit: '3'
},
headers: {Accept: 'application/json', 'X-API-Key': 'YOUR_API_KEY'}
};
try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}GET /v1/search in Node.js (Fetch)
const fetch = require('node-fetch');
const url = 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3';
const options = {
method: 'GET',
headers: {Accept: 'application/json', 'X-API-Key': 'YOUR_API_KEY'}
};
try {
const response = await fetch(url, options);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}GET /v1/search in JavaScript (XMLHttpRequest)
const data = null;
const xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener('readystatechange', function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open('GET', 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3');
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('X-API-Key', 'YOUR_API_KEY');
xhr.send(data);GET /v1/search in JavaScript (Axios)
import axios from 'axios';
const options = {
method: 'GET',
url: 'https://tech-news.p.apihiver.com/v1/search',
params: {
q: 'python',
timespan: '{timespan}',
sort: '{sort}',
min_points: '{min_points}',
limit: '3'
},
headers: {Accept: 'application/json', 'X-API-Key': 'YOUR_API_KEY'}
};
try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}GET /v1/search in JavaScript (Fetch)
const url = 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3';
const options = {
method: 'GET',
headers: {Accept: 'application/json', 'X-API-Key': 'YOUR_API_KEY'}
};
try {
const response = await fetch(url, options);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}GET /v1/search in JavaScript (jQuery)
const settings = {
async: true,
crossDomain: true,
url: 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3',
method: 'GET',
headers: {
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY'
}
};
$.ajax(settings).done(function (response) {
console.log(response);
});GET /v1/search in Python (http.client)
import http.client
conn = http.client.HTTPSConnection("tech-news.p.apihiver.com")
headers = {
'Accept': "application/json",
'X-API-Key': "YOUR_API_KEY"
}
conn.request("GET", "/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))GET /v1/search in Python (Requests)
import requests
url = "https://tech-news.p.apihiver.com/v1/search"
querystring = {"q":"python","timespan":"{timespan}","sort":"{sort}","min_points":"{min_points}","limit":"3"}
headers = {
"Accept": "application/json",
"X-API-Key": "YOUR_API_KEY"
}
response = requests.get(url, headers=headers, params=querystring)
print(response.json())GET /v1/search in PHP (cURL)
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Accept: application/json",
"X-API-Key: YOUR_API_KEY"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}GET /v1/search in PHP (Guzzle)
<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3', [
'headers' => [
'Accept' => 'application/json',
'X-API-Key' => 'YOUR_API_KEY',
],
]);
echo $response->getBody();GET /v1/search in PHP (PECL HTTP v1)
<?php
$request = new HttpRequest();
$request->setUrl('https://tech-news.p.apihiver.com/v1/search');
$request->setMethod(HTTP_METH_GET);
$request->setQueryData([
'q' => 'python',
'timespan' => '{timespan}',
'sort' => '{sort}',
'min_points' => '{min_points}',
'limit' => '3'
]);
$request->setHeaders([
'Accept' => 'application/json',
'X-API-Key' => 'YOUR_API_KEY'
]);
try {
$response = $request->send();
echo $response->getBody();
} catch (HttpException $ex) {
echo $ex;
}GET /v1/search in PHP (PECL HTTP v2)
<?php
$client = new http\Client;
$request = new http\Client\Request;
$request->setRequestUrl('https://tech-news.p.apihiver.com/v1/search');
$request->setRequestMethod('GET');
$request->setQuery(new http\QueryString([
'q' => 'python',
'timespan' => '{timespan}',
'sort' => '{sort}',
'min_points' => '{min_points}',
'limit' => '3'
]));
$request->setHeaders([
'Accept' => 'application/json',
'X-API-Key' => 'YOUR_API_KEY'
]);
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();GET /v1/search in Java (AsyncHttp)
AsyncHttpClient client = new DefaultAsyncHttpClient();
client.prepare("GET", "https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3")
.setHeader("Accept", "application/json")
.setHeader("X-API-Key", "YOUR_API_KEY")
.execute()
.toCompletableFuture()
.thenAccept(System.out::println)
.join();
client.close();GET /v1/search in Java (java.net.http)
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3"))
.header("Accept", "application/json")
.header("X-API-Key", "YOUR_API_KEY")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());GET /v1/search in Java (OkHttp)
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3")
.get()
.addHeader("Accept", "application/json")
.addHeader("X-API-Key", "YOUR_API_KEY")
.build();
Response response = client.newCall(request).execute();GET /v1/search in Java (Unirest)
HttpResponse<String> response = Unirest.get("https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3")
.header("Accept", "application/json")
.header("X-API-Key", "YOUR_API_KEY")
.asString();GET /v1/search in C# (HttpClient)
using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3"),
Headers =
{
{ "Accept", "application/json" },
{ "X-API-Key", "YOUR_API_KEY" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}GET /v1/search in C# (RestSharp)
var client = new RestClient("https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3");
var request = new RestRequest("", Method.Get);
request.AddHeader("Accept", "application/json");
request.AddHeader("X-API-Key", "YOUR_API_KEY");
var response = client.Execute(request);GET /v1/search in Go (NewRequest)
package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Accept", "application/json")
req.Header.Add("X-API-Key", "YOUR_API_KEY")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}GET /v1/search in Ruby (net::http)
require 'uri'
require 'net/http'
url = URI("https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Accept"] = 'application/json'
request["X-API-Key"] = 'YOUR_API_KEY'
response = http.request(request)
puts response.read_bodyGET /v1/search in Swift (NSURLSession)
import Foundation
let headers = [
"Accept": "application/json",
"X-API-Key": "YOUR_API_KEY"
]
let request = NSMutableURLRequest(url: NSURL(string: "https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
print(error as Any)
} else {
let httpResponse = response as? HTTPURLResponse
print(httpResponse)
}
})
dataTask.resume()GET /v1/search in Objective-C (NSURLSession)
#import <Foundation/Foundation.h>
NSDictionary *headers = @{ @"Accept": @"application/json",
@"X-API-Key": @"YOUR_API_KEY" };
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10.0];
[request setHTTPMethod:@"GET"];
[request setAllHTTPHeaderFields:headers];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSLog(@"%@", httpResponse);
}
}];
[dataTask resume];GET /v1/search in Kotlin (OkHttp)
val client = OkHttpClient()
val request = Request.Builder()
.url("https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3")
.get()
.addHeader("Accept", "application/json")
.addHeader("X-API-Key", "YOUR_API_KEY")
.build()
val response = client.newCall(request).execute()GET /v1/search in C (libcurl)
CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET");
curl_easy_setopt(hnd, CURLOPT_URL, "https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "X-API-Key: YOUR_API_KEY");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
CURLcode ret = curl_easy_perform(hnd);GET /v1/search in Clojure (clj-http)
(require '[clj-http.client :as client])
(client/get "https://tech-news.p.apihiver.com/v1/search" {:headers {:X-API-Key "YOUR_API_KEY"}
:query-params {:q "python"
:timespan "{timespan}"
:sort "{sort}"
:min_points "{min_points}"
:limit "3"}
:accept :json})GET /v1/search in OCaml (CoHTTP)
open Cohttp_lwt_unix
open Cohttp
open Lwt
let uri = Uri.of_string "https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3" in
let headers = Header.add_list (Header.init ()) [
("Accept", "application/json");
("X-API-Key", "YOUR_API_KEY");
] in
Client.call ~headers `GET uri
>>= fun (res, body_stream) ->
(* Do stuff with the result *)GET /v1/search in R (httr)
library(httr)
url <- "https://tech-news.p.apihiver.com/v1/search"
queryString <- list(
q = "python",
timespan = "{timespan}",
sort = "{sort}",
min_points = "{min_points}",
limit = "3"
)
response <- VERB("GET", url, query = queryString, add_headers('X-API-Key' = 'YOUR_API_KEY'), content_type(""), accept("application/json"))
content(response, "text")GET /v1/search in PowerShell (Invoke-WebRequest)
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "YOUR_API_KEY")
$response = Invoke-WebRequest -Uri 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3' -Method GET -Headers $headersGET /v1/search in PowerShell (Invoke-RestMethod)
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "YOUR_API_KEY")
$response = Invoke-RestMethod -Uri 'https://tech-news.p.apihiver.com/v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3' -Method GET -Headers $headersGET /v1/search in HTTP (HTTP/1.1)
GET /v1/search?q=python×pan=%7Btimespan%7D&sort=%7Bsort%7D&min_points=%7Bmin_points%7D&limit=3 HTTP/1.1
Accept: application/json
X-Api-Key: YOUR_API_KEY
Host: tech-news.p.apihiver.com
Example response (200, application/json)
Success.
1{
2 "count": 3,
3 "query": "python",
4 "source": "Hacker News (search by Algolia)",
5 "stories": [
6 {
7 "url": "https://github.com/XEonAX/blender-copilot",
8 "title": "Show HN: Blender Copilot",
9 "author": "xeonax",
10 "points": 1,
11 "comments": 0,
12 "published_at": "2026-09-26T18:06:59+00:00",
13 "discussion_url": "https://news.ycombinator.com/item?id=49859013"
14 },
15 {
16 "url": "https://github.com/jaredks/rumps",
17 "title": "Rumps – Uncomplicated macOS Python Statusbar Apps",
18 "author": "gregsadetsky",
19 "points": 2,
20 "comments": 0,
21 "published_at": "2026-09-26T17:44:05+00:00",
22 "discussion_url": "https://news.ycombinator.com/item?id=49858815"
23 },
24 {
25 "url": "https://gist.github.com/nicobrenner/056a5aaff5d0119c0032ecdad5029557",
26 "title": "Show HN: A local alternative to Jev – 94% on Banking77",
27 "author": "nico",
28 "points": 1,
29 "comments": 0,
30 "published_at": "2026-09-26T17:41:51+00:00",
31 "discussion_url": "https://news.ycombinator.com/item?id=49858795"
32 }
33 ],
34 "total_matches": 229
35}Errors
- 400 — A required parameter is missing or a value has the wrong format.
1{ 2 "error": { 3 "code": "INVALID_INPUT", 4 "message": "q: Field required" 5 } 6}
Gateway errors (missing key, no subscription, rate limits) are listed in Error codes.