diff --git a/docs/api.md b/docs/api.md
index 4c7b6ba..aed077c 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -1,10 +1,164 @@
API
===
-- createWorker()
- - Worker.write()
- - Worker.read()
- - Worker.mkdir()
- - Worker.remove()
- - Worker.transcode()
- - Worker.run()
+- [createWorker()](#create-worker)
+ - [Worker.load](#worker-load)
+ - [Worker.write](#worker-write)
+ - [Worker.read](#worker-read)
+ - [Worker.mkdir](#worker-mkdir)
+ - [Worker.remove](#worker-remove)
+ - [Worker.transcode](#worker-transcode)
+ - [Worker.run](#worker-run)
+
+---
+
+
+## createWorker(options): Worker
+
+createWorker is a factory function that creates a ffmpeg worker, a worker is basically a Web Worker in browser and Child Process in Node.
+
+**Arguments:**
+
+- `options` an object of customized options
+ - `corePath` path for ffmpeg-core.js script
+ - `workerPath` path for downloading worker script
+ - `workerBlobURL` a boolean to define whether to use Blob URL for worker script, default: true
+ - `logger` a function to log the progress, a quick example is `m => console.log(m)`
+
+
+**Examples:**
+
+```javascript
+const { createWorker } = FFmpeg;
+const worker = createWorker({
+ corePath: './node_modules/@ffmpeg/core/ffmpeg-core.js',
+ logger: m => console.log(m),
+});
+```
+
+### Worker.load(jobId): Promise
+
+Worker.load() loads ffmpeg-core.js script (download from remote if not presented), it makes Web Worker/Child Process ready for next action.
+
+**Arguments:**
+
+- `jobId` jobId is generated by ffmpeg.js to identify each job, but you can put your own when calling the function.
+
+**Examples:**
+
+```javascript
+(async () => {
+ await worker.load();
+})();
+```
+
+
+### Worker.write(path, data, jobId): Promise
+
+Worker.write() writes data to specific path in Emscripten file system, it is an essential step before doing any other tasks.
+
+**Arguments:**
+
+- `path` path to write data to file system
+- `data` data to write, can be Uint8Array, URL or base64 format
+- `jobId` check Worker.load()
+
+**Examples:**
+
+```javascript
+(async () => {
+ await worker.write('flame.avi', 'http://localhost:3000/tests/assets/flame.avi');
+})();
+```
+
+
+### Worker.read(path, jobId): Promise
+
+Worker.read() reads data from file system, often used to get output data after specific task.
+
+**Arguments:**
+
+- `path` path to read data from file system
+- `jobId` check Worker.load()
+
+**Examples:**
+
+```javascript
+(async () => {
+ const { data } = await worker.read('output.mp4');
+})();
+```
+
+
+### Worker.mkdir(path, jobId): Promise
+
+Worker.mkdir() creates a directory in file system, useful when you need to group files in a directory.
+
+**Arguments:**
+
+- `path` path to create directory
+- `jobId` check Worker.load()
+
+**Examples:**
+
+```javascript
+(async () => {
+ await worker.mkdir('/video-clips');
+})();
+```
+
+
+### Worker.remove(path, jobId): Promise
+
+Worker.remove() removes files in file system, it will be better to delete unused files if you need to run ffmpeg.js multiple times.
+
+**Arguments:**
+
+- `path` path for file to delete
+- `jobId` check Worker.load()
+
+**Examples:**
+
+```javascript
+(async () => {
+ await worker.remove('output.mp4');
+})();
+```
+
+
+### Worker.transcode(inputPath, outputPath, options, jobId): Promise
+
+Worker.transcode() transcode a video file to another format.
+
+**Arguments:**
+
+- `inputPath` input file path, the input file should be written through Worker.write()
+- `outputPath` output file path, can be read with Worker.read() later
+- `options` a string to add extra arguments to ffmpeg
+- `jobId` check Worker.load()
+
+**Examples:**
+
+```javascript
+(async () => {
+ await worker.transcode('flame.avi', 'output.mp4', '-s 1920x1080');
+})();
+```
+
+
+### Worker.run(args, jobId): Promise
+
+Worker.run() is similar to FFmpeg cli tool, aims to provide maximum flexiblity for users.
+
+**Arguments:**
+
+- `args` a string to represent arguments
+- `jobId` check Worker.load()
+
+**Examples:**
+
+```javascript
+(async () => {
+ await worker.run('-i flame.avi -s 1920x1080 output.mp4');
+})();
+```