One story with its top comments
One story with its top-level comments.
Request
GEThttps://tech-news.p.apihiver.com/v1/story/8863
Number. How many top-level comments to include (0–50, default
10). Language
Client
1curl --request GET \
2 --url 'https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D' \
3 --header 'Accept: application/json' \
4 --header 'X-API-Key: YOUR_API_KEY'One story with its top comments: Tech News API reference
One story with its top-level comments. 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.
One story with its top comments: example requests in every language
GET /v1/story/{story_id} in Shell (cURL)
curl --request GET \
--url 'https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D' \
--header 'Accept: application/json' \
--header 'X-API-Key: YOUR_API_KEY'GET /v1/story/{story_id} in Shell (HTTPie)
http GET 'https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D' \
Accept:application/json \
X-API-Key:YOUR_API_KEYGET /v1/story/{story_id} 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/story/8863?comments=%7Bcomments%7D'GET /v1/story/{story_id} in Node.js (http)
const http = require('https');
const options = {
method: 'GET',
hostname: 'tech-news.p.apihiver.com',
port: null,
path: '/v1/story/8863?comments=%7Bcomments%7D',
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/story/{story_id} in Node.js (Request)
const request = require('request');
const options = {
method: 'GET',
url: 'https://tech-news.p.apihiver.com/v1/story/8863',
qs: {comments: '{comments}'},
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/story/{story_id} in Node.js (Unirest)
const unirest = require('unirest');
const req = unirest('GET', 'https://tech-news.p.apihiver.com/v1/story/8863');
req.query({
comments: '{comments}'
});
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/story/{story_id} in Node.js (Axios)
const axios = require('axios').default;
const options = {
method: 'GET',
url: 'https://tech-news.p.apihiver.com/v1/story/8863',
params: {comments: '{comments}'},
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/story/{story_id} in Node.js (Fetch)
const fetch = require('node-fetch');
const url = 'https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D';
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/story/{story_id} 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/story/8863?comments=%7Bcomments%7D');
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('X-API-Key', 'YOUR_API_KEY');
xhr.send(data);GET /v1/story/{story_id} in JavaScript (Axios)
import axios from 'axios';
const options = {
method: 'GET',
url: 'https://tech-news.p.apihiver.com/v1/story/8863',
params: {comments: '{comments}'},
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/story/{story_id} in JavaScript (Fetch)
const url = 'https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D';
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/story/{story_id} in JavaScript (jQuery)
const settings = {
async: true,
crossDomain: true,
url: 'https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D',
method: 'GET',
headers: {
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY'
}
};
$.ajax(settings).done(function (response) {
console.log(response);
});GET /v1/story/{story_id} 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/story/8863?comments=%7Bcomments%7D", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))GET /v1/story/{story_id} in Python (Requests)
import requests
url = "https://tech-news.p.apihiver.com/v1/story/8863"
querystring = {"comments":"{comments}"}
headers = {
"Accept": "application/json",
"X-API-Key": "YOUR_API_KEY"
}
response = requests.get(url, headers=headers, params=querystring)
print(response.json())GET /v1/story/{story_id} in PHP (cURL)
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D",
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/story/{story_id} in PHP (Guzzle)
<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D', [
'headers' => [
'Accept' => 'application/json',
'X-API-Key' => 'YOUR_API_KEY',
],
]);
echo $response->getBody();GET /v1/story/{story_id} in PHP (PECL HTTP v1)
<?php
$request = new HttpRequest();
$request->setUrl('https://tech-news.p.apihiver.com/v1/story/8863');
$request->setMethod(HTTP_METH_GET);
$request->setQueryData([
'comments' => '{comments}'
]);
$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/story/{story_id} in PHP (PECL HTTP v2)
<?php
$client = new http\Client;
$request = new http\Client\Request;
$request->setRequestUrl('https://tech-news.p.apihiver.com/v1/story/8863');
$request->setRequestMethod('GET');
$request->setQuery(new http\QueryString([
'comments' => '{comments}'
]));
$request->setHeaders([
'Accept' => 'application/json',
'X-API-Key' => 'YOUR_API_KEY'
]);
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();GET /v1/story/{story_id} in Java (AsyncHttp)
AsyncHttpClient client = new DefaultAsyncHttpClient();
client.prepare("GET", "https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D")
.setHeader("Accept", "application/json")
.setHeader("X-API-Key", "YOUR_API_KEY")
.execute()
.toCompletableFuture()
.thenAccept(System.out::println)
.join();
client.close();GET /v1/story/{story_id} in Java (java.net.http)
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D"))
.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/story/{story_id} in Java (OkHttp)
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D")
.get()
.addHeader("Accept", "application/json")
.addHeader("X-API-Key", "YOUR_API_KEY")
.build();
Response response = client.newCall(request).execute();GET /v1/story/{story_id} in Java (Unirest)
HttpResponse<String> response = Unirest.get("https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D")
.header("Accept", "application/json")
.header("X-API-Key", "YOUR_API_KEY")
.asString();GET /v1/story/{story_id} 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/story/8863?comments=%7Bcomments%7D"),
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/story/{story_id} in C# (RestSharp)
var client = new RestClient("https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D");
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/story/{story_id} in Go (NewRequest)
package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D"
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/story/{story_id} in Ruby (net::http)
require 'uri'
require 'net/http'
url = URI("https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D")
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/story/{story_id} 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/story/8863?comments=%7Bcomments%7D")! 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/story/{story_id} 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/story/8863?comments=%7Bcomments%7D"]
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/story/{story_id} in Kotlin (OkHttp)
val client = OkHttpClient()
val request = Request.Builder()
.url("https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D")
.get()
.addHeader("Accept", "application/json")
.addHeader("X-API-Key", "YOUR_API_KEY")
.build()
val response = client.newCall(request).execute()GET /v1/story/{story_id} 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/story/8863?comments=%7Bcomments%7D");
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/story/{story_id} in Clojure (clj-http)
(require '[clj-http.client :as client])
(client/get "https://tech-news.p.apihiver.com/v1/story/8863" {:headers {:X-API-Key "YOUR_API_KEY"}
:query-params {:comments "{comments}"}
:accept :json})GET /v1/story/{story_id} in OCaml (CoHTTP)
open Cohttp_lwt_unix
open Cohttp
open Lwt
let uri = Uri.of_string "https://tech-news.p.apihiver.com/v1/story/8863?comments=%7Bcomments%7D" 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/story/{story_id} in R (httr)
library(httr)
url <- "https://tech-news.p.apihiver.com/v1/story/8863"
queryString <- list(comments = "{comments}")
response <- VERB("GET", url, query = queryString, add_headers('X-API-Key' = 'YOUR_API_KEY'), content_type(""), accept("application/json"))
content(response, "text")GET /v1/story/{story_id} 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/story/8863?comments=%7Bcomments%7D' -Method GET -Headers $headersGET /v1/story/{story_id} 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/story/8863?comments=%7Bcomments%7D' -Method GET -Headers $headersGET /v1/story/{story_id} in HTTP (HTTP/1.1)
GET /v1/story/8863?comments=%7Bcomments%7D 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 "id": 8863,
3 "url": "http://www.getdropbox.com/u/2/screencast.html",
4 "text": null,
5 "title": "My YC app: Dropbox - Throw away your USB drive",
6 "author": "dhouston",
7 "points": 104,
8 "comments": 71,
9 "published_at": "2007-04-04T19:16:40+00:00",
10 "top_comments": [
11 {
12 "text": "I have a few qualms with this app: 1. For a Linux user, you can already build such a system yourself quite trivially by getting an FTP account, mounting it locally with curlftpfs, and then using SVN or CVS on the mounted filesystem. From Windows or Mac, this FTP account could be accessed through built-in software. 2. It doesn't actually replace a USB drive. Most people I know e-mail files to the…",
13 "author": "BrandonM",
14 "replies": 1,
15 "published_at": "2007-04-05T15:16:54+00:00"
16 },
17 {
18 "text": "This is genius. It's is problem everyone is having, and everyone knew it ( http://www.aaronsw.com/weblog/lazybackup ). If it really works as well as it looks in that demo then they nailed it. I'm both envious and inspired. I'll be surprised if YC does not fund them.",
19 "author": "brett",
20 "replies": 0,
21 "published_at": "2007-04-04T21:48:13+00:00"
22 },
23 {
24 "text": "Drew, I saw your short demo at BarCamp and I must say Dropbox looks great! Are you planning on having a Linux port as well, or is too early to talk about that? Also, as another SFP applicant I have to tell you that I really hope you get the funding - you deserve it.",
25 "author": "nefele",
26 "replies": 3,
27 "published_at": "2007-04-04T20:07:23+00:00"
28 }
29 ],
30 "discussion_url": "https://news.ycombinator.com/item?id=8863"
31}Errors
- 400 — A required parameter is missing or a value has the wrong format.
1{ 2 "error": { 3 "code": "INVALID_INPUT", 4 "message": "story_id: Input should be a valid integer, unable to parse string as an integer" 5 } 6} - 404 — Nothing matches the value you sent.
1{ 2 "error": { 3 "code": "NOT_FOUND", 4 "message": "No story with id 999999999." 5 } 6}
Gateway errors (missing key, no subscription, rate limits) are listed in Error codes.