-
+
-
+
+
Huge thanks to for sponsoring Sindre Sorhus!
+
+
(they love Got too!)
+
+
+
+
+> Human-friendly and powerful HTTP request library for Node.js
+
+[![Build Status: Linux](https://travis-ci.com/sindresorhus/got.svg?branch=master)](https://travis-ci.com/github/sindresorhus/got)
+[![Coverage Status](https://coveralls.io/repos/github/sindresorhus/got/badge.svg?branch=master)](https://coveralls.io/github/sindresorhus/got?branch=master)
+[![Downloads](https://img.shields.io/npm/dm/got.svg)](https://npmjs.com/got)
+[![Install size](https://packagephobia.now.sh/badge?p=got)](https://packagephobia.now.sh/result?p=got)
+
+[Moving from Request?](documentation/migration-guides.md) [*(Note that Request is unmaintained)*](https://github.com/request/request/issues/3142)
+
+[See how Got compares to other HTTP libraries](#comparison)
+
+For browser usage, we recommend [Ky](https://github.com/sindresorhus/ky) by the same people.
+
+## Highlights
+
+- [Promise API](#api)
+- [Stream API](#streams)
+- [Pagination API](#pagination)
+- [HTTP2 support](#http2)
+- [Request cancelation](#aborting-the-request)
+- [RFC compliant caching](#cache-adapters)
+- [Follows redirects](#followredirect)
+- [Retries on failure](#retry)
+- [Progress events](#onuploadprogress-progress)
+- [Handles gzip/deflate/brotli](#decompress)
+- [Timeout handling](#timeout)
+- [Errors with metadata](#errors)
+- [JSON mode](#json-mode)
+- [WHATWG URL support](#url)
+- [HTTPS API](#advanced-https-api)
+- [Hooks](#hooks)
+- [Instances with custom defaults](#instances)
+- [Types](#types)
+- [Composable](documentation/advanced-creation.md#merging-instances)
+- [Plugins](documentation/lets-make-a-plugin.md)
+- [Used by 4K+ packages and 1.8M+ repos](https://github.com/sindresorhus/got/network/dependents)
+- [Actively maintained](https://github.com/sindresorhus/got/graphs/contributors)
+- [Trusted by many companies](#widely-used)
+
+## Install
+
+```
+$ npm install got
+```
+
+## Usage
+
+###### Promise
+
+```js
+const got = require('got');
+
+(async () => {
+ try {
+ const response = await got('https://sindresorhus.com');
+ console.log(response.body);
+ //=> ' ...'
+ } catch (error) {
+ console.log(error.response.body);
+ //=> 'Internal server error ...'
+ }
+})();
+```
+
+###### JSON
+
+```js
+const got = require('got');
+
+(async () => {
+ const {body} = await got.post('https://httpbin.org/anything', {
+ json: {
+ hello: 'world'
+ },
+ responseType: 'json'
+ });
+
+ console.log(body.data);
+ //=> {hello: 'world'}
+})();
+```
+
+See [JSON mode](#json-mode) for more details.
+
+###### Streams
+
+```js
+const stream = require('stream');
+const {promisify} = require('util');
+const fs = require('fs');
+const got = require('got');
+
+const pipeline = promisify(stream.pipeline);
+
+(async () => {
+ await pipeline(
+ got.stream('https://sindresorhus.com'),
+ fs.createWriteStream('index.html')
+ );
+
+ // For POST, PUT, PATCH, and DELETE methods, `got.stream` returns a `stream.Writable`.
+ await pipeline(
+ fs.createReadStream('index.html'),
+ got.stream.post('https://sindresorhus.com')
+ );
+})();
+```
+
+**Tip:** `from.pipe(to)` doesn't forward errors. Instead, use [`stream.pipeline(from, ..., to, callback)`](https://nodejs.org/api/stream.html#stream_stream_pipeline_streams_callback).
+
+**Note:** While `got.post('https://example.com')` resolves, `got.stream.post('https://example.com')` will hang indefinitely until a body is provided. If there's no body on purpose, remember to `.end()` the stream or set the [`body`](#body) option to an empty string.
+
+### API
+
+It's a `GET` request by default, but can be changed by using different methods or via [`options.method`](#method).
+
+**By default, Got will retry on failure. To disable this option, set [`options.retry`](#retry) to `0`.**
+
+#### got(url?, options?)
+
+Returns a Promise giving a [Response object](#response) or a [Got Stream](#streams-1) if `options.isStream` is set to true.
+
+##### url
+
+Type: `string | object`
+
+The URL to request, as a string, a [`https.request` options object](https://nodejs.org/api/https.html#https_https_request_options_callback), or a [WHATWG `URL`](https://nodejs.org/api/url.html#url_class_url).
+
+Properties from `options` will override properties in the parsed `url`.
+
+If no protocol is specified, it will throw a `TypeError`.
+
+**Note:** The query string is **not** parsed as search params. Example:
+
+```js
+got('https://example.com/?query=a b'); //=> https://example.com/?query=a%20b
+got('https://example.com/', {searchParams: {query: 'a b'}}); //=> https://example.com/?query=a+b
+
+// The query string is overridden by `searchParams`
+got('https://example.com/?query=a b', {searchParams: {query: 'a b'}}); //=> https://example.com/?query=a+b
+```
+
+##### options
+
+Type: `object`
+
+Any of the [`https.request`](https://nodejs.org/api/https.html#https_https_request_options_callback) options.
+
+**Note:** Legacy URL support is disabled. `options.path` is supported only for backwards compatibility. Use `options.pathname` and `options.searchParams` instead. `options.auth` has been replaced with `options.username` & `options.password`.
+
+###### method
+
+Type: `string`\
+Default: `GET`
+
+The HTTP method used to make the request.
+
+###### prefixUrl
+
+Type: `string | URL`
+
+When specified, `prefixUrl` will be prepended to `url`. The prefix can be any valid URL, either relative or absolute.\
+A trailing slash `/` is optional - one will be added automatically.
+
+**Note:** `prefixUrl` will be ignored if the `url` argument is a URL instance.
+
+**Note:** Leading slashes in `input` are disallowed when using this option to enforce consistency and avoid confusion. For example, when the prefix URL is `https://example.com/foo` and the input is `/bar`, there's ambiguity whether the resulting URL would become `https://example.com/foo/bar` or `https://example.com/bar`. The latter is used by browsers.
+
+**Tip:** Useful when used with [`got.extend()`](#custom-endpoints) to create niche-specific Got instances.
+
+**Tip:** You can change `prefixUrl` using hooks as long as the URL still includes the `prefixUrl`. If the URL doesn't include it anymore, it will throw.
+
+```js
+const got = require('got');
+
+(async () => {
+ await got('unicorn', {prefixUrl: 'https://cats.com'});
+ //=> 'https://cats.com/unicorn'
+
+ const instance = got.extend({
+ prefixUrl: 'https://google.com'
+ });
+
+ await instance('unicorn', {
+ hooks: {
+ beforeRequest: [
+ options => {
+ options.prefixUrl = 'https://cats.com';
+ }
+ ]
+ }
+ });
+ //=> 'https://cats.com/unicorn'
+})();
+```
+
+###### headers
+
+Type: `object`\
+Default: `{}`
+
+Request headers.
+
+Existing headers will be overwritten. Headers set to `undefined` will be omitted.
+
+###### isStream
+
+Type: `boolean`\
+Default: `false`
+
+Returns a `Stream` instead of a `Promise`. This is equivalent to calling `got.stream(url, options?)`.
+
+###### body
+
+Type: `string | Buffer | stream.Readable` or [`form-data` instance](https://github.com/form-data/form-data)
+
+**Note #1:** The `body` option cannot be used with the `json` or `form` option.
+
+**Note #2:** If you provide this option, `got.stream()` will be read-only.
+
+**Note #3:** If you provide a payload with the `GET` or `HEAD` method, it will throw a `TypeError` unless the method is `GET` and the `allowGetBody` option is set to `true`.
+
+**Note #4:** This option is not enumerable and will not be merged with the instance defaults.
+
+The `content-length` header will be automatically set if `body` is a `string` / `Buffer` / `fs.createReadStream` instance / [`form-data` instance](https://github.com/form-data/form-data), and `content-length` and `transfer-encoding` are not manually set in `options.headers`.
+
+###### json
+
+Type: `object | Array | number | string | boolean | null` *(JSON-serializable values)*
+
+**Note #1:** If you provide this option, `got.stream()` will be read-only.\
+**Note #2:** This option is not enumerable and will not be merged with the instance defaults.
+
+JSON body. If the `Content-Type` header is not set, it will be set to `application/json`.
+
+###### context
+
+Type: `object`
+
+User data. In contrast to other options, `context` is not enumerable.
+
+**Note:** The object is never merged, it's just passed through. Got will not modify the object in any way.
+
+It's very useful for storing auth tokens:
+
+```js
+const got = require('got');
+
+const instance = got.extend({
+ hooks: {
+ beforeRequest: [
+ options => {
+ if (!options.context || !options.context.token) {
+ throw new Error('Token required');
+ }
+
+ options.headers.token = options.context.token;
+ }
+ ]
+ }
+});
+
+(async () => {
+ const context = {
+ token: 'secret'
+ };
+
+ const response = await instance('https://httpbin.org/headers', {context});
+
+ // Let's see the headers
+ console.log(response.body);
+})();
+```
+
+###### responseType
+
+Type: `string`\
+Default: `'text'`
+
+**Note:** When using streams, this option is ignored.
+
+The parsing method. Can be `'text'`, `'json'` or `'buffer'`.
+
+The promise also has `.text()`, `.json()` and `.buffer()` methods which return another Got promise for the parsed body.\
+It's like setting the options to `{responseType: 'json', resolveBodyOnly: true}` but without affecting the main Got promise.
+
+Example:
+
+```js
+(async () => {
+ const responsePromise = got(url);
+ const bufferPromise = responsePromise.buffer();
+ const jsonPromise = responsePromise.json();
+
+ const [response, buffer, json] = await Promise.all([responsePromise, bufferPromise, jsonPromise]);
+ // `response` is an instance of Got Response
+ // `buffer` is an instance of Buffer
+ // `json` is an object
+})();
+```
+
+```js
+// This
+const body = await got(url).json();
+
+// is semantically the same as this
+const body = await got(url, {responseType: 'json', resolveBodyOnly: true});
+```
+
+**Note:** `buffer` will return the raw body buffer. Modifying it will also alter the result of `promise.text()` and `promise.json()`. Before overwritting the buffer, please copy it first via `Buffer.from(buffer)`. See https://github.com/nodejs/node/issues/27080
+
+###### parseJson
+
+Type: `(text: string) => unknown`\
+Default: `(text: string) => JSON.parse(text)`
+
+A function used to parse JSON responses.
+
+