diff --git a/README.md b/README.md
index 3fa81b4..9d259e3 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,97 @@ let output = p.process('Hi');
console.log(output);
```
+## API
+
+### `Preprocessor`
+
+All `content-tag` public API lives on the `Preprocessor` object.
+
+### `Preprocessor.process(src: string, filename?: string): string;`
+
+Parses a given source code string using the `content-tag` spec into standard
+JavaScript.
+
+```ts
+import { Preprocessor } from 'content-tag';
+let p = new Preprocessor();
+let output = p.process('Hi');
+```
+
+### `Preprocessor.parse(src: string, filename?: string): Parsed[];`
+
+Parses a given source code string using the `content-tag` spec into an array of
+`Parsed` content tag objects.
+
+```ts
+import { Preprocessor } from 'content-tag';
+let p = new Preprocessor();
+let output = p.parse('Hi');
+```
+
+#### `Parsed`
+
+NOTE: All ranges are in bytes, not characters.
+
+````ts
+interface Parsed {
+ /**
+ * The type for the content tag.
+ *
+ * 'expression' corresponds to a tag in an expression position, e.g.
+ * ```
+ * const HiComponent = Hi;
+ * ```
+ *
+ * 'class-member' corresponds to a tag in a class-member position, e.g.
+ * ```
+ * export default class HiComponent extends Component {
+ * Hi
+ * }
+ * ```
+ */
+ type: "expression" | "class-member";
+
+ /**
+ * Currently, only template tags are parsed.
+ */
+ tagName: "template";
+
+ /** Raw template contents. */
+ contents: string;
+
+ /**
+ * Byte range of the contents, inclusive of inclusive of the
+ * `` tags.
+ */
+ range: {
+ start: number;
+ end: number;
+ };
+
+ /**
+ * Byte range of the template contents, not inclusive of the
+ * `` tags.
+ */
+ contentRange: {
+ start: number;
+ end: number;
+ };
+
+ /** Byte range of the opening `` tag. */
+ startRange: {
+ end: number;
+ start: number;
+ };
+
+ /** Byte range of the closing `` tag. */
+ endRange: {
+ start: number;
+ end: number;
+ };
+}
+````
+
## Contributing
See the [CONTRIBUTING.md](./CONTRIBUTING.md) file.