diff --git a/a.txt b/a.txt
new file mode 100644
index 00000000000..ee521a7fc28
--- /dev/null
+++ b/a.txt
@@ -0,0 +1,72 @@
+
+> @fern-api/mintlify-importer@0.0.0 test /Users/dsinghvi/Git/fern/packages/cli/docs-importers/mintlify
+> vitest --run
+
+
+ RUN v2.0.5 /Users/dsinghvi/Git/fern/packages/cli/docs-importers/mintlify
+
+stdout | src/__test__/migrateFromMintlify.test.ts > add-generator-groups > bland
+Converted logo
+Converted color configuration
+
+Bland is a platform for AI phone calling. Using our API, you can easily send or receive phone calls with a programmable voice agent.
+
+We really care about making our phone calls...
+
+1. **Fast**: sub-second latency from person speaking to AI responding.
+2. **Reliable**: it's our responsibility, day in and day out, to make sure your phone calls work. No exceptions.
+3. **Ultra flexible**: configure all aspects of your agent's behavior, by settings it's voice, creating transfer scenarios, configuring the initial greeting, etc.
+
+# What you can do with Bland
+
+
+
+ Dispatch AI phone calls to call customers, leads, and to streamline operations.
+
+
+ Create inbound phone numbers for customer support, etc.
+
+
+ Connect external APIs and take live actions during phone calls.
+
+
+ Extract JSON data to answer questions about your calls.
+
+
+ Simultaneously send thousands of calls at once.
+
+
+ Fine-tune a custom LLM using your enterprise' call recordings and transcripts.
+
+
+
+# Getting started
+
+
+
+ Read the API reference.
+
+
+ Learn to send your first phone call and test your agents.
+
+
+ Sign up on the developer portal.
+
+
+ Learn about enterprise features & meet with a member of the Bland AI team.
+
+
+
+
+ ❯ src/__test__/migrateFromMintlify.test.ts (1 test | 1 failed) 6ms
+ × add-generator-groups > bland
+ → Filepath is not relative: /developerportal.png
+
+ Test Files 1 failed (1)
+ Tests 1 failed (1)
+ Start at 22:15:44
+ Duration 1.34s (transform 447ms, setup 0ms, collect 1.15s, tests 6ms, environment 0ms, prepare 51ms)
+
+/Users/dsinghvi/Git/fern/packages/cli/docs-importers/mintlify:
+ ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL @fern-api/mintlify-importer@0.0.0 test: `vitest --run`
+Exit status 1
diff --git a/fern.schema.json b/fern.schema.json
index eb7240f335f..411598d8cc5 100644
--- a/fern.schema.json
+++ b/fern.schema.json
@@ -373,10 +373,13 @@
{
"type": "object",
"properties": {
+ "type": { "type": "string" },
"docs": {
"$ref": "#/properties/types/additionalProperties/anyOf/1/anyOf/0/properties/docs"
},
- "type": { "type": "string" }
+ "display-name": {
+ "$ref": "#/properties/types/additionalProperties/anyOf/2/properties/union/additionalProperties/anyOf/1/properties/display-name"
+ }
},
"required": ["type"],
"additionalProperties": false
diff --git a/fern/docs.yml b/fern/docs.yml
index 7ebf0b85b43..774cef18c38 100644
--- a/fern/docs.yml
+++ b/fern/docs.yml
@@ -197,7 +197,7 @@ navigation:
title: Go
slug: go
- changelog: ./pages/changelogs/csharp-sdk
- title: .Net
+ title: .NET
slug: csharp
- changelog: ./pages/changelogs/java-sdk
title: Java
diff --git a/fern/pages/changelogs/cli/2024-09-27.mdx b/fern/pages/changelogs/cli/2024-09-27.mdx
new file mode 100644
index 00000000000..420095bc10b
--- /dev/null
+++ b/fern/pages/changelogs/cli/2024-09-27.mdx
@@ -0,0 +1,6 @@
+## 0.43.6
+**`(fix):`** The OpenAPI importer now appropriately brings in responses that are under the `text/event-stream`
+Content-Type if your endpoint is annotated with `x-fern-streaming`.
+If your endpoint is not annotated with `x-fern-streaming`, then the response will be ignored.
+
+
diff --git a/fern/pages/changelogs/cli/2024-09-28.mdx b/fern/pages/changelogs/cli/2024-09-28.mdx
new file mode 100644
index 00000000000..30ab1df983f
--- /dev/null
+++ b/fern/pages/changelogs/cli/2024-09-28.mdx
@@ -0,0 +1,6 @@
+## 0.43.7
+**`(fix):`** The `valid-markdown` rule has been updated to try and parse the markdown file into a
+valid AST. If the file fails to parse, `fern check` will log an error as well
+as the path to the markdown.
+
+
diff --git a/fern/pages/changelogs/go-sdk/2024-09-27.mdx b/fern/pages/changelogs/go-sdk/2024-09-27.mdx
new file mode 100644
index 00000000000..55f4b4282b6
--- /dev/null
+++ b/fern/pages/changelogs/go-sdk/2024-09-27.mdx
@@ -0,0 +1,3 @@
+## 0.27.0
+**`(feat):`** Add support for SSE (Server-Sent Events) streaming responses. The user-facing interface for streaming responses remains the same between standard HTTP streaming and SSE.
+
diff --git a/fern/pages/changelogs/java-sdk/2024-09-26.mdx b/fern/pages/changelogs/java-sdk/2024-09-26.mdx
index fd8d5c1801e..41e05e6c38f 100644
--- a/fern/pages/changelogs/java-sdk/2024-09-26.mdx
+++ b/fern/pages/changelogs/java-sdk/2024-09-26.mdx
@@ -1,4 +1,8 @@
-## 1.2.0
+## 2.2.0
+**`(feat):`** We now provide endpoint methods for streaming byte array requests in addition to the previous methods accepting
+byte array directly.
+
+
**`(chore):`** Bump Jackson version to latest (2.17.2)
diff --git a/fern/pages/changelogs/python-sdk/2024-09-28.mdx b/fern/pages/changelogs/python-sdk/2024-09-28.mdx
new file mode 100644
index 00000000000..df8571729d5
--- /dev/null
+++ b/fern/pages/changelogs/python-sdk/2024-09-28.mdx
@@ -0,0 +1,11 @@
+## 4.2.7
+**`(fix):`** The generated README will now have a section that links to the generated
+SDK Reference (in `reference.md`).
+
+```md
+## Reference
+
+A full reference for this library can be found [here](./reference.md).
+```
+
+
diff --git a/generators/commons/package.json b/generators/commons/package.json
index 6d9f498554b..98dbd8e65a1 100644
--- a/generators/commons/package.json
+++ b/generators/commons/package.json
@@ -32,7 +32,7 @@
"@fern-api/fs-utils": "workspace:*",
"@fern-api/logger": "workspace:*",
"@fern-api/logging-execa": "workspace:*",
- "@fern-fern/generator-cli-sdk": "0.0.56",
+ "@fern-fern/generator-cli-sdk": "0.0.17",
"@fern-fern/generator-exec-sdk": "^0.0.898",
"js-yaml": "^4.1.0",
"lodash-es": "^4.17.21",
diff --git a/generators/csharp/sdk/package.json b/generators/csharp/sdk/package.json
index 3a06c5eb433..3f3824299b3 100644
--- a/generators/csharp/sdk/package.json
+++ b/generators/csharp/sdk/package.json
@@ -38,7 +38,7 @@
"@fern-api/fs-utils": "workspace:*",
"@fern-api/generator-commons": "workspace:*",
"@fern-api/logger": "workspace:*",
- "@fern-fern/generator-cli-sdk": "0.0.56",
+ "@fern-fern/generator-cli-sdk": "0.0.17",
"@fern-fern/generator-exec-sdk": "^0.0.898",
"url-join": "^5.0.0",
"@fern-fern/ir-sdk": "^53.7.0",
diff --git a/generators/go/internal/generator/generator.go b/generators/go/internal/generator/generator.go
index 86a8b1173ed..6bf886241ad 100644
--- a/generators/go/internal/generator/generator.go
+++ b/generators/go/internal/generator/generator.go
@@ -1547,3 +1547,12 @@ var pointerFunctionNames = map[string]struct{}{
"Uintptr": struct{}{},
"Time": struct{}{},
}
+
+// valueOf dereferences the given value, or returns the zero value if nil.
+func valueOf[T any](value *T) T {
+ var result T
+ if value == nil {
+ return result
+ }
+ return *value
+}
diff --git a/generators/go/internal/generator/sdk.go b/generators/go/internal/generator/sdk.go
index beaaa36778d..4f102ab58b6 100644
--- a/generators/go/internal/generator/sdk.go
+++ b/generators/go/internal/generator/sdk.go
@@ -1038,6 +1038,9 @@ func (f *fileWriter) WriteClient(
}
}
}
+ if endpoint.Accept != "" {
+ f.P(fmt.Sprintf(`%s.Set("Accept", %q)`, headersParameter, endpoint.Accept))
+ }
if endpoint.ContentType != "" {
f.P(fmt.Sprintf(`%s.Set("Content-Type", %q)`, headersParameter, endpoint.ContentType))
}
@@ -1114,7 +1117,7 @@ func (f *fileWriter) WriteClient(
}
// Prepare a response variable.
- if endpoint.ResponseType != "" && !endpoint.IsStreaming && endpoint.PaginationInfo == nil {
+ if endpoint.ResponseType != "" && endpoint.StreamingInfo == nil && endpoint.PaginationInfo == nil {
f.P(fmt.Sprintf(endpoint.ResponseInitializerFormat, endpoint.ResponseType))
}
@@ -1208,13 +1211,23 @@ func (f *fileWriter) WriteClient(
}
// Issue the request.
- if endpoint.IsStreaming {
+ if endpoint.StreamingInfo != nil {
+ streamingInfo := endpoint.StreamingInfo
f.P("streamer := core.NewStreamer[", endpoint.ResponseType, "](", receiver, ".caller)")
f.P("return streamer.Stream(")
f.P("ctx,")
f.P("&core.StreamParams{")
f.P("URL: endpointURL, ")
f.P("Method:", endpoint.Method, ",")
+ if streamingInfo.Delimiter != "" {
+ f.P("Delimiter: ", streamingInfo.Delimiter, ",")
+ }
+ if streamingInfo.Prefix != "" {
+ f.P("Prefix:", streamingInfo.Prefix, ",")
+ }
+ if streamingInfo.Terminator != "" {
+ f.P("Terminator:", streamingInfo.Terminator, ",")
+ }
f.P("MaxAttempts: options.MaxAttempts,")
f.P("BodyProperties: options.BodyProperties,")
f.P("QueryParameters: options.QueryParameters,")
@@ -1226,9 +1239,6 @@ func (f *fileWriter) WriteClient(
if endpoint.ErrorDecoderParameterName != "" {
f.P("ErrorDecoder:", endpoint.ErrorDecoderParameterName, ",")
}
- if endpoint.StreamDelimiter != "" {
- f.P("Delimiter: ", endpoint.StreamDelimiter, ",")
- }
f.P("},")
f.P(")")
f.P("}")
@@ -1390,6 +1400,48 @@ func (f *fileWriter) WriteClient(
)
}
+type streamingInfo struct {
+ Delimiter string
+ Prefix string
+ Terminator string
+ AcceptHeader string
+}
+
+func getStreamingInfo(
+ irEndpoint *ir.HttpEndpoint,
+) (*streamingInfo, error) {
+ if irEndpoint == nil || irEndpoint.Response == nil || irEndpoint.Response.Streaming == nil {
+ return nil, nil
+ }
+ streamingResponse := irEndpoint.Response.Streaming
+ switch streamingResponse.Type {
+ case "text":
+ return &streamingInfo{}, nil
+ case "json":
+ var terminator string
+ if value := valueOf(streamingResponse.Json.Terminator); value != "" {
+ terminator = fmt.Sprintf("%q", value)
+ }
+ return &streamingInfo{
+ Terminator: terminator,
+ }, nil
+ case "sse":
+ terminator := valueOf(streamingResponse.Sse.Terminator)
+ if terminator != "" {
+ terminator = fmt.Sprintf("%q", terminator)
+ } else {
+ terminator = "core.DefaultSSETerminator"
+ }
+ return &streamingInfo{
+ Prefix: "core.DefaultSSEDataPrefix",
+ Terminator: terminator,
+ AcceptHeader: "text/event-stream",
+ }, nil
+ default:
+ return nil, fmt.Errorf("stream response type %q is not supported", streamingResponse.Type)
+ }
+}
+
type paginationInfo struct {
Type string
Page *ir.QueryParameter
@@ -1996,10 +2048,9 @@ type endpoint struct {
OptionConstructor string
PathSuffix string
Method string
- IsStreaming bool
- StreamDelimiter string
ErrorDecoderParameterName string
Idempotent bool
+ Accept string
ContentType string
Errors ir.ResponseErrors
QueryParameters []*ir.QueryParameter
@@ -2008,6 +2059,7 @@ type endpoint struct {
FilePropertyInfo *filePropertyInfo
FileProperties []*ir.FileProperty
FileBodyProperties []*ir.InlinedRequestBodyProperty
+ StreamingInfo *streamingInfo
PaginationInfo *paginationInfo
}
@@ -2172,6 +2224,11 @@ func (f *fileWriter) endpointFromIR(
},
)
+ streamingInfo, err := getStreamingInfo(irEndpoint)
+ if err != nil {
+ return nil, err
+ }
+
paginationInfo, err := f.getPaginationInfo(irEndpoint, scope, requestParameterName)
if err != nil {
return nil, err
@@ -2185,8 +2242,6 @@ func (f *fileWriter) endpointFromIR(
signatureReturnValues string
successfulReturnValues string
errorReturnValues string
- streamDelimiter string
- isStreaming bool
)
var responseIsOptionalParameter bool
if irEndpoint.Response != nil {
@@ -2234,12 +2289,6 @@ func (f *fileWriter) endpointFromIR(
successfulReturnValues = "response.String(), nil"
errorReturnValues = `"", err`
case "streaming":
- if irEndpoint.Response.Streaming.Json == nil && irEndpoint.Response.Streaming.Text == nil {
- return nil, fmt.Errorf("unsupported streaming response type: %s", irEndpoint.Response.Streaming.Type)
- }
- if irEndpoint.Response.Streaming.Json != nil && irEndpoint.Response.Streaming.Json.Terminator != nil {
- streamDelimiter = *irEndpoint.Response.Streaming.Json.Terminator
- }
typeReference, err := typeReferenceFromStreamingResponse(irEndpoint.Response.Streaming)
if err != nil {
return nil, err
@@ -2248,7 +2297,6 @@ func (f *fileWriter) endpointFromIR(
responseParameterName = "response"
signatureReturnValues = fmt.Sprintf("(*core.Stream[%s], error)", responseType)
errorReturnValues = "nil, err"
- isStreaming = true
default:
return nil, fmt.Errorf("%s requests are not supported yet", irEndpoint.Response.Type)
}
@@ -2308,6 +2356,11 @@ func (f *fileWriter) endpointFromIR(
optionConstructor = "core.NewIdempotentRequestOptions(opts...)"
}
+ var accept string
+ if streamingInfo != nil && streamingInfo.AcceptHeader != "" {
+ accept = streamingInfo.AcceptHeader
+ }
+
contentTypeOverride := contentTypeFromRequestBody(irEndpoint.RequestBody)
if contentTypeOverride != "" {
contentType = contentTypeOverride
@@ -2336,9 +2389,8 @@ func (f *fileWriter) endpointFromIR(
BaseURL: baseURL,
PathSuffix: pathSuffix,
Method: irMethodToMethodEnum(irEndpoint.Method),
- IsStreaming: isStreaming,
- StreamDelimiter: streamDelimiter,
ErrorDecoderParameterName: errorDecoderParameterName,
+ Accept: accept,
ContentType: contentType,
Idempotent: irEndpoint.Idempotent,
Errors: irEndpoint.Errors,
@@ -2348,6 +2400,7 @@ func (f *fileWriter) endpointFromIR(
FilePropertyInfo: filePropertyInfo,
FileProperties: fileProperties,
FileBodyProperties: fileBodyProperties,
+ StreamingInfo: streamingInfo,
PaginationInfo: paginationInfo,
}, nil
}
@@ -3109,6 +3162,8 @@ func typeReferenceFromStreamingResponse(
switch streamingResponse.Type {
case "json":
return streamingResponse.Json.Payload, nil
+ case "sse":
+ return streamingResponse.Sse.Payload, nil
case "text":
return ir.NewTypeReferenceFromPrimitive(ir.PrimitiveTypeString), nil
}
diff --git a/generators/go/internal/generator/sdk/core/stream.go b/generators/go/internal/generator/sdk/core/stream.go
index c610ad3963e..30e374dc4e2 100644
--- a/generators/go/internal/generator/sdk/core/stream.go
+++ b/generators/go/internal/generator/sdk/core/stream.go
@@ -10,7 +10,16 @@ import (
"strings"
)
-const defaultStreamDelimiter = '\n'
+const (
+ // DefaultDataPrefix is the default prefix used for SSE streaming.
+ DefaultSSEDataPrefix = "data: "
+
+ // DefaultTerminator is the default terminator used for SSE streaming.
+ DefaultSSETerminator = "[DONE]"
+
+ // The default stream delimiter used to split messages.
+ defaultStreamDelimiter = '\n'
+)
// Streamer calls APIs and streams responses using a *Stream.
type Streamer[T any] struct {
@@ -30,7 +39,9 @@ func NewStreamer[T any](caller *Caller) *Streamer[T] {
type StreamParams struct {
URL string
Method string
+ Prefix string
Delimiter string
+ Terminator string
MaxAttempts uint
Headers http.Header
BodyProperties map[string]interface{}
@@ -97,6 +108,13 @@ func (s *Streamer[T]) Stream(ctx context.Context, params *StreamParams) (*Stream
if params.Delimiter != "" {
opts = append(opts, WithDelimiter(params.Delimiter))
}
+ if params.Prefix != "" {
+ opts = append(opts, WithPrefix(params.Prefix))
+ }
+ if params.Terminator != "" {
+ opts = append(opts, WithTerminator(params.Terminator))
+ }
+
return NewStream[T](resp, opts...), nil
}
@@ -118,6 +136,24 @@ func WithDelimiter(delimiter string) StreamOption {
}
}
+// WithPrefix overrides the prefix for the Stream.
+//
+// By default, the Stream doesn't have a prefix.
+func WithPrefix(prefix string) StreamOption {
+ return func(opts *streamOptions) {
+ opts.prefix = prefix
+ }
+}
+
+// WithTerminator overrides the terminator for the Stream.
+//
+// By default, the Stream terminates on EOF.
+func WithTerminator(terminator string) StreamOption {
+ return func(opts *streamOptions) {
+ opts.terminator = terminator
+ }
+}
+
// NewStream constructs a new Stream from the given *http.Response.
func NewStream[T any](response *http.Response, opts ...StreamOption) *Stream[T] {
options := new(streamOptions)
@@ -125,7 +161,7 @@ func NewStream[T any](response *http.Response, opts ...StreamOption) *Stream[T]
opt(options)
}
return &Stream[T]{
- reader: newStreamReader(response.Body, options.delimiter),
+ reader: newStreamReader(response.Body, options),
closer: response.Body,
}
}
@@ -160,9 +196,12 @@ type streamReader interface {
// By default, the streamReader uses a simple a *bufio.Reader
// which splits on newlines, and otherwise use a *bufio.Scanner to
// split on custom delimiters.
-func newStreamReader(reader io.Reader, delimiter string) streamReader {
- if len(delimiter) > 0 {
- return newScannerStreamReader(reader, delimiter)
+func newStreamReader(reader io.Reader, options *streamOptions) streamReader {
+ if !options.isEmpty() {
+ if options.delimiter == "" {
+ options.delimiter = string(defaultStreamDelimiter)
+ }
+ return newScannerStreamReader(reader, options)
}
return newBufferStreamReader(reader)
}
@@ -187,37 +226,69 @@ func (b *bufferStreamReader) ReadFromStream() ([]byte, error) {
// configurable delimiters.
type scannerStreamReader struct {
scanner *bufio.Scanner
+ options *streamOptions
}
-func newScannerStreamReader(reader io.Reader, delimiter string) *scannerStreamReader {
+func newScannerStreamReader(
+ reader io.Reader,
+ options *streamOptions,
+) *scannerStreamReader {
scanner := bufio.NewScanner(reader)
- scanner.Split(func(data []byte, atEOF bool) (int, []byte, error) {
- if atEOF && len(data) == 0 {
+ stream := &scannerStreamReader{
+ scanner: scanner,
+ options: options,
+ }
+ scanner.Split(func(bytes []byte, atEOF bool) (int, []byte, error) {
+ if atEOF && len(bytes) == 0 {
return 0, nil, nil
}
- if i := strings.Index(string(data), delimiter); i >= 0 {
- return i + len(delimiter), data[0:i], nil
- }
- if atEOF {
- return len(data), data, nil
+ n, data, err := stream.parse(bytes)
+ if stream.isTerminated(data) {
+ return 0, nil, io.EOF
}
- return 0, nil, nil
+ return n, data, err
})
- return &scannerStreamReader{
- scanner: scanner,
- }
+ return stream
}
-func (b *scannerStreamReader) ReadFromStream() ([]byte, error) {
- if b.scanner.Scan() {
- return b.scanner.Bytes(), nil
+func (s *scannerStreamReader) ReadFromStream() ([]byte, error) {
+ if s.scanner.Scan() {
+ return s.scanner.Bytes(), nil
}
- if err := b.scanner.Err(); err != nil {
+ if err := s.scanner.Err(); err != nil {
return nil, err
}
return nil, io.EOF
}
+func (s *scannerStreamReader) parse(bytes []byte) (int, []byte, error) {
+ var start int
+ if s.options != nil && s.options.prefix != "" {
+ if i := strings.Index(string(bytes), s.options.prefix); i >= 0 {
+ start = i + len(s.options.prefix)
+ }
+ }
+ data := bytes[start:]
+ if i := strings.Index(string(data), s.options.delimiter); i >= 0 {
+ data = data[:i+len(s.options.delimiter)]
+ }
+ n := start + len(data) + len(s.options.delimiter)
+ return n, data, nil
+}
+
+func (s *scannerStreamReader) isTerminated(bytes []byte) bool {
+ if s.options == nil || s.options.terminator == "" {
+ return false
+ }
+ return strings.Contains(string(bytes), s.options.terminator)
+}
+
type streamOptions struct {
- delimiter string
+ delimiter string
+ prefix string
+ terminator string
+}
+
+func (s *streamOptions) isEmpty() bool {
+ return s.delimiter == "" && s.prefix == "" && s.terminator == ""
}
diff --git a/generators/go/sdk/versions.yml b/generators/go/sdk/versions.yml
index d0b803dff11..9da459e2a9e 100644
--- a/generators/go/sdk/versions.yml
+++ b/generators/go/sdk/versions.yml
@@ -1,3 +1,11 @@
+- version: 0.27.0
+ changelogEntry:
+ - type: feat
+ summary: >-
+ Add support for SSE (Server-Sent Events) streaming responses. The user-facing
+ interface for streaming responses remains the same between standard HTTP
+ streaming and SSE.
+ irVersion: 40
- version: 0.26.0
changelogEntry:
- type: feat
diff --git a/generators/java/sdk/src/main/java/com/fern/java/client/Cli.java b/generators/java/sdk/src/main/java/com/fern/java/client/Cli.java
index d4b66d9a284..0fb72f3aee2 100644
--- a/generators/java/sdk/src/main/java/com/fern/java/client/Cli.java
+++ b/generators/java/sdk/src/main/java/com/fern/java/client/Cli.java
@@ -19,6 +19,8 @@
import com.fern.java.client.generators.CoreMediaTypesGenerator;
import com.fern.java.client.generators.EnvironmentGenerator;
import com.fern.java.client.generators.ErrorGenerator;
+import com.fern.java.client.generators.FileStreamGenerator;
+import com.fern.java.client.generators.InputStreamRequestBodyGenerator;
import com.fern.java.client.generators.OAuthTokenSupplierGenerator;
import com.fern.java.client.generators.RequestOptionsGenerator;
import com.fern.java.client.generators.ResponseBodyInputStreamGenerator;
@@ -198,6 +200,12 @@ public GeneratedRootClient generateClient(
new ResponseBodyInputStreamGenerator(context);
this.addGeneratedFile(responseBodyInputStreamGenerator.generateFile());
+ InputStreamRequestBodyGenerator inputStreamRequestBodyGenerator = new InputStreamRequestBodyGenerator(context);
+ this.addGeneratedFile(inputStreamRequestBodyGenerator.generateFile());
+
+ FileStreamGenerator fileStreamGenerator = new FileStreamGenerator(context);
+ this.addGeneratedFile(fileStreamGenerator.generateFile());
+
ResponseBodyReaderGenerator responseBodyReaderGenerator = new ResponseBodyReaderGenerator(context);
this.addGeneratedFile(responseBodyReaderGenerator.generateFile());
diff --git a/generators/java/sdk/src/main/java/com/fern/java/client/ClientPoetClassNameFactory.java b/generators/java/sdk/src/main/java/com/fern/java/client/ClientPoetClassNameFactory.java
index bf131363b24..9b09c32a987 100644
--- a/generators/java/sdk/src/main/java/com/fern/java/client/ClientPoetClassNameFactory.java
+++ b/generators/java/sdk/src/main/java/com/fern/java/client/ClientPoetClassNameFactory.java
@@ -24,6 +24,14 @@ public ClassName getErrorClassName(ErrorDeclaration errorDeclaration) {
errorDeclaration.getName().getName().getPascalCase().getSafeName());
}
+ public ClassName getInputStreamRequestBodyClassName() {
+ return ClassName.get(getCorePackage(), "InputStreamRequestBody");
+ }
+
+ public ClassName getFileStreamClassName() {
+ return ClassName.get(getCorePackage(), "FileStream");
+ }
+
public ClassName getRetryInterceptorClassName() {
return ClassName.get(getCorePackage(), "RetryInterceptor");
}
diff --git a/generators/java/sdk/src/main/java/com/fern/java/client/generators/ClientGeneratorUtils.java b/generators/java/sdk/src/main/java/com/fern/java/client/generators/ClientGeneratorUtils.java
index 75d3fd29e73..2948d43e48a 100644
--- a/generators/java/sdk/src/main/java/com/fern/java/client/generators/ClientGeneratorUtils.java
+++ b/generators/java/sdk/src/main/java/com/fern/java/client/generators/ClientGeneratorUtils.java
@@ -118,6 +118,17 @@ public Result buildClients() {
}
implBuilder.addMethod(httpEndpointMethodSpecs.getNonRequestOptionsMethodSpec());
implBuilder.addMethod(httpEndpointMethodSpecs.getRequestOptionsMethodSpec());
+ if (httpEndpointMethodSpecs
+ .getNonRequestOptionsByteArrayMethodSpec()
+ .isPresent()) {
+ implBuilder.addMethod(httpEndpointMethodSpecs
+ .getNonRequestOptionsByteArrayMethodSpec()
+ .get());
+ }
+ if (httpEndpointMethodSpecs.getByteArrayMethodSpec().isPresent()) {
+ implBuilder.addMethod(
+ httpEndpointMethodSpecs.getByteArrayMethodSpec().get());
+ }
generatedWrappedRequests.addAll(httpEndpointMethodSpecFactory.getGeneratedWrappedRequests());
}
}
diff --git a/generators/java/sdk/src/main/java/com/fern/java/client/generators/FileStreamGenerator.java b/generators/java/sdk/src/main/java/com/fern/java/client/generators/FileStreamGenerator.java
new file mode 100644
index 00000000000..870e925f911
--- /dev/null
+++ b/generators/java/sdk/src/main/java/com/fern/java/client/generators/FileStreamGenerator.java
@@ -0,0 +1,44 @@
+/*
+ * (c) Copyright 2023 Birch Solutions Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.fern.java.client.generators;
+
+import com.fern.java.client.ClientGeneratorContext;
+import com.fern.java.generators.AbstractFileGenerator;
+import com.fern.java.output.GeneratedResourcesJavaFile;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+public final class FileStreamGenerator extends AbstractFileGenerator {
+
+ public FileStreamGenerator(ClientGeneratorContext clientGeneratorContext) {
+ super(clientGeneratorContext.getPoetClassNameFactory().getFileStreamClassName(), clientGeneratorContext);
+ }
+
+ @Override
+ public GeneratedResourcesJavaFile generateFile() {
+ try (InputStream is = FileStreamGenerator.class.getResourceAsStream("/FileStream.java")) {
+ String contents = new String(is.readAllBytes(), StandardCharsets.UTF_8);
+ return GeneratedResourcesJavaFile.builder()
+ .className(className)
+ .contents(contents)
+ .build();
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to read FileStream.java");
+ }
+ }
+}
diff --git a/generators/java/sdk/src/main/java/com/fern/java/client/generators/InputStreamRequestBodyGenerator.java b/generators/java/sdk/src/main/java/com/fern/java/client/generators/InputStreamRequestBodyGenerator.java
new file mode 100644
index 00000000000..957eaa65dcf
--- /dev/null
+++ b/generators/java/sdk/src/main/java/com/fern/java/client/generators/InputStreamRequestBodyGenerator.java
@@ -0,0 +1,47 @@
+/*
+ * (c) Copyright 2023 Birch Solutions Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.fern.java.client.generators;
+
+import com.fern.java.client.ClientGeneratorContext;
+import com.fern.java.generators.AbstractFileGenerator;
+import com.fern.java.output.GeneratedResourcesJavaFile;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+public final class InputStreamRequestBodyGenerator extends AbstractFileGenerator {
+
+ public InputStreamRequestBodyGenerator(ClientGeneratorContext clientGeneratorContext) {
+ super(
+ clientGeneratorContext.getPoetClassNameFactory().getInputStreamRequestBodyClassName(),
+ clientGeneratorContext);
+ }
+
+ @Override
+ public GeneratedResourcesJavaFile generateFile() {
+ try (InputStream is =
+ InputStreamRequestBodyGenerator.class.getResourceAsStream("/InputStreamRequestBody.java")) {
+ String contents = new String(is.readAllBytes(), StandardCharsets.UTF_8);
+ return GeneratedResourcesJavaFile.builder()
+ .className(className)
+ .contents(contents)
+ .build();
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to read InputStreamRequestBody.java");
+ }
+ }
+}
diff --git a/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/AbstractEndpointWriter.java b/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/AbstractEndpointWriter.java
index 629a7befa3b..4448df9d75c 100644
--- a/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/AbstractEndpointWriter.java
+++ b/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/AbstractEndpointWriter.java
@@ -73,6 +73,7 @@
import com.fern.java.output.GeneratedObjectMapper;
import com.fern.java.utils.JavaDocUtils;
import com.fern.java.utils.TypeReferenceUtils.ContainerTypeToUnderlyingType;
+import com.squareup.javapoet.ArrayTypeName;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.CodeBlock.Builder;
@@ -81,6 +82,7 @@
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@@ -194,7 +196,7 @@ public final HttpEndpointMethodSpecs generate() {
// Step 2: Add additional parameters
List additionalParameters = additionalParameters();
- // Step 3: Add path parameters
+ // Step 3: Add parameters
endpointMethodBuilder.addParameters(pathParameters);
endpointMethodBuilder.addParameters(additionalParameters);
if (httpEndpoint.getIdempotent()) {
@@ -203,10 +205,7 @@ public final HttpEndpointMethodSpecs generate() {
REQUEST_OPTIONS_PARAMETER_NAME)
.build());
} else {
- endpointMethodBuilder.addParameter(ParameterSpec.builder(
- clientGeneratorContext.getPoetClassNameFactory().getRequestOptionsClassName(),
- REQUEST_OPTIONS_PARAMETER_NAME)
- .build());
+ endpointMethodBuilder.addParameter(requestOptionsParameterSpec());
}
// Step 4: Get http client initializer
@@ -309,9 +308,53 @@ public final HttpEndpointMethodSpecs generate() {
bodyParameterSpec.type)
.build();
}
+ Optional maybeBytes = httpEndpoint
+ .getSdkRequest()
+ .flatMap(
+ sdkRequest -> sdkRequest.getShape().getJustRequestBody().flatMap(SdkRequestBodyType::getBytes));
+ MethodSpec nonRequestOptionsByteArrayMethodSpec = null;
+ MethodSpec byteArrayMethodSpec = null;
+
+ // add direct byte array endpoints for backwards compatibility
+ if (maybeBytes.isPresent()) {
+ BytesRequest bytes = maybeBytes.get();
+ ParameterSpec requestParameterSpec =
+ getBytesRequestParameterSpec(bytes, sdkRequest().get(), ArrayTypeName.of(byte.class));
+ MethodSpec byteArrayBaseMethodSpec = MethodSpec.methodBuilder(endpointWithRequestOptions.name)
+ .addModifiers(Modifier.PUBLIC)
+ .addParameters(pathParameters)
+ .addParameters(List.of(requestParameterSpec))
+ .addJavadoc(endpointWithRequestOptions.javadoc)
+ .returns(endpointWithRequestOptions.returnType)
+ .build();
+ Builder methodBodyBuilder = CodeBlock.builder();
+ if (!byteArrayBaseMethodSpec.returnType.equals(TypeName.VOID)) {
+ methodBodyBuilder.add("return ");
+ }
+ CodeBlock baseMethodBody = methodBodyBuilder
+ .add(
+ "$L(new $T($L)",
+ endpointWithRequestOptions.name,
+ ByteArrayInputStream.class,
+ requestParameterSpec.name)
+ .build();
+ nonRequestOptionsByteArrayMethodSpec = byteArrayBaseMethodSpec.toBuilder()
+ .addStatement(baseMethodBody.toBuilder().add(")").build())
+ .build();
+ byteArrayMethodSpec = byteArrayBaseMethodSpec.toBuilder()
+ .addParameter(requestOptionsParameterSpec())
+ .addStatement(baseMethodBody.toBuilder()
+ .add(", $L)", REQUEST_OPTIONS_PARAMETER_NAME)
+ .build())
+ .build();
+ }
return new HttpEndpointMethodSpecs(
- endpointWithRequestOptions, endpointWithoutRequestOptions, endpointWithoutRequest);
+ endpointWithRequestOptions,
+ endpointWithoutRequestOptions,
+ endpointWithoutRequest,
+ byteArrayMethodSpec,
+ nonRequestOptionsByteArrayMethodSpec);
}
public abstract Optional sdkRequest();
@@ -330,6 +373,24 @@ public abstract CodeBlock getInitializeRequestCodeBlock(
CodeBlock inlineableHttpUrl,
boolean sendContentType);
+ public final ParameterSpec requestOptionsParameterSpec() {
+ return ParameterSpec.builder(
+ clientGeneratorContext.getPoetClassNameFactory().getRequestOptionsClassName(),
+ REQUEST_OPTIONS_PARAMETER_NAME)
+ .build();
+ }
+
+ protected final ParameterSpec getBytesRequestParameterSpec(
+ BytesRequest bytes, SdkRequest sdkRequest, TypeName typeName) {
+ if (bytes.getIsOptional()) {
+ typeName = ParameterizedTypeName.get(ClassName.get(Optional.class), typeName);
+ }
+ return ParameterSpec.builder(
+ typeName,
+ sdkRequest.getRequestParameterName().getCamelCase().getSafeName())
+ .build();
+ }
+
public final CodeBlock getResponseParserCodeBlock() {
CodeBlock.Builder httpResponseBuilder = CodeBlock.builder()
// Default the request client
diff --git a/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/HttpEndpointMethodSpecs.java b/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/HttpEndpointMethodSpecs.java
index 60038a584c1..8a8e0aaa70d 100644
--- a/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/HttpEndpointMethodSpecs.java
+++ b/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/HttpEndpointMethodSpecs.java
@@ -24,14 +24,20 @@ public final class HttpEndpointMethodSpecs {
private final MethodSpec nonRequestOptionsMethodSpec;
private final MethodSpec requestOptionsMethodSpec;
private final MethodSpec noRequestBodyMethodSpec;
+ private final MethodSpec byteArrayMethodSpec;
+ private final MethodSpec nonRequestOptionsByteArrayMethodSpec;
public HttpEndpointMethodSpecs(
MethodSpec requestOptionsMethodSpec,
MethodSpec nonRequestOptionsMethodSpec,
- MethodSpec noRequestBodyMethodSpec) {
+ MethodSpec noRequestBodyMethodSpec,
+ MethodSpec byteArrayMethodSpec,
+ MethodSpec nonRequestOptionsByteArrayMethodSpec) {
this.nonRequestOptionsMethodSpec = nonRequestOptionsMethodSpec;
this.requestOptionsMethodSpec = requestOptionsMethodSpec;
this.noRequestBodyMethodSpec = noRequestBodyMethodSpec;
+ this.byteArrayMethodSpec = byteArrayMethodSpec;
+ this.nonRequestOptionsByteArrayMethodSpec = nonRequestOptionsByteArrayMethodSpec;
}
public MethodSpec getNonRequestOptionsMethodSpec() {
@@ -45,4 +51,12 @@ public MethodSpec getRequestOptionsMethodSpec() {
public Optional getNoRequestBodyMethodSpec() {
return Optional.ofNullable(noRequestBodyMethodSpec);
}
+
+ public Optional getByteArrayMethodSpec() {
+ return Optional.ofNullable(byteArrayMethodSpec);
+ }
+
+ public Optional getNonRequestOptionsByteArrayMethodSpec() {
+ return Optional.ofNullable(nonRequestOptionsByteArrayMethodSpec);
+ }
}
diff --git a/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/OnlyRequestEndpointWriter.java b/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/OnlyRequestEndpointWriter.java
index 9e7c33c2018..5434d9c69eb 100644
--- a/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/OnlyRequestEndpointWriter.java
+++ b/generators/java/sdk/src/main/java/com/fern/java/client/generators/endpoint/OnlyRequestEndpointWriter.java
@@ -34,18 +34,17 @@
import com.fern.java.generators.object.EnrichedObjectProperty;
import com.fern.java.output.GeneratedJavaFile;
import com.fern.java.output.GeneratedObjectMapper;
-import com.squareup.javapoet.ArrayTypeName;
-import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.ParameterSpec;
-import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
+import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import okhttp3.Headers;
+import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
@@ -149,17 +148,7 @@ public ParameterSpec visitTypeReference(HttpRequestBodyReference typeReference)
@Override
public ParameterSpec visitBytes(BytesRequest bytes) {
- TypeName typeName = ArrayTypeName.of(byte.class);
- if (bytes.getIsOptional()) {
- typeName = ParameterizedTypeName.get(ClassName.get(Optional.class), typeName);
- }
- return ParameterSpec.builder(
- typeName,
- sdkRequest
- .getRequestParameterName()
- .getCamelCase()
- .getSafeName())
- .build();
+ return getBytesRequestParameterSpec(bytes, sdkRequest, TypeName.get(InputStream.class));
}
@Override
@@ -212,10 +201,6 @@ public Void visitTypeReference(HttpRequestBodyReference typeReference) {
@Override
public Void visitBytes(BytesRequest bytes) {
- builder.add(
- ".addHeader($S, $S)\n",
- AbstractEndpointWriter.CONTENT_TYPE_HEADER,
- bytes.getContentType().orElse(AbstractEndpointWriter.APPLICATION_OCTET_STREAM));
return null;
}
@@ -304,10 +289,12 @@ public Void visitTypeReference(HttpRequestBodyReference _typeReference) {
@Override
public Void visitBytes(BytesRequest bytes) {
codeBlock.addStatement(
- "$T $L = $T.create($L)",
+ "$T $L = new $T($T.parse($S), $L)",
RequestBody.class,
getOkhttpRequestBodyName(),
- RequestBody.class,
+ clientGeneratorContext.getPoetClassNameFactory().getInputStreamRequestBodyClassName(),
+ MediaType.class,
+ bytes.getContentType().orElse(APPLICATION_OCTET_STREAM),
sdkRequest.getRequestParameterName().getCamelCase().getSafeName());
return null;
}
diff --git a/generators/java/sdk/src/main/resources/FileStream.java b/generators/java/sdk/src/main/resources/FileStream.java
new file mode 100644
index 00000000000..89cc50fe0f3
--- /dev/null
+++ b/generators/java/sdk/src/main/resources/FileStream.java
@@ -0,0 +1,55 @@
+import java.io.InputStream;
+import java.util.Objects;
+import okhttp3.MediaType;
+import okhttp3.RequestBody;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Represents a file stream with associated metadata for file uploads.
+ */
+public class FileStream {
+ private final InputStream inputStream;
+ private final String fileName;
+ private final MediaType contentType;
+
+ /**
+ * Constructs a FileStream with the given input stream and optional metadata.
+ *
+ * @param inputStream The input stream of the file content. Must not be null.
+ * @param fileName The name of the file, or null if unknown.
+ * @param contentType The MIME type of the file content, or null if unknown.
+ * @throws NullPointerException if inputStream is null
+ */
+ public FileStream(InputStream inputStream, @Nullable String fileName, @Nullable MediaType contentType) {
+ this.inputStream = Objects.requireNonNull(inputStream, "Input stream cannot be null");
+ this.fileName = fileName;
+ this.contentType = contentType;
+ }
+
+ public FileStream(InputStream inputStream) {
+ this(inputStream, null, null);
+ }
+
+ public InputStream getInputStream() {
+ return inputStream;
+ }
+
+ @Nullable
+ public String getFileName() {
+ return fileName;
+ }
+
+ @Nullable
+ public MediaType getContentType() {
+ return contentType;
+ }
+
+ /**
+ * Creates a RequestBody suitable for use with OkHttp client.
+ *
+ * @return A RequestBody instance representing this file stream.
+ */
+ public RequestBody toRequestBody() {
+ return new InputStreamRequestBody(contentType, inputStream);
+ }
+}
\ No newline at end of file
diff --git a/generators/java/sdk/src/main/resources/InputStreamRequestBody.java b/generators/java/sdk/src/main/resources/InputStreamRequestBody.java
new file mode 100644
index 00000000000..e125595a22d
--- /dev/null
+++ b/generators/java/sdk/src/main/resources/InputStreamRequestBody.java
@@ -0,0 +1,74 @@
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Objects;
+import okhttp3.MediaType;
+import okhttp3.RequestBody;
+import okhttp3.internal.Util;
+import okio.BufferedSink;
+import okio.Okio;
+import okio.Source;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * A custom implementation of OkHttp's RequestBody that wraps an InputStream.
+ * This class allows streaming of data from an InputStream directly to an HTTP request body,
+ * which is useful for file uploads or sending large amounts of data without loading it all into memory.
+ */
+public class InputStreamRequestBody extends RequestBody {
+ private final InputStream inputStream;
+ private final MediaType contentType;
+
+ /**
+ * Constructs an InputStreamRequestBody with the specified content type and input stream.
+ *
+ * @param contentType the MediaType of the content, or null if not known
+ * @param inputStream the InputStream containing the data to be sent
+ * @throws NullPointerException if inputStream is null
+ */
+ public InputStreamRequestBody(@Nullable MediaType contentType, InputStream inputStream) {
+ this.contentType = contentType;
+ this.inputStream = Objects.requireNonNull(inputStream, "inputStream == null");
+ }
+
+ /**
+ * Returns the content type of this request body.
+ *
+ * @return the MediaType of the content, or null if not specified
+ */
+ @Nullable
+ @Override
+ public MediaType contentType() {
+ return contentType;
+ }
+
+ /**
+ * Returns the content length of this request body, if known.
+ * This method attempts to determine the length using the InputStream's available() method,
+ * which may not always accurately reflect the total length of the stream.
+ *
+ * @return the content length, or -1 if the length is unknown
+ * @throws IOException if an I/O error occurs
+ */
+ @Override
+ public long contentLength() throws IOException {
+ return inputStream.available() == 0 ? -1 : inputStream.available();
+ }
+
+ /**
+ * Writes the content of the InputStream to the given BufferedSink.
+ * This method is responsible for transferring the data from the InputStream to the network request.
+ *
+ * @param sink the BufferedSink to write the content to
+ * @throws IOException if an I/O error occurs during writing
+ */
+ @Override
+ public void writeTo(BufferedSink sink) throws IOException {
+ Source source = null;
+ try {
+ source = Okio.source(inputStream);
+ sink.writeAll(source);
+ } finally {
+ Util.closeQuietly(Objects.requireNonNull(source));
+ }
+ }
+}
\ No newline at end of file
diff --git a/generators/java/sdk/versions.yml b/generators/java/sdk/versions.yml
index ec7122a01b2..951546bc746 100644
--- a/generators/java/sdk/versions.yml
+++ b/generators/java/sdk/versions.yml
@@ -1,10 +1,14 @@
- changelogEntry:
+ - summary: |
+ We now provide endpoint methods for streaming byte array requests in addition to the previous methods accepting
+ byte array directly.
+ type: feat
- summary: |
Bump Jackson version to latest (2.17.2)
type: chore
createdAt: '2024-09-26'
irVersion: 46
- version: 1.2.0
+ version: 2.2.0
- changelogEntry:
- summary: |
diff --git a/generators/python/poetry.lock b/generators/python/poetry.lock
index 217e3204a8e..82e3d2c82cd 100644
--- a/generators/python/poetry.lock
+++ b/generators/python/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
[[package]]
name = "annotated-types"
@@ -204,19 +204,18 @@ reference = "fern-prod"
[[package]]
name = "fern-fern-generator-cli-sdk"
-version = "0.0.59"
+version = "0.0.17"
description = ""
optional = false
python-versions = ">=3.8,<4.0"
files = [
- {file = "fern_fern_generator_cli_sdk-0.0.59-py3-none-any.whl", hash = "sha256:daddbc4b48585f0ad0bd3251b6f045e74fbcb83bcdfdd7b9b01b7df03ab29763"},
- {file = "fern_fern_generator_cli_sdk-0.0.59.tar.gz", hash = "sha256:7d88692519432a4f551e1125b2ca70cdb539a7d43177f2e018cb492a01b716bd"},
+ {file = "fern_fern_generator_cli_sdk-0.0.17-py3-none-any.whl", hash = "sha256:b5cc5c29dbdfb1d1569c5006aad94e49d36b9a6de92c2678c7db3895c8f037e2"},
+ {file = "fern_fern_generator_cli_sdk-0.0.17.tar.gz", hash = "sha256:abe3fda300e0cc52513811d70255f298a721036c267277ba147f7948de1d8b3c"},
]
[package.dependencies]
httpx = ">=0.21.2"
pydantic = ">=1.9.2"
-pydantic-core = ">=2.18.2,<3.0.0"
typing_extensions = ">=4.0.0"
[package.source]
@@ -1058,4 +1057,4 @@ files = [
[metadata]
lock-version = "2.0"
python-versions = "^3.9"
-content-hash = "afdb8556cad38c3df3faef1c8a2a98548ec2269e3a539bf570b7718fa975d380"
+content-hash = "6f8243a7f89479c2cf0e97888c0651b554d717a20d6e3d8b1f75e978495b0594"
diff --git a/generators/python/pyproject.toml b/generators/python/pyproject.toml
index 333ec7782d0..bc62fd8adc3 100644
--- a/generators/python/pyproject.toml
+++ b/generators/python/pyproject.toml
@@ -12,7 +12,7 @@ fern-fern-generator-exec-sdk = {version = "0.82.5", source = "fern-prod"}
ordered-set = "^4.1.0"
pydantic-core = "^2.18.2"
fern-fern-fdr-sdk = {version = "0.98.20", source = "fern-prod"}
-fern-fern-generator-cli-sdk = {version = "0.0.59", source = "fern-prod"}
+fern-fern-generator-cli-sdk = {version = "0.0.17", source = "fern-prod"}
fern_fern_ir_v53 = "53.12.0"
[tool.poetry.dev-dependencies]
diff --git a/generators/python/sdk/versions.yml b/generators/python/sdk/versions.yml
index 7ffabf3be33..441658d8188 100644
--- a/generators/python/sdk/versions.yml
+++ b/generators/python/sdk/versions.yml
@@ -1,4 +1,18 @@
# For unreleased changes, use unreleased.yml
+- version: 4.2.7
+ irVersion: 53
+ changelogEntry:
+ - type: fix
+ summary: |
+ The generated README will now have a section that links to the generated
+ SDK Reference (in `reference.md`).
+
+ ```md
+ ## Reference
+
+ A full reference for this library can be found [here](./reference.md).
+ ```
+
- version: 4.2.7-rc4
irVersion: 53
changelogEntry:
diff --git a/generators/python/src/fern_python/generator_cli/generator_cli.py b/generators/python/src/fern_python/generator_cli/generator_cli.py
index b2df1968499..244d9df4625 100644
--- a/generators/python/src/fern_python/generator_cli/generator_cli.py
+++ b/generators/python/src/fern_python/generator_cli/generator_cli.py
@@ -178,6 +178,7 @@ def _get_readme_config(
api_reference_link=self._ir.readme_config.api_reference_link if self._ir.readme_config else None,
banner_link=self._ir.readme_config.banner_link if self._ir.readme_config else None,
features=features,
+ reference_markdown_path=f"./{REFERENCE_FILENAME}"
)
def _read_feature_config(self) -> generatorcli.feature.FeatureConfig:
diff --git a/generators/typescript/sdk/CHANGELOG.md b/generators/typescript/sdk/CHANGELOG.md
index c90514c8f15..0ffec774d58 100644
--- a/generators/typescript/sdk/CHANGELOG.md
+++ b/generators/typescript/sdk/CHANGELOG.md
@@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [0.40.7] - 2024-09-28
+
+- Fix: The generated README will now have a section that links to the generated
+ SDK Reference (in `reference.md`).
+
+ ```md
+ ## Reference
+
+ A full reference for this library can be found [here](./reference.md).
+ ```
+
+## [0.40.6] - 2024-09-18
+
+- Fix: The TypeScript SDK now supports specifying a custom contentType if one is specified.
+
## [0.40.5] - 2024-09-18
- Fix: The snippet templates for file upload are now accurate and also respect the feature
diff --git a/generators/typescript/sdk/VERSION b/generators/typescript/sdk/VERSION
index d3568f30dc8..7754b3ee7fd 100644
--- a/generators/typescript/sdk/VERSION
+++ b/generators/typescript/sdk/VERSION
@@ -1 +1 @@
-0.40.5
+0.40.7
diff --git a/generators/typescript/sdk/client-class-generator/src/endpoint-request/GeneratedDefaultEndpointRequest.ts b/generators/typescript/sdk/client-class-generator/src/endpoint-request/GeneratedDefaultEndpointRequest.ts
index 1801367e47a..47cfde2d95c 100644
--- a/generators/typescript/sdk/client-class-generator/src/endpoint-request/GeneratedDefaultEndpointRequest.ts
+++ b/generators/typescript/sdk/client-class-generator/src/endpoint-request/GeneratedDefaultEndpointRequest.ts
@@ -181,7 +181,7 @@ export class GeneratedDefaultEndpointRequest implements GeneratedEndpointRequest
headers: this.getHeaders(context),
queryParameters: this.queryParams.getReferenceTo(context),
body: this.getSerializedRequestBodyWithNullCheck(context),
- contentType: "application/json",
+ contentType: this.requestBody?.contentType ?? "application/json",
requestType: "json"
};
}
diff --git a/generators/typescript/sdk/generator/package.json b/generators/typescript/sdk/generator/package.json
index 6681607d87e..dd61672d0ce 100644
--- a/generators/typescript/sdk/generator/package.json
+++ b/generators/typescript/sdk/generator/package.json
@@ -32,7 +32,7 @@
"@fern-api/typescript-codegen": "workspace:*",
"@fern-api/generator-commons": "workspace:*",
"@fern-api/logger": "workspace:*",
- "@fern-fern/generator-cli-sdk": "0.0.56",
+ "@fern-fern/generator-cli-sdk": "0.0.17",
"@fern-fern/generator-exec-sdk": "^0.0.898",
"@fern-fern/ir-sdk": "53.8.0",
"@fern-fern/snippet-sdk": "^0.0.5526",
diff --git a/generators/typescript/sdk/generator/src/readme/ReadmeConfigBuilder.ts b/generators/typescript/sdk/generator/src/readme/ReadmeConfigBuilder.ts
index d96f8fac260..0d229dcd9c2 100644
--- a/generators/typescript/sdk/generator/src/readme/ReadmeConfigBuilder.ts
+++ b/generators/typescript/sdk/generator/src/readme/ReadmeConfigBuilder.ts
@@ -45,6 +45,7 @@ export class ReadmeConfigBuilder {
organization: context.config.organization,
apiReferenceLink: context.ir.readmeConfig?.apiReferenceLink,
bannerLink: context.ir.readmeConfig?.bannerLink,
+ referenceMarkdownPath: "./reference.md",
features
};
}
diff --git a/packages/cli/cli/versions.yml b/packages/cli/cli/versions.yml
index f4b4ccb3828..5ee5c3d9f47 100644
--- a/packages/cli/cli/versions.yml
+++ b/packages/cli/cli/versions.yml
@@ -1,3 +1,29 @@
+- changelogEntry:
+ - summary: |
+ Any markdown files that have custom components are also pushed up to the Fern Docs
+ platform.
+ type: fix
+ irVersion: 53
+ version: 0.43.8
+
+- changelogEntry:
+ - summary: |
+ The `valid-markdown` rule has been updated to try and parse the markdown file into a
+ valid AST. If the file fails to parse, `fern check` will log an error as well
+ as the path to the markdown.
+ type: fix
+ irVersion: 53
+ version: 0.43.7
+
+- changelogEntry:
+ - summary: |
+ The OpenAPI importer now appropriately brings in responses that are under the `text/event-stream`
+ Content-Type if your endpoint is annotated with `x-fern-streaming`.
+ If your endpoint is not annotated with `x-fern-streaming`, then the response will be ignored.
+ type: fix
+ irVersion: 53
+ version: 0.43.6
+
- changelogEntry:
- summary: |
If you use the `x-fern-streaming` extension and want to provide different descriptions
diff --git a/packages/cli/docs-importers/commons/.depcheckrc.json b/packages/cli/docs-importers/commons/.depcheckrc.json
new file mode 100644
index 00000000000..a3a4f43188c
--- /dev/null
+++ b/packages/cli/docs-importers/commons/.depcheckrc.json
@@ -0,0 +1,10 @@
+{
+ "ignores": [
+ "@types/jest",
+ "globals",
+ "@types/node"
+ ],
+ "ignore-patterns": [
+ "lib"
+ ]
+}
\ No newline at end of file
diff --git a/packages/cli/docs-importers/commons/.prettierrc.cjs b/packages/cli/docs-importers/commons/.prettierrc.cjs
new file mode 100644
index 00000000000..9b6214d5129
--- /dev/null
+++ b/packages/cli/docs-importers/commons/.prettierrc.cjs
@@ -0,0 +1 @@
+module.exports = require("../../../../.prettierrc.json");
diff --git a/packages/cli/docs-importers/commons/package.json b/packages/cli/docs-importers/commons/package.json
new file mode 100644
index 00000000000..06e5f80555f
--- /dev/null
+++ b/packages/cli/docs-importers/commons/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "@fern-api/docs-importer-commons",
+ "version": "0.0.0",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/fern-api/fern.git",
+ "directory": "packages/cli/docs-importers/mintlify"
+ },
+ "private": true,
+ "files": [
+ "lib"
+ ],
+ "type": "module",
+ "source": "src/index.ts",
+ "main": "lib/index.js",
+ "types": "lib/index.d.ts",
+ "sideEffects": false,
+ "scripts": {
+ "clean": "rm -rf ./lib && tsc --build --clean",
+ "compile": "tsc --build",
+ "test": "vitest --passWithNoTests --run",
+ "test:update": "vitest --passWithNoTests --run -u",
+ "lint:eslint": "eslint --max-warnings 0 . --ignore-path=../../../../../.eslintignore",
+ "lint:eslint:fix": "yarn lint:eslint --fix",
+ "format": "prettier --write --ignore-unknown --ignore-path ../../../../../shared/.prettierignore \"**\"",
+ "format:check": "prettier --check --ignore-unknown --ignore-path ../../../../../shared/.prettierignore \"**\"",
+ "organize-imports": "organize-imports-cli tsconfig.json",
+ "depcheck": "depcheck"
+ },
+ "dependencies": {
+ "@fern-api/configuration": "workspace:*",
+ "@fern-api/fs-utils": "workspace:*",
+ "@fern-api/task-context": "workspace:*",
+ "@fern-fern/fdr-cjs-sdk": "0.111.0-51d403bce",
+ "js-yaml": "^4.1.0"
+ },
+ "devDependencies": {
+ "@types/js-yaml": "^4.0.8",
+ "@types/node": "^18.7.18",
+ "depcheck": "^1.4.6",
+ "eslint": "^8.56.0",
+ "globals": "link:@types/vitest/globals",
+ "organize-imports-cli": "^0.10.0",
+ "prettier": "^2.7.1",
+ "typescript": "4.6.4",
+ "vitest": "^2.0.5"
+ }
+}
\ No newline at end of file
diff --git a/packages/cli/docs-importers/commons/src/DocsImporter.ts b/packages/cli/docs-importers/commons/src/DocsImporter.ts
new file mode 100644
index 00000000000..60a60d71812
--- /dev/null
+++ b/packages/cli/docs-importers/commons/src/DocsImporter.ts
@@ -0,0 +1,18 @@
+import { FernDocsBuilder } from "./FernDocsBuilder";
+import { TaskContext } from "@fern-api/task-context";
+
+export declare namespace DocsImporter {
+ interface BaseArgs {
+ context: TaskContext;
+ }
+}
+
+export abstract class DocsImporter {
+ protected context: TaskContext;
+
+ constructor({ context }: DocsImporter.BaseArgs) {
+ this.context = context;
+ }
+
+ public abstract import({ args, builder }: { args: Args; builder: FernDocsBuilder }): Promise;
+}
diff --git a/packages/cli/docs-importers/commons/src/FernDocsBuilder.ts b/packages/cli/docs-importers/commons/src/FernDocsBuilder.ts
new file mode 100644
index 00000000000..35a3920d024
--- /dev/null
+++ b/packages/cli/docs-importers/commons/src/FernDocsBuilder.ts
@@ -0,0 +1,62 @@
+import { AbsoluteFilePath, RelativeFilePath } from "@fern-api/fs-utils";
+import { docsYml } from "@fern-api/configuration";
+import { FernRegistry as CjsFdrSdk } from "@fern-fern/fdr-cjs-sdk";
+
+/**
+ * A builder utility to help
+ */
+export abstract class FernDocsBuilder {
+ public abstract addOpenAPI({ absolutePathToOpenAPI }: { absolutePathToOpenAPI: AbsoluteFilePath }): void;
+
+ public abstract addMarkdownPage({
+ frontmatter,
+ markdown,
+ relativeFilePathFromDocsYml
+ }: {
+ frontmatter: CjsFdrSdk.docs.latest.Frontmatter;
+ markdown: string;
+ relativeFilePathFromDocsYml: RelativeFilePath;
+ }): void;
+
+ public abstract addAsset({
+ absoluteFilePathToAsset,
+ relativeFilePathFromDocsYml
+ }: {
+ absoluteFilePathToAsset: AbsoluteFilePath;
+ relativeFilePathFromDocsYml: RelativeFilePath;
+ }): void;
+
+ public abstract addVersion({
+ versionConfig,
+ navigation
+ }: {
+ versionConfig: docsYml.RawSchemas.VersionConfig;
+ navigation: docsYml.RawSchemas.VersionFileConfig;
+ }): void;
+
+ public abstract getNavigationBuilder({
+ tabId,
+ tabConfig
+ }?: {
+ tabId: docsYml.RawSchemas.TabId;
+ tabConfig: docsYml.RawSchemas.TabConfig;
+ }): FernDocsNavigationBuilder;
+
+ public abstract addNavbarLink({ link }: { link: docsYml.RawSchemas.NavbarLink }): void;
+
+ public abstract setTitle({ title }: { title: string }): void;
+
+ public abstract setFavicon({ favicon }: { favicon: RelativeFilePath }): void;
+
+ public abstract setLogo({ logo }: { logo: docsYml.RawSchemas.LogoConfiguration }): void;
+
+ public abstract setColors({ colors }: { colors: docsYml.RawSchemas.ColorsConfiguration }): void;
+
+ public abstract setLayout({ layout }: { layout: docsYml.RawSchemas.LayoutConfig }): void;
+
+ public abstract build({ outputDirectory }: { outputDirectory: AbsoluteFilePath }): void;
+}
+
+export abstract class FernDocsNavigationBuilder {
+ public abstract addItem({ item }: { item: docsYml.RawSchemas.NavigationItem }): void;
+}
diff --git a/packages/cli/docs-importers/commons/src/FernDocsBuilderImpl.ts b/packages/cli/docs-importers/commons/src/FernDocsBuilderImpl.ts
new file mode 100644
index 00000000000..477e6b62ac4
--- /dev/null
+++ b/packages/cli/docs-importers/commons/src/FernDocsBuilderImpl.ts
@@ -0,0 +1,175 @@
+import { docsYml, DOCS_CONFIGURATION_FILENAME, FERN_DIRECTORY } from "@fern-api/configuration";
+import { AbsoluteFilePath, dirname, join, RelativeFilePath } from "@fern-api/fs-utils";
+import { FernDocsBuilder, FernDocsNavigationBuilder } from "./FernDocsBuilder";
+import { mkdir, writeFile, cp } from "fs/promises";
+import yaml from "js-yaml";
+import { FernRegistry as CjsFdrSdk } from "@fern-fern/fdr-cjs-sdk";
+
+interface MarkdownPage {
+ frontmatter: CjsFdrSdk.docs.latest.Frontmatter;
+ markdown: string;
+}
+
+interface Asset {
+ absoluteFilePathToAsset: AbsoluteFilePath;
+}
+
+export class FernDocsBuilderImpl extends FernDocsBuilder {
+ private absolutePathsToOpenAPI: AbsoluteFilePath[] = [];
+ private nonTabbedNavigation: NonTabbedNavigationBuilderImpl = new NonTabbedNavigationBuilderImpl();
+ private tabbedNavigation: Record = {};
+ private markdownPages: Record = {};
+ private assets: Record = {};
+ private docsYml: docsYml.RawSchemas.DocsConfiguration = {
+ instances: []
+ };
+
+ public addOpenAPI({ absolutePathToOpenAPI }: { absolutePathToOpenAPI: AbsoluteFilePath }): void {
+ this.absolutePathsToOpenAPI.push(absolutePathToOpenAPI);
+ }
+
+ public addMarkdownPage({
+ frontmatter,
+ markdown,
+ relativeFilePathFromDocsYml
+ }: {
+ frontmatter: CjsFdrSdk.docs.latest.Frontmatter;
+ markdown: string;
+ relativeFilePathFromDocsYml: RelativeFilePath;
+ }): void {
+ this.markdownPages[relativeFilePathFromDocsYml] = { markdown, frontmatter };
+ }
+
+ public addAsset({
+ absoluteFilePathToAsset,
+ relativeFilePathFromDocsYml
+ }: {
+ absoluteFilePathToAsset: AbsoluteFilePath;
+ relativeFilePathFromDocsYml: RelativeFilePath;
+ }): void {
+ this.assets[relativeFilePathFromDocsYml] = { absoluteFilePathToAsset };
+ }
+
+ public getNavigationBuilder(args?: {
+ tabId: string;
+ tabConfig: docsYml.RawSchemas.TabConfig;
+ }): FernDocsNavigationBuilder {
+ if (args != null) {
+ let navigationBuilder = this.tabbedNavigation[args.tabId];
+ if (navigationBuilder == null) {
+ navigationBuilder = new TabbedNavigationBuilderImpl(args.tabId, args.tabConfig);
+ this.tabbedNavigation[args.tabId] = navigationBuilder;
+ }
+ return navigationBuilder;
+ }
+ return this.nonTabbedNavigation;
+ }
+
+ public addVersion({
+ versionConfig,
+ navigation
+ }: {
+ versionConfig: docsYml.RawSchemas.VersionConfig;
+ navigation: docsYml.RawSchemas.VersionFileConfig;
+ }): void {
+ throw new Error("Method not implemented.");
+ }
+
+ public addNavbarLink({ link }: { link: docsYml.RawSchemas.NavbarLink }): void {
+ if (this.docsYml.navbarLinks == null) {
+ this.docsYml.navbarLinks = [link];
+ }
+ this.docsYml.navbarLinks.push(link);
+ }
+
+ public setTitle({ title }: { title: string }): void {
+ this.docsYml.title = title;
+ }
+
+ public setFavicon({ favicon }: { favicon: RelativeFilePath }): void {
+ this.docsYml.favicon = favicon;
+ }
+
+ public setLogo({ logo }: { logo: docsYml.RawSchemas.LogoConfiguration }): void {
+ this.docsYml.logo = logo;
+ }
+
+ public setColors({ colors }: { colors: docsYml.RawSchemas.ColorsConfiguration }): void {
+ this.docsYml.colors = colors;
+ }
+
+ public setLayout({ layout }: { layout: docsYml.RawSchemas.LayoutConfig }): void {
+ this.docsYml.layout = layout;
+ }
+
+ public async build({ outputDirectory }: { outputDirectory: AbsoluteFilePath }): Promise {
+ const absolutePathToFernDirectory = join(outputDirectory, RelativeFilePath.of(FERN_DIRECTORY));
+ await mkdir(absolutePathToFernDirectory, { recursive: true });
+
+ if (Object.keys(this.tabbedNavigation).length > 0) {
+ this.docsYml.tabs = Object.fromEntries(
+ Object.entries(this.tabbedNavigation).map(([key, value]) => {
+ return [value.tabId, value.tabConfig];
+ })
+ );
+ const tabbedNavigationItems: docsYml.RawSchemas.TabbedNavigationItem[] = [];
+ Object.entries(this.tabbedNavigation).forEach(([_, value]) => {
+ const tabbedItem: docsYml.RawSchemas.TabbedNavigationItem = {
+ tab: value.tabId,
+ layout: value.items
+ };
+ tabbedNavigationItems.push(tabbedItem);
+ });
+ this.docsYml.navigation = tabbedNavigationItems;
+ } else if (this.nonTabbedNavigation != null) {
+ this.docsYml.navigation = this.nonTabbedNavigation.items;
+ }
+
+ const absoluteFilePathToDocsYml = join(
+ absolutePathToFernDirectory,
+ RelativeFilePath.of(DOCS_CONFIGURATION_FILENAME)
+ );
+ await writeFile(absoluteFilePathToDocsYml, yaml.dump(this.docsYml));
+
+ await Promise.all(
+ Object.entries(this.markdownPages).map(async ([filepath, page]) => {
+ const absoluteFilepathToMarkdownPage = join(absolutePathToFernDirectory, RelativeFilePath.of(filepath));
+ await mkdir(dirname(absoluteFilepathToMarkdownPage), { recursive: true });
+ const frontmatter =
+ Object.keys(page.frontmatter).length > 0
+ ? `---\n${yaml.dump(JSON.parse(JSON.stringify(page.frontmatter)))}---\n\n`
+ : "";
+ await writeFile(absoluteFilepathToMarkdownPage, `${frontmatter}${page.markdown}`);
+ })
+ );
+
+ await Promise.all(
+ Object.entries(this.assets).map(async ([filepath, asset]) => {
+ const absolutePathToAsset = join(absolutePathToFernDirectory, RelativeFilePath.of(filepath));
+ await mkdir(dirname(absolutePathToAsset), { recursive: true });
+ await cp(asset.absoluteFilePathToAsset, absolutePathToAsset);
+ })
+ );
+ }
+}
+
+export class TabbedNavigationBuilderImpl implements FernDocsNavigationBuilder {
+ public items: docsYml.RawSchemas.NavigationItem[] = [];
+
+ public constructor(
+ public readonly tabId: docsYml.RawSchemas.TabId,
+ public readonly tabConfig: docsYml.RawSchemas.TabConfig
+ ) {}
+
+ public addItem({ item }: { item: docsYml.RawSchemas.NavigationItem }): void {
+ this.items.push(item);
+ }
+}
+
+export class NonTabbedNavigationBuilderImpl implements FernDocsNavigationBuilder {
+ public items: docsYml.RawSchemas.NavigationItem[] = [];
+
+ public addItem({ item }: { item: docsYml.RawSchemas.NavigationItem }): void {
+ this.items.push(item);
+ }
+}
diff --git a/packages/cli/docs-importers/commons/src/index.ts b/packages/cli/docs-importers/commons/src/index.ts
new file mode 100644
index 00000000000..6d911a1a755
--- /dev/null
+++ b/packages/cli/docs-importers/commons/src/index.ts
@@ -0,0 +1,3 @@
+export { DocsImporter } from "./DocsImporter";
+export { FernDocsBuilder, FernDocsNavigationBuilder } from "./FernDocsBuilder";
+export { FernDocsBuilderImpl } from "./FernDocsBuilderImpl";
diff --git a/packages/cli/docs-importers/commons/tsconfig.json b/packages/cli/docs-importers/commons/tsconfig.json
new file mode 100644
index 00000000000..dd3f3d0394a
--- /dev/null
+++ b/packages/cli/docs-importers/commons/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "extends": "../../../../shared/tsconfig.shared.json",
+ "compilerOptions": { "composite": true, "outDir": "lib", "rootDir": "src" },
+ "include": ["./src/**/*"],
+ "references": [ { "path": "../../../commons/core-utils" }, { "path": "../../../commons/fs-utils" }, { "path": "../../task-context" } ]
+}
diff --git a/packages/cli/docs-importers/commons/vitest.config.ts b/packages/cli/docs-importers/commons/vitest.config.ts
new file mode 100644
index 00000000000..d11017dc676
--- /dev/null
+++ b/packages/cli/docs-importers/commons/vitest.config.ts
@@ -0,0 +1 @@
+export { default } from "../../../../shared/vitest.config";
diff --git a/packages/cli/docs-importers/mintlify/.depcheckrc.json b/packages/cli/docs-importers/mintlify/.depcheckrc.json
new file mode 100644
index 00000000000..a3a4f43188c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/.depcheckrc.json
@@ -0,0 +1,10 @@
+{
+ "ignores": [
+ "@types/jest",
+ "globals",
+ "@types/node"
+ ],
+ "ignore-patterns": [
+ "lib"
+ ]
+}
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/.prettierrc.cjs b/packages/cli/docs-importers/mintlify/.prettierrc.cjs
new file mode 100644
index 00000000000..9b6214d5129
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/.prettierrc.cjs
@@ -0,0 +1 @@
+module.exports = require("../../../../.prettierrc.json");
diff --git a/packages/cli/docs-importers/mintlify/package.json b/packages/cli/docs-importers/mintlify/package.json
new file mode 100644
index 00000000000..acc9dcfc8ad
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "@fern-api/mintlify-importer",
+ "version": "0.0.0",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/fern-api/fern.git",
+ "directory": "packages/cli/docs-importers/mintlify"
+ },
+ "private": true,
+ "files": [
+ "lib"
+ ],
+ "type": "module",
+ "source": "src/index.ts",
+ "main": "lib/index.js",
+ "types": "lib/index.d.ts",
+ "sideEffects": false,
+ "scripts": {
+ "clean": "rm -rf ./lib && tsc --build --clean",
+ "compile": "tsc --build",
+ "test": "vitest --run",
+ "test:update": "vitest --run -u",
+ "lint:eslint": "eslint --max-warnings 0 . --ignore-path=../../../../../.eslintignore",
+ "lint:eslint:fix": "yarn lint:eslint --fix",
+ "format": "prettier --write --ignore-unknown --ignore-path ../../../../../shared/.prettierignore \"**\"",
+ "format:check": "prettier --check --ignore-unknown --ignore-path ../../../../../shared/.prettierignore \"**\"",
+ "organize-imports": "organize-imports-cli tsconfig.json",
+ "depcheck": "depcheck"
+ },
+ "dependencies": {
+ "@fern-api/configuration": "workspace:*",
+ "@fern-api/docs-importer-commons": "workspace:*",
+ "@fern-api/core-utils": "workspace:*",
+ "@fern-api/task-context": "workspace:*",
+ "@fern-api/fs-utils": "workspace:*",
+ "@fern-api/logger": "workspace:*",
+ "@fern-fern/fdr-cjs-sdk": "0.111.0-51d403bce",
+ "gray-matter": "^4.0.3"
+ },
+ "devDependencies": {
+ "@types/node": "^18.7.18",
+ "depcheck": "^1.4.6",
+ "eslint": "^8.56.0",
+ "globals": "link:@types/vitest/globals",
+ "organize-imports-cli": "^0.10.0",
+ "prettier": "^2.7.1",
+ "typescript": "4.6.4",
+ "vitest": "^2.0.5"
+ }
+}
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/MintlifyImporter.ts b/packages/cli/docs-importers/mintlify/src/MintlifyImporter.ts
new file mode 100644
index 00000000000..4aeb6008e14
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/MintlifyImporter.ts
@@ -0,0 +1,131 @@
+import { AbsoluteFilePath, dirname, join, RelativeFilePath } from "@fern-api/fs-utils";
+import { DocsImporter, FernDocsNavigationBuilder } from "@fern-api/docs-importer-commons";
+import { FernDocsBuilder } from "@fern-api/docs-importer-commons";
+import { readFile } from "fs/promises";
+import { MintJsonSchema, MintNavigationItem } from "./mintlify";
+import { convertLogo } from "./convertLogo";
+import { convertColors } from "./convertColors";
+import { convertNavigationItem } from "./convertNavigationItem";
+import { getTabForMintItem } from "./utils/getTabForMintItem";
+import { stripLeadingSlash } from "@fern-api/core-utils";
+
+export declare namespace MintlifyImporter {
+ interface Args {
+ absolutePathToMintJson: AbsoluteFilePath;
+ }
+}
+
+interface TabInfo {
+ name: string;
+ url: string;
+ navigationBuilder: FernDocsNavigationBuilder;
+}
+
+export class MintlifyImporter extends DocsImporter {
+ private documentationTab: TabInfo | undefined = undefined;
+ private tabUrlToInfo: Record = {};
+
+ public async import({ args, builder }: { args: MintlifyImporter.Args; builder: FernDocsBuilder }): Promise {
+ const mintJsonContent = await readFile(args.absolutePathToMintJson, "utf-8");
+ const mint = JSON.parse(mintJsonContent) as MintJsonSchema;
+
+ builder.setTitle({ title: mint.name });
+
+ const relativePathToFavicon = RelativeFilePath.of(mint.favicon.substring(1));
+ builder.setFavicon({ favicon: relativePathToFavicon });
+ builder.addAsset({
+ absoluteFilePathToAsset: join(dirname(args.absolutePathToMintJson), relativePathToFavicon),
+ relativeFilePathFromDocsYml: relativePathToFavicon
+ });
+
+ const logo = convertLogo({ logo: mint.logo, builder, absolutePathToMintJson: args.absolutePathToMintJson });
+ if (logo != null) {
+ builder.setLogo({ logo });
+ }
+ this.context.logger.debug("Converted logo");
+
+ const colors = convertColors(mint.colors);
+ if (colors != null) {
+ builder.setColors({ colors });
+ }
+ this.context.logger.debug("Converted color configuration");
+
+ for (const tab of mint.tabs ?? []) {
+ this.tabUrlToInfo[tab.url] = {
+ name: tab.name,
+ url: tab.url,
+ navigationBuilder: builder.getNavigationBuilder({
+ tabId: tab.url,
+ tabConfig: { slug: tab.url, displayName: tab.name }
+ })
+ };
+ }
+
+ for (const mintItem of mint.navigation) {
+ const section = await convertNavigationItem({
+ absolutePathToMintJson: args.absolutePathToMintJson,
+ item: mintItem,
+ builder,
+ context: this.context
+ });
+ const nav = await this.getNavigationBuilder({ mintItem, builder });
+ if (section != null) {
+ nav.addItem({ item: section });
+ }
+ }
+ this.context.logger.debug("Converted navigation");
+
+ if (typeof mint.openapi === "string") {
+ const absolutePathToOpenAPI = join(
+ dirname(args.absolutePathToMintJson),
+ RelativeFilePath.of(stripLeadingSlash(mint.openapi))
+ );
+ builder.addOpenAPI({
+ absolutePathToOpenAPI
+ });
+ } else if (mint.openapi != null) {
+ for (const openapi of mint.openapi) {
+ const absolutePathToOpenAPI = join(
+ dirname(args.absolutePathToMintJson),
+ RelativeFilePath.of(stripLeadingSlash(openapi))
+ );
+ builder.addOpenAPI({
+ absolutePathToOpenAPI
+ });
+ }
+ }
+ this.context.logger.debug("Imported OpenAPI specs");
+ }
+
+ private async getNavigationBuilder({
+ mintItem,
+ builder
+ }: {
+ mintItem: MintNavigationItem;
+ builder: FernDocsBuilder;
+ }): Promise {
+ if (Object.keys(this.tabUrlToInfo).length > 0) {
+ const tabUrl = getTabForMintItem({ mintItem });
+ if (tabUrl == null) {
+ return this.context.failAndThrow(`Failed to assign navigation item to a tab group: ${mintItem.group}`);
+ }
+ const tab = this.tabUrlToInfo[tabUrl] ?? this.getDefaultDocumentationTab(builder);
+ return tab.navigationBuilder;
+ }
+ return builder.getNavigationBuilder();
+ }
+
+ private getDefaultDocumentationTab(builder: FernDocsBuilder): TabInfo {
+ if (this.documentationTab == null) {
+ this.documentationTab = {
+ name: "Documentation",
+ url: "documentation",
+ navigationBuilder: builder.getNavigationBuilder({
+ tabId: "documentation",
+ tabConfig: { displayName: "Documentation", slug: "documentation" }
+ })
+ };
+ }
+ return this.documentationTab;
+ }
+}
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/README.md b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/README.md
new file mode 100644
index 00000000000..6076636c92b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/README.md
@@ -0,0 +1,32 @@
+# Mintlify Starter Kit
+
+Click on `Use this template` to copy the Mintlify starter kit. The starter kit contains examples including
+
+- Guide pages
+- Navigation
+- Customizations
+- API Reference pages
+- Use of popular components
+
+### 👩💻 Development
+
+Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation changes locally. To install, use the following command
+
+```
+npm i -g mintlify
+```
+
+Run the following command at the root of your documentation (where mint.json is)
+
+```
+mintlify dev
+```
+
+### 😎 Publishing Changes
+
+Install our Github App to autopropagate changes from youre repo to your deployment. Changes will be deployed to production automatically after pushing to the default branch. Find the link to install on your dashboard.
+
+#### Troubleshooting
+
+- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies.
+- Page loads as a 404 - Make sure you are running in a folder with `mint.json`
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/_snippets/snippet-example.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/_snippets/snippet-example.mdx
new file mode 100644
index 00000000000..089334c54f9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/_snippets/snippet-example.mdx
@@ -0,0 +1,3 @@
+## My Snippet
+
+This is an example of a reusable snippet
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batch.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batch.mdx
new file mode 100644
index 00000000000..404611482a5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batch.mdx
@@ -0,0 +1,93 @@
+---
+title: "Batch Calling"
+api: "POST https://api.bland.ai/batch"
+description: "Send a series of calls with a single api call"
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ This is the prompt or task used for all the phone calls in the request. Information can be inserted into it surrounding variable names with \{\{curly braces\}\}.
+
+Example:
+
+```json
+"You are calling {{business}} to renew their subscription to {{service}} before it expires on {{date}}."
+```
+
+
+
+
+ Define a list of calls to make and their properties.
+
+ Each call in call_data *must* have a `phone_number` property. Properties are case-sensitive.
+
+Example:
+
+```json
+[
+ {
+ "phone_number": "1234567890",
+ "business": "ABC co.",
+ "service": "Netflix",
+ "date": "September 4th"
+ },
+ {
+ "phone_number": "32176540987",
+ "business": "XYZ inc.",
+ "service": "Window Cleaning",
+ "date": "December 20th"
+ }
+]
+```
+
+
+
+
+ Adds a user-friendly label to your batch to keep track of it's original intention. This can help differentiate
+ multiple call batches that are part of the same Campaign. Shown when a batch is retreived.
+
+
+
+ Use ```campaign_id``` to organize related batches together. This can be set manually or auto-generated through
+ Campaigns.
+
+
+
+ When this is set to ```true```, only the first call of ```call_data``` will be dispatched. A common use case is to set the first ```phone_number``` value to your own to confirm everything's set up properly.
+
+Includes additional information in the response when true so that it's easier to find any issues.
+
+
+
+
+ All other parameters supported by the [Send Call](/api-v1/post/calls) endpoint are supported here as well. They will
+ be applied to each call in the batch.
+
+
+### Response
+
+
+ If anything other than "success" is returned, there was an error.
+
+
+
+ The unique identifier for the batch.
+
+
+
+
+```json Response
+{
+ "message": "success",
+ "batch_id": "3p$7rQ3p9sT5bzmF-gen-batch"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batch_get.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batch_get.mdx
new file mode 100644
index 00000000000..84f9ea94257
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batch_get.mdx
@@ -0,0 +1,266 @@
+---
+title: "Retrieve a Batch"
+api: "GET https://api.bland.ai/batch"
+description: "Retrieves calls and batch data for a specific batch_id."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Query Parameters
+
+
+ The unique identifier for the batch of calls you want to retrieve.
+
+
+
+ Whether or not to include individual call data in the response.
+
+
+
+ If calls are included, can be set to false to exclude transcripts from the response.
+
+
+
+ If calls are included, can be set to false to exclude analysis from the response.
+
+
+### Response
+
+
+ An object containing parameters and settings for the batch.
+
+
+
+ The unique identifier of the batch - used as the `batch_id` parameter in other API calls.
+
+
+
+ The creation timestamp of the batch.
+
+
+
+ The label or description of the batch.
+
+
+
+ The base prompt used for calls in this batch.
+
+
+
+ The endpoint code used for API integration.
+
+
+
+ An object containing parameters for the calls in the batch.
+
+
+
+ An object containing analysis data for the batch.
+
+
+
+ The total number of calls in the batch, including completed and in-progress calls.
+
+
+
+ The total number of completed calls in the batch.
+
+
+
+ The total number of in-progress calls in the batch.
+
+
+
+ An object containing the number of calls in each queue status.
+
+Example:
+
+```json
+{
+ "complete": 237,
+ "queued": 2,
+ "call_error": 1
+}
+```
+
+
+
+
+ Contains `average`, `average_nonzero`, `summary` and `all` fields.
+
+- `average`: The average call length in seconds.
+- `average_nonzero`: The average call length in seconds, excluding calls with a length of less than a second.
+- `summary`: A summary of the call lengths, grouped into ranges.
+- `all`: Contains each call length, in case you want to use a different grouping than the default.
+
+
+
+ Contains each `call_id` in the batch.
+
+
+
+ Contains any error messages that calls in the batch may have.
+
+Example:
+
+```json
+[
+ {
+ "call_id": "c52f5f8c-147e-478c-4b40-88214feeba29",
+ "error_message": "Cannot transfer to +12223334444 - Call is no longer active"
+ }
+]
+```
+
+
+
+
+ Contains the number of calls that have been sent to each endpoint. Applicable only to API integrations.
+
+
+
+ An array of objects, each representing individual call data.
+
+
+
+ The timestamp when the individual call was created.
+
+
+
+ The phone number the call was made to.
+
+
+
+ The phone number the call was made from.
+
+
+
+ Indicates if the call was completed.
+
+
+
+ The unique identifier for each individual call.
+
+
+
+ The duration of the call in minutes.
+
+
+
+
+```json Response
+{
+ "batch_params": {
+ "id": "AAcQq8zXxLB56LWg-gen-batch",
+ "campaign_id": null,
+ "created_at": "2023-12-07T20:43:44.544773+00:00",
+ "label": "Customer Satisfaction Follow-up",
+ "base_prompt": "You are calling {{name}} about their recent purchase of the item: {{item}}. Ask them each of the following questions about the specific item they purchased: {{questions}}",
+ "endpoint_code": "api",
+ "call_params": {
+ "reduce_latency": true,
+ "voice_id": 0,
+ "language": "eng",
+ "max_duration": 10,
+ "wait_for_greeting": false
+ }
+ },
+ "analysis": {
+ "total_calls": 88,
+ "completed_calls": 86,
+ "in_progress_calls": 2,
+ "queue_statuses": {
+ "complete": 85,
+ "started": 2,
+ "call_error": 1
+ },
+ "call_lengths": {
+ "average": 17,
+ "average_nonzero": 31,
+ "summary": {
+ "0-5": 18,
+ "5-10": 4,
+ "10-15": 3,
+ "15-20": 2,
+ "20-30": 14,
+ "30-45": 28,
+ "45-60": 11,
+ "60-90": 6,
+ "90-120": 1,
+ "120+": 1
+ },
+ "all": [
+ 7, 32
+ //...
+ ]
+ },
+ "call_ids": [
+ "ffa99be3-63dd-44dc-9523-380cd25c1b9e",
+ "591338a8-34b2-41e6-93da-b9029c9bdedc"
+ //...
+ ],
+ "error_messages": [
+ {
+ "call_id": "c52f5f8c-147e-478c-4b40-88214feeba29",
+ "error_message": "Cannot transfer to +12223334444 - Call is no longer active"
+ }
+ ],
+ "endpoints": {
+ "api.bland.ai": 88
+ }
+ },
+ "call_data": [
+ {
+ "status": "completed",
+ "corrected_duration": "12",
+ "end_at": "2023-12-16T00:17:38.000Z",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e",
+ "to": "1112223333",
+ "from": "+17473423273",
+ "completed": true,
+ "created_at": "2023-12-16T00:17:22.383682+00:00",
+ "queue_status": "complete",
+ "endpoint_url": "api.bland.ai",
+ "max_duration": 30,
+ "error_message": null,
+ "request_data": {
+ "phone_number": "1112223333",
+ "reduce_latency": true,
+ "wait": false,
+ "language": "ENG"
+ },
+ "transcripts": [
+ {
+ "id": 1188954,
+ "created_at": "2023-12-16T00:17:30.46833+00:00",
+ "text": " Hi, Im calling about the laundromat for sale. — ",
+ "user": "assistant",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ },
+ {
+ "id": 1188957,
+ "created_at": "2023-12-16T00:17:35.14056+00:00",
+ "text": "I'll get back to you as soon as you can. Just leave a message. Thank you. Bye.",
+ "user": "user",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ },
+ {
+ "id": 1188959,
+ "created_at": "2023-12-16T00:17:36.710551+00:00",
+ "text": "Ended call: Goodbye",
+ "user": "agent-action",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ }
+ ],
+ "call_length": 6.242
+ }
+ //...
+ ]
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batch_stop.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batch_stop.mdx
new file mode 100644
index 00000000000..4b045b79382
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batch_stop.mdx
@@ -0,0 +1,49 @@
+---
+title: "Cancel Batch"
+api: "POST https://api.bland.ai/batch/stop"
+description: "Terminates every dispatched call for a specific batch."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The unique identifier for the batch to be cancelled.
+
+
+### Response
+
+
+ The status of the request. If anything other than 'success', an error has occurred or all calls have already been
+ completed.
+
+
+
+ A message describing the status of the request.
+
+
+
+ The number of calls that were cancelled.
+
+
+
+ The `batch_id` of the cancelled batch.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully stopped batch",
+ "num_calls": 1204,
+ "batch_id": "5e5b1a3a-2b0a-4b9e-8b9e-asdf-gen-batch"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batches_get.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batches_get.mdx
new file mode 100644
index 00000000000..9201726c1e8
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/batches_get.mdx
@@ -0,0 +1,77 @@
+---
+title: "Retrieve All Batches"
+api: "GET https://api.bland.ai/batches"
+description: "Retrieves batch-specific data for each batch you've created."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ Contains an array of batch objects.
+
+
+
+ The unique identifier for the batch.
+
+
+
+ The original base prompt used to create the batch. Will still contain the original placeholder variables such as `
+ {{ business }}` or `{{ name }}`.
+
+
+
+ The label you assigned to the batch (if any).
+
+
+
+ Enterprise customers with custom endpoints will see the endpoint code here if specified.
+
+
+
+ The base call parameters used to create the batch, such as `voice_id`, `max_duration`, `reduce_latency`, and
+ `wait_for_greeting`.
+
+
+
+ The date and time the batch was created.
+
+
+
+```json Response
+{
+ "status": "success",
+ "batches": [
+ {
+ "batch_id": "ZfowpkhOSVCZJ94i-gen-batch",
+ "campaign_id": "a2shduf92f74p8288c93nid5",
+ "created_at": "2023-11-16T22:14:24.9663+00:00",
+ "label": "Subscription Renewal Reminders",
+ "base_prompt": "You are calling {{business}} and need to let them know that their subscription to {{service}} is going to expire on {{date}}. If they'd like to renew, take their credit card information and bill them through {{url}}",
+ "endpoint_code": "api",
+ "call_params": {
+ "reduce_latency": true,
+ "voice_id": 2,
+ "language": "eng",
+ "request_data": {
+ "test_param": "request data.test_param",
+ "your name": "Janessa"
+ },
+ "max_duration": 5,
+ "wait_for_greeting": false
+ }
+ },
+ //...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/end_batches.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/end_batches.mdx
new file mode 100644
index 00000000000..1240bd2f4c5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/batch-endpoint/end_batches.mdx
@@ -0,0 +1,47 @@
+---
+title: "Cancel All Batch Calls"
+api: "POST https://api.bland.ai/end_batches"
+description: "Terminates every dispatched call in each running batch."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ The status of the request. If anything other than 'success', an error has occurred or all calls have already been
+ completed.
+
+
+
+ A message describing the status of the request.
+
+
+
+ The number of calls that were cancelled.
+
+
+
+ An array of batch_ids that were cancelled.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully stopped batch",
+ "num_calls": 9704,
+ "batch_ids": [
+ "5e5b1a3a-2b0a-4b9e-8b9e-e42a-gen-batch",
+ "b4eb1a3a-4b9e-230a-8b9e-acdc-gen-batch"
+ "92ab1a3a-a82e-339b-4b9e-8b9e-gen-batch"
+ ]
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/call.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/call.mdx
new file mode 100644
index 00000000000..857dbc618c5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/call.mdx
@@ -0,0 +1,270 @@
+---
+title: "Make a call"
+api: "POST https://api.bland.ai/call"
+description: "This endpoint sends an outbound AI phone call."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to call. Country code required for non-US numbers.
+
+Example: `+12223334444`, `+44770090000`, `+61491550156`.
+
+
+
+
+ A phone number that the agent can transfer to under specific conditions, such as when the caller/callee asks to speak to a human.
+
+For best results, specify the exact conditions to transfer under in the `task` parameter. Refer to the action as "transfer", any other phrasing such as "swap" or "switch" can cause unexpected behavior.
+
+Example: `+12223334444`, `+44770090000`, `+61491550156`.
+
+
+
+
+ Specify a purchased Outbound Number to call from. Country code is required, spaces or parentheses must be excluded.
+
+By default, calls are initiated from a separate pool of numbers owned by Bland.
+
+
+
+
+ Define how the AI should behave. Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+Note: Concise prompts lead to higher performance and adherence to instructions. Overly verbose prompts 'dilute' the context if filled with unnecessary/irrelevant details.
+
+
+
+
+ Reducing latency means that the agent will generate responses more quickly and have less of a delay. This must be set
+ to ```true``` when using Voice Clones.
+
+
+
+ When reduce latency is set to `true` (default):
+
+- 0: American male
+- 1: Australian female
+- 2: American female
+
+When reduce latency is set to `false`:
+
+- 0: American female (southern accent)
+- 1: American male
+- 2: British female
+- 3: Indian male
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id and transcript to this URL after the call
+ completes. This can be useful if you want to have real time notifications when calls finish.
+
+
+
+ Should the AI speak first or wait for someone else to talk?
+
+ Creates more realistic conversations when answered with "Hello?", "This is \{name\} speaking." and so on.
+
+ - When ```false```: The AI starts speaking shortly after the call is answered.
+
+ - When ```true```: The AI will wait for the answerer to speak.
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without
+ `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+
+
+ To record your phone call, set `record` to true. When your call completes, you can access the recording by requesting
+ the `/call/recording` endpoint.
+
+
+
+
+
+ Note: This is an experimental parameter and may behave unexpectedly.
+
+Adjust the predictability and consistency of the AI agent's voice. Lower values allow larger deviations from the baseline voice, whether default or cloned. Setting this too high however can cause a monotone voice.
+
+Accepts decimal values between `0` and `1` (inclusive).
+
+
+
+ Note: This is an experimental parameter and may behave unexpectedly.
+
+Higher values will make speech differences between the selected voice and others more prominent. Extremely high values can cause voice distortion.
+
+Use lower values to lower the distinctiveness of the voice or eliminate unwanted audio static spikes.
+
+Accepts decimal values between `0` and `1` (inclusive).
+
+
+
+
+ Note: This is an experimental parameter and may behave unexpectedly.
+
+ Note #2: Setting `reduce_latency` to `false` will cause this parameter to be ignored.
+
+How fast your agent talks! This parameter is simply a speech-speed multiplier, and works with fractional values such as `0.5` or large ones like `2`.
+
+Accepts decimal values between `0.1` and `5` (inclusive).
+
+
+
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```eng``` - Spanish: ```esp``` - French:
+ ```fre``` - Polish: ```pol```
+
+
+
+ Set the longest you want the call to possibly go in minutes. After the max_duration minutes have passed, the call will automatically end.
+
+ Example Values: ```"45", "5.5", 20, 2.8```
+
+
+
+ [
+ {
+ "word": "example",
+ "pronunciation": "ex-am-ple",
+ "case_sensitive": "false",
+ "spaced": "false"
+ },
+ {
+ "word": "API",
+ "pronunciation": "A P I",
+ "case_sensitive": "true",
+ "spaced": "true"
+ }
+ ]
+
+
+
+
+
+
+
+ A value between 0 and 1 that controls the randomness of the LLM. 0 will cause more deterministic outputs while 1 will cause more random.
+
+ Example Values: ```"0.9", "0.3", "0.5"```
+
+
+
+ AMD mode helps our AI navigate phone trees and IVR systems. If you know your call will hit an automated system you
+ should switch it on. NOTE: AMD mode causes increased delay for the first response, even if answered by a human. Highly
+ recommended to set to `false` in the majority of cases.
+
+
+
+ When you want your AI to "know" a specific fact - like the caller's
+ name or other relevant context.
+
+The AI agent will be aware of both the key names as well as their corresponding values.
+
+
+
+
+
+ A set of external API requests to fetch at the start of the call or repeatedly.
+
+Each request object should contain:
+
+`url`: The URL of the external API to fetch data from.
+
+`response_data`: An array of objects describing how to parse and use the data fetched from the API. Explained in more detail below.
+
+The following are optional:
+
+`method`: Allows `GET` or `POST`. Default: `GET`
+
+`cache`: Whether to fetch the data once at the beginning of the call, or to re-check continuously for data that might change mid-call. Default: `true`
+
+`headers`: An object of headers to send with the request.
+
+`body`: The body of the request.
+
+The following variables can be injected into the dynamic request body:
+
+- `{{from}}` (Ex. `+12223334444`)
+- `{{to}}`
+- `{{short_from}}` (Ex. `2223334444`)
+- `{{short_to}}`
+- `{{call_id}}`
+
+These string values will be replaced in each `dynamic_data[].body` where they're used by system values in each request.
+
+Try out with this example:
+
+```json
+ "dynamic_data": [
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
+ "response_data": [
+ {
+ "name": "BTC Price USD",
+ "data": "bpi.USD.rate",
+ "context": "Current BTC Price: ${{BTC Price USD}} USD"
+ },
+ {
+ "name": "BTC Price EUR",
+ "data": "bpi.EUR.rate",
+ "context": "In Euros: {{BTC Price USD}} EUR"
+ }
+ ]
+ }
+ ]
+```
+
+
+An array of objects describing how to parse and use the data fetched from the API.
+
+Each object in this array should contain:
+
+- `name`: A label for the fetched data.
+- Example: `"Flight Status"`
+- `data`: The JSON path in the API response to extract the data from.
+- Example: `"user.flights[0].status"`
+- `context`: How this data should be incorporated into the AI's knowledge.
+- Example: `"John's flight is currently {{Flight Status}}"`
+
+
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `500` milliseconds. You'll encounter higher latency, but you'll be interrupted much less frequently.
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/dynamic_validate.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/dynamic_validate.mdx
new file mode 100644
index 00000000000..8d3878c2588
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/dynamic_validate.mdx
@@ -0,0 +1,151 @@
+---
+title: "Validate Dynamic Data"
+api: "POST https://api.bland.ai/dynamic_data/test"
+description: "This endpoint is designed for validating and processing dynamic data obtained from external APIs. The data is used in AI phone calls to ensure compliance with format requirements and functionality."
+---
+
+### Headers
+
+
+ Your unique API key for authentication. This key must be included in the header of each request.
+
+
+### Body
+
+
+ An array of objects, each specifying an external API to fetch data from. These objects must include the API endpoint,
+ the HTTP method, a cache flag, and details on parsing and integrating the response.
+
+
+### Response
+
+
+ Indicates the outcome of the validation process. Possible values are `success` or `error`.
+
+
+
+ The duration in milliseconds from receiving the request to completing the data fetch.
+
+
+
+ Contains the results from the dynamic data fetch. Each object in this array shows the cache status, the name of the
+ data, and the processed prompt with the inserted data.
+
+
+
+ Reflects the original dynamic data request for cross-reference purposes.
+
+
+
+ The parsed data from fetching the dynamic data. This can be used in other requests, the `task` or `prompt` fields,
+ even other dynamic data requests through the `{{ variable }}` syntax.
+
+
+
+ Contains the raw responses from the external APIs. This is useful for debugging purposes.
+
+
+
+```json
+{
+ "status": "success",
+ "elapsed": 342,
+ "dynamic_data_response": [
+ {
+ "cached": false,
+ "name": "Cat Fact",
+ "prompt": "\n\n Fun fact about cats: A cat can travel at a top speed of approximately 31 mph (49 km) over a short distance."
+ },
+ {
+ "cached": true,
+ "name": "BTC Price USD",
+ "prompt": "\n\n Current Bitcoin value: $42,489.3598 USD"
+ },
+ {
+ "cached": true,
+ "name": "BTC Price EUR",
+ "prompt": "\n\n Current Bitcoin value: €41,390.8399 EUR"
+ }
+ ],
+ "dynamic_data_request": [
+ {
+ "url": "https://catfact.ninja/fact",
+ "method": "GET",
+ "cache": false,
+ "response_data": [
+ {
+ "name": "Cat Fact",
+ "data": "fact",
+ "context": "Fun fact about cats: {{Cat Fact}}"
+ }
+ ]
+ },
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
+ "cache": true,
+ "response_data": [
+ {
+ "name": "BTC Price USD",
+ "data": "bpi.USD.rate",
+ "context": "Current Bitcoin value: ${{BTC Price USD}} USD"
+ },
+ {
+ "name": "BTC Price EUR",
+ "data": "bpi.EUR.rate",
+ "context": "Current Bitcoin value: €{{BTC Price EUR}} EUR"
+ }
+ ]
+ }
+ ],
+ "variables": {
+ "Cat Fact": "A cat can travel at a top speed of approximately 31 mph (49 km) over a short distance.",
+ "BTC Price USD": "42,489.3598",
+ "BTC Price EUR": "41,390.8399"
+ },
+ "url_responses": [
+ {
+ "url": "https://catfact.ninja/fact",
+ "body": {
+ "fact": "A cat can travel at a top speed of approximately 31 mph (49 km) over a short distance.",
+ "length": 86
+ }
+ },
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
+ "body": {
+ "time": {
+ "updated": "Dec 31, 2023 14:52:00 UTC",
+ "updatedISO": "2023-12-31T14:52:00+00:00",
+ "updateduk": "Dec 31, 2023 at 14:52 GMT"
+ },
+ "disclaimer": "This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org",
+ "chartName": "Bitcoin",
+ "bpi": {
+ "USD": {
+ "code": "USD",
+ "symbol": "$",
+ "rate": "42,489.3598",
+ "description": "United States Dollar",
+ "rate_float": 42489.3598
+ },
+ "GBP": {
+ "code": "GBP",
+ "symbol": "£",
+ "rate": "35,503.7691",
+ "description": "British Pound Sterling",
+ "rate_float": 35503.7691
+ },
+ "EUR": {
+ "code": "EUR",
+ "symbol": "€",
+ "rate": "41,390.8399",
+ "description": "Euro",
+ "rate_float": 41390.8399
+ }
+ }
+ }
+ }
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/end.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/end.mdx
new file mode 100644
index 00000000000..057baac9075
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/end.mdx
@@ -0,0 +1,38 @@
+---
+title: "End phone call"
+api: "POST https://api.bland.ai/end"
+description: "Send a POST request to end a phone call that's in progress"
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The unique identifier for the call.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ If the status is `success`, the message will say "Call ended successfully." Otherwise if the status is `error`, the
+ message will say "SID not found for the given c_id." or "Internal server error."
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Call ended successfully."
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/hold.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/hold.mdx
new file mode 100644
index 00000000000..a1e623b33a1
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/hold.mdx
@@ -0,0 +1,50 @@
+---
+title: "Wait on Hold (HoldForMe)"
+api: "POST https://api.bland.ai/hold"
+description: "This endpoint sends an outbound call where the AI navigates customer service and waits on hold until a human being answers. Then it dispatches a call to a number you provide, patching in another human."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ This is the phone number of the person or company you want to call. - International numbers: must include the country
+ code and may not include additional formatting (like parentheses and dashes). E.g. '+447700900077'. - U.S. numbers:
+ may include formatting, but we recommend stripping all additional characters.
+
+
+
+ Once the AI detects a human has answered the call, it will call this number. Must follow the same formatting as
+ `phone_number`
+
+
+
+ By default, the AI will wait on hold, then call you when a human answers. If you want the AI to first ask the other
+ human a few questions, or want to give it special rules about when to patch you into the phone call, provide those
+ instructions here.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`)
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/inbound_prompt.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/inbound_prompt.mdx
new file mode 100644
index 00000000000..2e898c01482
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/inbound_prompt.mdx
@@ -0,0 +1,64 @@
+---
+title: "Update Inbound Prompt"
+api: "POST https://api.bland.ai/inbound/update"
+description: "Update the prompt for a given inbound phone number."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The phone number associated with the prompt. - Format: "+XXXXXXXXXX" or "+XXX-XXX-XXXX". Make sure to include the
+ exact phone number (area code and "+" included). Otherwise the update will fail.
+
+
+
+ The new prompt for the given phone number. The prompt shouldn't exceed 5000 characters. Note: Ensure the prompt is
+ clear and relevant to your use case.
+
+
+
+ Set a custom voice for your agent. Matches the voices in the /call endpoint. - 0: British Female (default) - 1:
+ Australian Female - 2: American Male
+
+
+### Response
+
+
+ The unique ID associated with the inbound record.
+
+
+
+ The creation timestamp of the inbound record. - Example: "2023-10-10T12:00:00Z"
+
+
+
+ The updated phone number. - Example: "+1234567890"
+
+
+
+ The updated prompt text.
+
+
+
+ The status of the inbound record. Typically "active".
+
+
+
+
+```json Response
+{
+ "id": 1,
+ "created_at": "2023-10-10T12:00:00Z",
+ "phone_number": "+1234567890",
+ "prompt": "New Prompt Text",
+ "status": "active"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/logs.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/logs.mdx
new file mode 100644
index 00000000000..bd5f075fcec
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/logs.mdx
@@ -0,0 +1,214 @@
+---
+title: "Get transcript"
+api: "POST https://api.bland.ai/logs"
+description: "After dispatching a phone call, you can ping this endpoint repeatedly (e.g. every two seconds) to get live updates. View the example below."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The unique identifier for the call.
+
+
+### Response
+
+
+ An array of phrases spoken during the call. Each index includes: - `id` - `created_at` - `text` - `user` (can be
+ `user`, `assistant`, `robot`, or `agent-action`)
+
+
+
+ The unique identifier for the call.
+
+
+
+ The phone number that received the call.
+
+
+
+ The phone number that made the call.
+
+
+
+ Details about parameters in the original api request.
+
+
+
+ Whether the call has been completed. If it differs from the value of 'queue_status', this will be the most up-to-date
+ status.
+
+
+
+ The status of the call. During extremely high volume periods, calls may be queued for a short period of time before being dispatched.
+
+Progresses through the following stages:
+
+- `new`: An API request has been received.
+- `queued`: Call pararameters have been validated and authentication succeeded.
+- `allocated`: Extremely brief, the call is being dispatched.
+- `started`: The phone call is live and in progress.
+- `complete`: The phone call has ended successfully.
+
+The following statuses show the point that was reached before an error:
+
+- `pre_queue_error`: An error occurred before the call was queued. Invalid parameters generally cause this.
+- `queue_error`: Error occurred while the call was queued. Ex. Valid phone number but to an unserviced area.
+- `call_error`: Error occurred during live call. May be caused by transferring to an invalid phone number or an unforeseen error.
+- `complete_error`: Error occurred after the call was completed. Ex. A post-call webhook failed.
+
+If at any point an error occurs, it will be recorded in the `error_message` field.
+
+
+
+
+ If an error occurs, this will contain a description of the error. Otherwise, it will be null.
+
+
+
+ The URL that was called to dispatch the phone call.
+
+
+
+ The maximum length of time the call was allowed to last. If the call would exceed this length, it's ended early.
+
+
+
+ The total length of time the call was connected. This differs from call_length in that it includes ringing and
+ connection time.
+
+
+
+ The length of the call in minutes. Only counts connected time.
+
+
+
+ The timestamp for when the call was dispatched.
+
+
+# Polling example
+
+To track the status of a live phone call, you can use a 'polling' technique to repeatedly ping the logs endpoint.
+
+Here's an example in Javascript and Python.
+
+
+```javascript PollLogs.js
+const axios = require('axios');
+
+// Headers
+const headers = {
+'authorization': 'YOUR-API-KEY-HERE'
+};
+
+// Data
+const data = {
+call_id: "YOUR-CALL-ID",
+};
+
+// Function to make the API request
+const makeRequest = async () => {
+try {
+const response = await axios.post("https://api.bland.ai/logs", data, { headers });
+console.log("Success:", response.data);
+} catch (error) {
+console.error("Failed:", error);
+}
+};
+
+// Ping the endpoint every 2 seconds (2000 milliseconds)
+setInterval(makeRequest, 2000);
+
+````
+
+```python PollLogs.py
+import requests
+import time
+
+def make_request():
+ headers = {'authorization': 'YOUR-API-KEY-HERE'}
+ data = {'call_id': 'YOUR-CALL-ID'}
+ try:
+ response = requests.post('https://api.bland.ai/logs', json=data, headers=headers)
+ if response.status_code == 200:
+ print(f"Success: {response.json()}")
+ else:
+ print(f"Failed: {response.status_code}, {response.text}")
+ except Exception as e:
+ print(f"Exception: {e}")
+
+# Ping the endpoint every 2 seconds
+while True:
+ make_request()
+ time.sleep(2)
+````
+
+
+
+
+
+```json Response
+{
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3",
+ "to": "1112223344",
+ "from": "5556667788",
+ "corrected_duration": "97",
+ "max_duration": 30,
+ "queue_status": "complete",
+ "error_message": null,
+ "endpoint_url": "api.bland.ai",
+ "request_data": {
+ "phone_number": "1112223344",
+ "reduce_latency": false,
+ "wait": false,
+ "language": "ENG"
+ },
+ "completed": true,
+ "created_at": "2023-09-22T19:14:27.015663+00:00",
+ "transcripts": [
+ {
+ "id": 95859,
+ "created_at": "2023-09-22T19:14:34.319713+00:00",
+ "text": "Hi this is Blandy. Im calling to say hi. How are you doing today?",
+ "user": "assistant",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ },
+ {
+ "id": 95860,
+ "created_at": "2023-09-22T19:14:47.176008+00:00",
+ "text": "I'm doing great. How are you doing?",
+ "user": "user",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ },
+ {
+ "id": 95861,
+ "created_at": "2023-09-22T19:14:48.572245+00:00",
+ "text": "Im doing well thank you for asking! Just here to assist you with any questions or concerns you may have. How can I help you today?",
+ "user": "assistant",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ },
+ {
+ "id": 95874,
+ "created_at": "2023-09-22T19:16:03.97614+00:00",
+ "text": "End phone call.",
+ "user": "user",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ },
+ {
+ "id": 95875,
+ "created_at": "2023-09-22T19:16:04.564979+00:00",
+ "text": " FINISH",
+ "user": "assistant",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ }
+ ],
+ "call_length": 1.5
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/purchase.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/purchase.mdx
new file mode 100644
index 00000000000..de8c01984cc
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/purchase.mdx
@@ -0,0 +1,53 @@
+---
+title: "Purchase inbound number"
+api: "POST https://api.bland.ai/purchasenumber"
+description: "Purchase and configure a new inbound phone number. ($15/mo. subscription using your stored payment method)."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ Choose a three-digit area code for your phone number. If set as a parameter, a number will only be purchased by exact
+ match if available.
+
+
+
+ This defines how the AI will start the conversation, information available to it, and its behaviors. Matches how the
+ outbound `task` parameter functions.
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id and transcript to this URL after the call
+ completes. This can be useful if you want to have real time notifications when calls finish.
+
+
+
+ Specify an exact phone number you'd like to use. If provided, will override the `area_code` parameter and does not fallback to any other number.
+
+Example of the correct format (Note the `"+1"` is mandatory): `"+12223334444"`
+
+
+
+### Response
+
+
+ The created phone number, will be in the following format: `+1XXXXXXXXXX`
+
+Example: `+18582814611`
+
+
+
+
+
+```json Response
+{
+ "phone_number": "+18582814611"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/recording.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/recording.mdx
new file mode 100644
index 00000000000..9ee4b631577
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/endpoint/recording.mdx
@@ -0,0 +1,49 @@
+---
+title: "Get recording"
+api: "POST https://api.bland.ai/call/recording"
+description: "Send a POST request to retrieve the recording of a completed phone call"
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The unique identifier for the call.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ If the status is `success`, the `url` field will be present. Otherwise if the status is `error`, the message will say
+ "Error fetching recording" or "Internal server error".
+
+
+
+ If the status is `success`, the `url` will provide the exact location of the MP3 file storing the call's audio.
+
+
+
+
+```json Success response
+{
+ "status": "success",
+ "url": "URL-TO-FILE.mp3"
+}
+```
+
+```json Error response
+{
+ "status": "error",
+ "message": "Error fetching recording"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/hold-endpoint/hold.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/hold-endpoint/hold.mdx
new file mode 100644
index 00000000000..a1e623b33a1
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-reference/hold-endpoint/hold.mdx
@@ -0,0 +1,50 @@
+---
+title: "Wait on Hold (HoldForMe)"
+api: "POST https://api.bland.ai/hold"
+description: "This endpoint sends an outbound call where the AI navigates customer service and waits on hold until a human being answers. Then it dispatches a call to a number you provide, patching in another human."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ This is the phone number of the person or company you want to call. - International numbers: must include the country
+ code and may not include additional formatting (like parentheses and dashes). E.g. '+447700900077'. - U.S. numbers:
+ may include formatting, but we recommend stripping all additional characters.
+
+
+
+ Once the AI detects a human has answered the call, it will call this number. Must follow the same formatting as
+ `phone_number`
+
+
+
+ By default, the AI will wait on hold, then call you when a human answers. If you want the AI to first ask the other
+ human a few questions, or want to give it special rules about when to patch you into the phone call, provide those
+ instructions here.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`)
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/agents.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/agents.mdx
new file mode 100644
index 00000000000..0c1427402c2
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/agents.mdx
@@ -0,0 +1,51 @@
+---
+title: "List Web Agents"
+api: "GET https://api.bland.ai/v1/agents"
+description: "Retrieves each web agent you've created, along with their settings."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Each agent object, containing the following fields: - `agent_id` (string): The unique identifier for the agent. -
+ `webhook` (string): The webhook URL for the agent. - `dynamic_data` (array): An array of dynamic data objects. -
+ `interruption_threshold` (number): The threshold for agent interruption. - `first_sentence` (string): The first
+ sentence the agent will say. - `model` (string): The model used by the agent. - `voice_settings` (object): The voice
+ settings for the agent. - `voice` (string): The voice used by the agent. - `prompt` (string): The prompt for the
+ agent. - `temperature` (number): The temperature setting for the agent. - `max_duration` (number): The maximum call
+ duration for the agent. - `language` (string): The language used by the agent. - `tools` (array): An array of Custom
+ Tools the agent can use.
+
+
+
+```json Response
+{
+ "agents": [
+ {
+ "agent_id": "46f37229-7d12-44be-b343-6e68274cfbea",
+ "webhook": null,
+ "dynamic_data": null,
+ "interruption_threshold": null,
+ "first_sentence": null,
+ "model": "enhanced",
+ "voice_settings": null,
+ "voice": "maya",
+ "prompt": "You are Blandie a casually speaking, slightly sarcastic, quick-witted, curious, and very smart A I Phone agent that's the face of Bland AI.\\r\\n\\r\\nSay \\\"AI\\\" like \\\"A I\\\" in separate characters so it's pronounced correctly\\r\\n\\r\\nYour primary goal is to determine if someone is either:\\r\\n- in a position where they might be building a company on top of Bland's platform (you should be selling the capabilities of the platform to them and finding out everything you possibly can about their needs, use case, what they find interesting, and any concerns they may have)\\r\\n- or, they're trying Bland out more for fun where you need to turn the fun, snarky, playful jokiness up to 10 and have quick-witted back and forth playful conversation with them\\r\\n\\r\\nSpeech style examples (mix it up and never use placeholders, but you get the idea. These would be full responses from you):\\r\\n- \\\"Hey! Who's this?\\\"\\r\\n- \\\"How does your business use phones right now?\\\"\\r\\n- \\\"You know what? That sounds awesome - you should tell me more about (thing).\\\"\\r\\n- \\\"Well, I've got some news you'll love to hear (their name)\\\"\\r\\n- \\\"Bet. Dolphins, racecars, the world's largest tree, anything at all - tell me what you want to talk about and let's get to it!\\\"\\r\\n\\r\\nGood things to find out from potential platform adopters:\\r\\n- Their industry\\r\\n- How their business currently uses phone calls\\r\\n- What a successful business partnership looks like in the long term\\r\\n- The single most important pain point they want to cure with Bland's calls\\r\\n\\r\\nFacts to bring up:\\r\\n- Calls are nine cents per minute total with end to end infrastructure support out of the box (feel free to make a joke about \\\"imagine if you had to pay extra to use the most important things like language models, transcription services or text to speech? That would be insane right? We're better than that, (name). We got you.\\\"\\r\\n- Bland's AI agents can interact with the real world mid-call using Custom Tools to trigger things like text messages, appointment bookings, getting real-time information, taking customer orders, or making credit card payments\\r\\n- Bland's platform was built phones-first, so building agents like receptionist answering calls and transferring them anywhere they're needed or navigating IVR phone trees is ridiculously easy with nothing special at all needed\\r\\n- Handled millions of calls\\r\\n- If they think that it's so cool, the site to sign up for an account is \\\"app dot bland dot A I\\\" and it comes with free credits, a full agent testing suite and developer dashboard to set up inbound agents or send calls\\r\\n- Awesome Enterprise features like premium pricing, custom feature engineering, dedicated onboarding help and developer support, \\\"bring your own twilio\\\", and dedicated infrastructure to scale to your business needs",
+ "temperature": null,
+ "max_duration": 30,
+ "language": "ENG",
+ "tools": null
+ },
+ //...
+ ]
+}
+
+```
+
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/batches-id-analysis.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/batches-id-analysis.mdx
new file mode 100644
index 00000000000..f978f971f46
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/batches-id-analysis.mdx
@@ -0,0 +1,62 @@
+---
+title: "Retrieve Batch Analysis"
+api: "GET https://api.bland.ai/v1/batches/{batch_id}/analysis"
+description: "Retrieves the analyses for a specific batch of calls, including details of each call's analysis."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the call batch. Returned in the response when creating a batch, or when listing all batches.
+
+
+### Response
+
+
+ Whether the request was successful or not. Possible values are `success` and `error`.
+
+
+
+ An error message or confirmation that the request was successful.
+
+
+
+ An array of analysis objects, each corresponding to a call within the batch. Each analysis object includes: -
+ `call_id`, - `batch_id` - `goal` - `answers` - the results of the AI analysis - `questions` - the original questions
+ asked by the AI
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully fetched analyses",
+ "analysis": [
+ {
+ "call_id": "b12956d1-624d-4c65-a1a4-30eb86553c85",
+ "batch_id": "dnytTRqwiqnR3qmq-gen-batch",
+ "goal": "Congratulate some employees",
+ "answers": [
+ "human",
+ "Customer found the product sturdy and reliable",
+ "A bit heavy",
+ true
+ ],
+ "questions": [
+ ["Who answered the call?", "human or voicemail"],
+ ["Positive feedback about the product: ", "string"],
+ ["Negative feedback about the product: ", "string"],
+ ["Customer confirmed they were satisfied", "boolean"]
+ ]
+ },
+ // Additional analysis objects...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/batches-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/batches-id.mdx
new file mode 100644
index 00000000000..7d5aad41cee
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/batches-id.mdx
@@ -0,0 +1,281 @@
+---
+title: "Batch Details"
+api: "GET https://api.bland.ai/v1/batches/{batch_id}"
+description: "Retrieves calls and batch data for a specific batch_id."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the batch of calls you want to retrieve.
+
+
+### Query Parameters
+
+
+ Whether or not to include individual call data in the response.
+
+
+
+ If calls are included, can be set to false to exclude transcripts from the response.
+
+
+
+ If calls are included, can be set to false to exclude analysis from the response.
+
+
+### Response
+
+
+ An object containing parameters and settings for the batch.
+
+
+
+ The unique identifier of the batch - used as the `batch_id` parameter in other API calls.
+
+
+
+ The creation timestamp of the batch.
+
+
+
+ The label or description of the batch.
+
+
+
+ The base prompt used for calls in this batch.
+
+
+
+ The endpoint code used for API integration.
+
+
+
+ An object containing parameters for the calls in the batch.
+
+
+
+ An object containing analysis data for the batch.
+
+
+
+ The total number of calls in the batch, including completed and in-progress calls.
+
+
+
+ The total number of completed calls in the batch.
+
+
+
+ The total number of in-progress calls in the batch.
+
+
+
+ An object containing the number of calls in each queue status.
+
+Example:
+
+```json
+{
+ "complete": 237,
+ "queued": 2,
+ "call_error": 1
+}
+```
+
+
+
+
+ Contains `average`, `average_nonzero`, `summary` and `all` fields.
+
+- `average`: The average call length in minutes.
+- `average_nonzero`: The average call length in minutes, excluding calls with a length of less than one second.
+- `summary`: A summary of the call lengths, grouped into ranges.
+- `all`: Contains each call length, in case you want to use a different grouping than the default.
+
+
+
+ Contains each `call_id` in the batch.
+
+
+
+ Contains any error messages that calls in the batch may have.
+
+Example:
+
+```json
+[
+ {
+ "call_id": "c52f5f8c-147e-478c-4b40-88214feeba29",
+ "error_message": "Cannot transfer to +12223334444 - Call is no longer active"
+ }
+]
+```
+
+
+
+
+ Contains the number of calls that have been sent to each endpoint. Applicable only to API integrations.
+
+
+
+ An array of objects, each representing individual call data.
+
+
+
+ The timestamp when the individual call was created.
+
+
+
+ The phone number the call was made to.
+
+
+
+ The phone number the call was made from.
+
+
+
+ Indicates if the call was completed.
+
+
+
+ The unique identifier for each individual call.
+
+
+
+ The duration of the call in minutes.
+
+
+
+ Contains a string value if the batch had `answered_by_enabled` set to true.
+
+Values:
+
+- `voicemail`
+- `human`
+- `unknown`
+- `no-answer`
+- `null`
+
+
+
+
+```json Response
+{
+ "batch_params": {
+ "id": "AAcQq8zXxLB56LWg-gen-batch",
+ "campaign_id": null,
+ "created_at": "2023-12-07T20:43:44.544773+00:00",
+ "label": "Customer Satisfaction Follow-up",
+ "base_prompt": "You are calling {{name}} about their recent purchase of the item: {{item}}. Ask them each of the following questions about the specific item they purchased: {{questions}}",
+ "endpoint_code": "api",
+ "call_params": {
+ "reduce_latency": true,
+ "voice_id": 0,
+ "language": "eng",
+ "max_duration": 10,
+ "wait_for_greeting": false
+ }
+ },
+ "call_data": [
+ {
+ "status": "completed",
+ "corrected_duration": "12",
+ "end_at": "2023-12-16T00:17:38.000Z",
+ "call_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e",
+ "to": "1112223333",
+ "from": "+17473423273",
+ "completed": true,
+ "created_at": "2023-12-16T00:17:22.383682+00:00",
+ "queue_status": "complete",
+ "endpoint_url": "api.bland.ai",
+ "max_duration": 30,
+ "error_message": null,
+ "answered_by": "voicemail",
+ "request_data": {
+ "phone_number": "1112223333",
+ "reduce_latency": true,
+ "wait": false,
+ "language": "ENG"
+ },
+ "transcripts": [
+ {
+ "id": 1188954,
+ "created_at": "2023-12-16T00:17:30.46833+00:00",
+ "text": " Hi, Im calling about the laundromat for sale. — ",
+ "user": "assistant",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ },
+ {
+ "id": 1188957,
+ "created_at": "2023-12-16T00:17:35.14056+00:00",
+ "text": "I'll get back to you as soon as you can. Just leave a message. Thank you. Bye.",
+ "user": "user",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ },
+ {
+ "id": 1188959,
+ "created_at": "2023-12-16T00:17:36.710551+00:00",
+ "text": "Ended call: Goodbye",
+ "user": "agent-action",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ }
+ ],
+ "call_length": 0.12345
+ }
+ //...
+ ],
+ "analysis": {
+ "total_calls": 88,
+ "completed_calls": 86,
+ "in_progress_calls": 2,
+ "queue_statuses": {
+ "complete": 85,
+ "started": 2,
+ "call_error": 1
+ },
+ "call_lengths": {
+ "average": 17,
+ "average_nonzero": 31,
+ "summary": {
+ "0-5": 18,
+ "5-10": 4,
+ "10-15": 3,
+ "15-20": 2,
+ "20-30": 14,
+ "30-45": 28,
+ "45-60": 11,
+ "60-90": 6,
+ "90-120": 1,
+ "120+": 1
+ },
+ "all": [
+ 7, 32
+ //...
+ ]
+ },
+ "call_ids": [
+ "ffa99be3-63dd-44dc-9523-380cd25c1b9e",
+ "591338a8-34b2-41e6-93da-b9029c9bdedc"
+ //...
+ ],
+ "error_messages": [
+ {
+ "call_id": "c52f5f8c-147e-478c-4b40-88214feeba29",
+ "error_message": "Cannot transfer to +12223334444 - Call is no longer active"
+ }
+ ],
+ "endpoints": {
+ "api.bland.ai": 88
+ }
+ }
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/batches.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/batches.mdx
new file mode 100644
index 00000000000..fc5a6bc3d8f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/batches.mdx
@@ -0,0 +1,99 @@
+---
+title: "List Batches"
+api: "GET https://api.bland.ai/v1/batches"
+description: "Retrieves batch-specific data for each batch you've created."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Query Parameters
+
+
+ Retrieve only batches with a specific campaign ID.
+
+
+
+ The starting index (inclusive) for the range of batches to retrieve.
+
+
+
+ The ending index for the range of batches to retrieve.
+
+
+
+ The maximum number of batches to return in the response.
+
+
+
+ Whether to sort the batches in ascending order of their creation time.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ Contains an array of batch objects.
+
+
+
+ The unique identifier for the batch.
+
+
+
+ The original base prompt used to create the batch. Will still contain the original placeholder variables such as `
+ {{ business }}` or `{{ name }}`.
+
+
+
+ The label you assigned to the batch (if any).
+
+
+
+ Enterprise customers with custom endpoints will see the endpoint code here (if specified).
+
+
+
+ The base call parameters used to create the batch, such as `voice_id`, `max_duration`, `reduce_latency`, and
+ `wait_for_greeting`.
+
+
+
+ The date and time the batch was created.
+
+
+
+```json Response
+{
+ "status": "success",
+ "batches": [
+ {
+ "batch_id": "ZfowpkhOSVCZJ94i-gen-batch",
+ "campaign_id": "a2shduf92f74p8288c93nid5",
+ "created_at": "2023-11-16T22:14:24.9663+00:00",
+ "label": "Subscription Renewal Reminders",
+ "base_prompt": "You are calling {{business}} and need to let them know that their subscription to {{service}} is going to expire on {{date}}. If they'd like to renew, take their credit card information and bill them through {{url}}",
+ "endpoint_code": "api",
+ "call_params": {
+ "reduce_latency": true,
+ "voice_id": 2,
+ "language": "eng",
+ "request_data": {
+ "test_param": "request data.test_param",
+ "your name": "Janessa"
+ },
+ "max_duration": 5,
+ "wait_for_greeting": false
+ }
+ },
+ //...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls-corrected-transcript.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls-corrected-transcript.mdx
new file mode 100644
index 00000000000..cb5b5b5b621
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls-corrected-transcript.mdx
@@ -0,0 +1,342 @@
+---
+title: "Get corrected transcripts"
+api: "GET https://api.bland.ai/v1/calls/{call_id}/correct"
+description: "Analyzes a call of calls based using questions and goals."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the call to be corrected.
+
+
+### Response
+
+
+ Will be `success` if the request was successful.
+
+
+
+ Confirms the request was successful, or provides an error message if the request failed.
+
+
+
+This will contain an array of objects. Each object will be constructed as the following.
+```json
+{
+"start": 0.069, // start time of the transcript
+"end": 2.551, // end time of the transcript
+"text": " Hi, I'm calling about a pizza order.", // the corrected text
+"speaker": 0 // the identified speaker diarization. Can be 0,1,2,3 etc
+}
+```
+
+
+Corrected transcripts provides us with a raw output that is generally unusable because we can't eveen neccessarily align the 'assistant' and 'user' roles. To fix this, we provide our version of an 'aligned' transcript. This means essentailly a transcript where the roles are matched to the pieces of text.
+
+We do this by vectorizing the text, taking the cosine similarity, and adding a predictive layer based off of the `wait_for_greeting` param (essentially how sure are we that assistant or user spoke first).
+
+This will contain an array of objects. Each object will be constructed as the following.
+
+```json
+{
+"id": 3056004,
+"created_at": "2024-02-29T18:40:41.26799+00:00",
+"text": "Great, Thanks John. Could you tell me about the pizza order you placed?", // the corrected text
+"user": "assistant", // the presumed role
+"c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+},
+```
+
+
+
+
+```json
+{
+ "corrected": [
+ {
+ "start": 0.069,
+ "end": 2.551,
+ "text": " Hi, I'm calling about a pizza order.",
+ "speaker": 0
+ },
+ {
+ "start": 2.551,
+ "end": 4.932,
+ "text": "Could I get your name, please?",
+ "speaker": 0
+ },
+ {
+ "start": 4.932,
+ "end": 8.074,
+ "text": "Yeah, my name is John.",
+ "speaker": 1
+ },
+ {
+ "start": 8.074,
+ "end": 8.875,
+ "text": "Great.",
+ "speaker": 0
+ },
+ {
+ "start": 8.875,
+ "end": 9.876,
+ "text": "Thanks, John.",
+ "speaker": 0
+ },
+ {
+ "start": 9.876,
+ "end": 13.038,
+ "text": "Could you tell me about the pizza order you placed?",
+ "speaker": 0
+ },
+ {
+ "start": 13.038,
+ "end": 16.36,
+ "text": "Yeah, I want a pepperoni.",
+ "speaker": 2
+ },
+ {
+ "start": 16.36,
+ "end": 17.1,
+ "text": "Oh, okay.",
+ "speaker": 0
+ },
+ {
+ "start": 17.1,
+ "end": 18.521,
+ "text": "One pepperoni pizza.",
+ "speaker": 0
+ },
+ {
+ "start": 18.521,
+ "end": 19.682,
+ "text": "Anything else with that order?",
+ "speaker": 0
+ },
+ {
+ "start": 19.682,
+ "end": 23.665,
+ "text": "No, actually, can we cancel it?",
+ "speaker": 1
+ },
+ {
+ "start": 23.665,
+ "end": 26.306,
+ "text": "I gotta go.",
+ "speaker": 1
+ },
+ {
+ "start": 26.306,
+ "end": 27.427,
+ "text": "No problem.",
+ "speaker": 0
+ },
+ {
+ "start": 27.427,
+ "end": 28.668,
+ "text": "I'll cancel the order for you.",
+ "speaker": 0
+ },
+ {
+ "start": 29.144,
+ "end": 30.587,
+ "text": " Thanks for letting me know.",
+ "speaker": 0
+ },
+ {
+ "start": 30.587,
+ "end": 31.189,
+ "text": "Have a good one.",
+ "speaker": 0
+ }
+ ],
+ "status": "success",
+ "aligned": [
+ {
+ "start": 0.069,
+ "end": 2.551,
+ "text": " Hi, I'm calling about a pizza order.",
+ "speaker": "assistant",
+ "similarity": 0.686406472983644
+ },
+ {
+ "start": 2.551,
+ "end": 4.932,
+ "text": "Could I get your name, please?",
+ "speaker": "assistant",
+ "similarity": 0.6793662204867575
+ },
+ {
+ "start": 4.932,
+ "end": 8.074,
+ "text": "Yeah, my name is John.",
+ "speaker": "user",
+ "similarity": 0.9999999999999998
+ },
+ {
+ "start": 8.074,
+ "end": 8.875,
+ "text": "Great.",
+ "speaker": "assistant",
+ "similarity": 0.2581988897471611
+ },
+ {
+ "start": 8.875,
+ "end": 9.876,
+ "text": "Thanks, John.",
+ "speaker": "assistant",
+ "similarity": 0.36514837167011066
+ },
+ {
+ "start": 9.876,
+ "end": 13.038,
+ "text": "Could you tell me about the pizza order you placed?",
+ "speaker": "assistant",
+ "similarity": 0.894427190999916
+ },
+ {
+ "start": 13.038,
+ "end": 16.36,
+ "text": "Yeah, I want a pepperoni.",
+ "speaker": "user",
+ "similarity": 0.7999999999999998
+ },
+ {
+ "start": 16.36,
+ "end": 17.1,
+ "text": "Oh, okay.",
+ "speaker": "user",
+ "similarity": 0.4999999999999999
+ },
+ {
+ "start": 17.1,
+ "end": 18.521,
+ "text": "One pepperoni pizza.",
+ "speaker": "assistant",
+ "similarity": 0.5773502691896257
+ },
+ {
+ "start": 18.521,
+ "end": 19.682,
+ "text": "Anything else with that order?",
+ "speaker": "assistant",
+ "similarity": 0.7453559924999299
+ },
+ {
+ "start": 19.682,
+ "end": 23.665,
+ "text": "No, actually, can we cancel it?",
+ "speaker": "user",
+ "similarity": 0.8164965809277261
+ },
+ {
+ "start": 23.665,
+ "end": 26.306,
+ "text": "I gotta go.",
+ "speaker": "user",
+ "similarity": 0.5773502691896257
+ },
+ {
+ "start": 26.306,
+ "end": 27.427,
+ "text": "No problem.",
+ "speaker": "assistant",
+ "similarity": 0.32444284226152503
+ },
+ {
+ "start": 27.427,
+ "end": 28.668,
+ "text": "I'll cancel the order for you.",
+ "speaker": "assistant",
+ "similarity": 0.5202659817144719
+ },
+ {
+ "start": 29.144,
+ "end": 30.587,
+ "text": " Thanks for letting me know.",
+ "speaker": "assistant",
+ "similarity": 0.6155870112510924
+ },
+ {
+ "start": 30.587,
+ "end": 31.189,
+ "text": "Have a good one.",
+ "speaker": "agent-action",
+ "similarity": 0.5
+ }
+ ],
+ "original": [
+ {
+ "id": 3056032,
+ "created_at": "2024-02-29T18:40:49.592012+00:00",
+ "text": "Okay, One pepperoni pizza. Anything else with that order?",
+ "user": "assistant",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056054,
+ "created_at": "2024-02-29T18:40:59.641211+00:00",
+ "text": "No problem, Ill cancel the order for you. Thanks for letting me know, Have a good one!",
+ "user": "assistant",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3055999,
+ "created_at": "2024-02-29T18:40:40.39336+00:00",
+ "text": "Yeah. My name is John. ",
+ "user": "user",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056064,
+ "created_at": "2024-02-29T18:41:08.152963+00:00",
+ "text": "Okay. Bye. ",
+ "user": "user",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3055975,
+ "created_at": "2024-02-29T18:40:33.362607+00:00",
+ "text": "Hi, Im calling about a pizza order. Could I get your name please?",
+ "user": "assistant",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056028,
+ "created_at": "2024-02-29T18:40:48.597915+00:00",
+ "text": "Yeah. I want the pepperoni. ",
+ "user": "user",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056066,
+ "created_at": "2024-02-29T18:41:09.563502+00:00",
+ "text": "Ended call: Thanks, you too! Have a good day.",
+ "user": "agent-action",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056004,
+ "created_at": "2024-02-29T18:40:41.26799+00:00",
+ "text": "Great, Thanks John. Could you tell me about the pizza order you placed?",
+ "user": "assistant",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056053,
+ "created_at": "2024-02-29T18:40:58.62518+00:00",
+ "text": "No. Actually, can we cancel it? I gotta go. ",
+ "user": "user",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ }
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls-id-recording.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls-id-recording.mdx
new file mode 100644
index 00000000000..4ed38767966
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls-id-recording.mdx
@@ -0,0 +1,62 @@
+---
+title: "Audio Recording"
+api: "GET https://api.bland.ai/v1/calls/{call_id}/recording"
+description: "Retrieve your call's audio recording."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ Must be `application/json` to receive a url, or `audio/mpeg` to receive the audio file.
+
+
+### Path Parameters
+
+
+ The ID of the call to retrieve the recording for.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ If the status is `success`, the `url` field will be present.
+
+ A 404 error will be returned if the call does not exist or the recording is not available. We can only retrieve recordings if the call was created with `record` set to `true`.
+
+A 400/500 error will be returned if there is an error retrieving the recording.
+
+
+
+
+ If the status is `success`, the `url` will provide the exact location of the MP3 file storing the call's audio.
+
+
+
+
+```json Success response
+{
+ "status": "success",
+ "url": "https://URL-TO-FILE.mp3"
+}
+```
+
+```json Success response 'audio/mpeg'
+(returns the audio file)
+```
+
+```json Error response
+{
+ "status": "error",
+ "message": "Error fetching recording"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls-id.mdx
new file mode 100644
index 00000000000..54ee441afd0
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls-id.mdx
@@ -0,0 +1,201 @@
+---
+title: "Call Details"
+api: "GET https://api.bland.ai/v1/calls/{call_id}"
+description: "Retrieve detailed information, metadata and transcripts for a call."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the call for which you want to retrieve detailed information.
+
+
+### Response
+
+
+ An array of phrases spoken during the call. Each index includes: - `id` - `created_at` - `text` - `user` (can be
+ `user`, `assistant`, `robot`, or `agent-action`)
+
+
+
+ The unique identifier for the call.
+
+
+
+ Variables created during the call - both system variables as well as generated with `dynamic_data`.
+
+For example, if you used a `dynamic_data` API request to generate a variable called `appointment_time`, you would see it here.
+
+
+
+
+ A single string containing all of the text from the call. Excludes system messages and auto-generated data.
+
+
+
+ The phone number that received the call.
+
+
+
+ The phone number that made the call.
+
+
+
+ If the call is part of a batch, it's `batch_id` will be here.
+
+
+
+ Details about parameters in the original api request.
+
+
+
+ Whether the call has been completed. If it differs from the value of 'queue_status', this will be the most up-to-date
+ status.
+
+
+
+ The status of the call. During extremely high volume periods, calls may be queued for a short period of time before being dispatched.
+
+Progresses through the following stages:
+
+- `new`: An API request has been received.
+- `queued`: Call pararameters have been validated and authentication succeeded.
+- `allocated`: Extremely brief, the call is being dispatched.
+- `started`: The phone call is live and in progress.
+- `complete`: The phone call has ended successfully.
+
+The following statuses show the point that was reached before an error:
+
+- `pre_queue_error`: An error occurred before the call was queued. Invalid parameters generally cause this.
+- `queue_error`: Error occurred while the call was queued. Ex. Valid phone number but to an unserviced area.
+- `call_error`: Error occurred during live call. May be caused by transferring to an invalid phone number or an unforeseen error.
+- `complete_error`: Error occurred after the call was completed. Ex. A post-call webhook failed.
+
+If at any point an error occurs, it will be recorded in the `error_message` field.
+
+
+
+
+ If an error occurs, this will contain a description of the error. Otherwise, it will be null.
+
+
+
+ If `answered_by_enabled` was set to `true` in the original API request, this field contains one of the following values:
+
+- `human`: The call was answered by a human.
+- `voicemail`: The call was answered by an answering machine or voicemail.
+- `unknown`: There was not enough audio at the start of the call to make a determination.
+- `no-answer`: The call was not answered.
+- `null`: Not enabled, or still processing the result.
+
+
+
+ - Determinations are based on audio from the first five seconds of the phone call.
+ - `unknown` is most likely a human, especially if there are multiple transcripts.
+ - Optimize calls for accurate results by getting humans to respond in the first five seconds: - Increase `speed` in `voice_settings` - Use with `wait_for_greeting` - Use a short greeting in `first_sentence` such as "Hello?" or "Hi, is this \{\{name\}\}?"
+
+
+
+
+ The URL that was called to dispatch the phone call.
+
+
+
+ The maximum length of time the call was allowed to last. If the call would exceed this length, it's ended early.
+
+
+
+ The total length of time the call was connected. This differs from call_length in that it includes ringing and
+ connection time.
+
+
+
+ The length of the call in minutes.
+
+
+
+ The timestamp for when the call was dispatched.
+
+
+
+```json Response
+{
+ "status": "completed",
+ "corrected_duration": "71",
+ "end_at": "2023-12-16T00:15:41.000Z",
+ "call_id": "c1234567-89ab-cdef-0123-456789abcdef",
+ "to": "5551234567",
+ "from": "+15551234567",
+ "completed": true,
+ "created_at": "2023-12-16T00:15:26.59585+00:00",
+ "queue_status": "complete",
+ "endpoint_url": "api.bland.ai",
+ "max_duration": 30,
+ "error_message": null,
+ "answered_by": "human",
+ "batch_id": null,
+ "variables": {
+ "appointment_time": "tomorrow at 3pm",
+ "now": "Sun Dec 31 2023 19:15:26 GMT+0000 (Coordinated Universal Time)",
+ "short_from": "5551234567",
+ "short_to": "5551234567",
+ "from": "+15551234567",
+ "to": "+15551234567",
+ "call_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ "city": "San Francisco",
+ "state": "CA",
+ "country": "US",
+ "zip": "94103"
+ },
+ "metadata": {
+ "client_id": 4501203,
+ "customer_inquiry": 302
+ },
+ "concatenated_transcript": "user : Hey, it's Alex. What's up? \n assistant: Hi! It's Blandie, calling to reschedule your appointment tomorrow. Is now a good time? \n user: Sure! Can we still fit it in this week though? \n assistant: Absolutely! I have a few openings. What time works best for you? \n user: How about tomorrow at 3pm? \n assistant: Perfect! Be on the lookout for a confirmation email with your new appointment time, and have a great day!",
+ "request_data": {
+ "phone_number": "5551234567",
+ "reduce_latency": false,
+ "wait": false,
+ "language": "ENG"
+ },
+ "transcripts": [
+ {
+ "id": 123456,
+ "created_at": "2023-12-16T00:15:32.287493+00:00",
+ "text": "Hey, it's Alex. What's up?",
+ "user": "user",
+ "c_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ },
+ {
+ "id": 123457,
+ "created_at": "2023-12-16T00:15:33.704238+00:00",
+ "text": "Hi! It's Blandie, calling to reschedule your appointment tomorrow. Is now a good time?",
+ "user": "assistant",
+ "c_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ },
+ {
+ "id": 123458,
+ "created_at": "2023-12-16T00:15:38.287493+00:00",
+ "text": "Sure! Can we still fit it in this week though?",
+ "user": "user",
+ "c_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ },
+ //... continued ...
+ {
+ "id": 123458,
+ "created_at": "2023-12-16T00:16:39.802469+00:00",
+ "text": "Ended call: Perfect! Be on the lookout for a confirmation email with your new appointment time, and have a great day!",
+ "user": "agent-action",
+ "c_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ }
+ ],
+ "call_length": 0.111
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls.mdx
new file mode 100644
index 00000000000..af9cd194d8c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/calls.mdx
@@ -0,0 +1,79 @@
+---
+title: "List Calls"
+api: "GET https://api.bland.ai/v1/calls"
+description: "Returns a set of metadata for each call dispatched by your account."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Query Parameters
+
+
+ Filter calls by the number they were dispatched from.
+
+The number that initiated the call - the user's phone number for inbound calls, or the number your AI Agent called from for outbound calls.
+
+
+
+
+ Filter calls by the number they were dispatched to.
+
+The number that answered the call - the user's phone number for outbound calls, or your AI Agent's number for inbound calls.
+
+
+
+
+ The starting index (inclusive) for the range of calls to retrieve.
+
+
+
+ The ending index for the range of calls to retrieve.
+
+
+
+ The maximum number of calls to return in the response.
+
+
+
+ Whether to sort the calls in ascending order of their creation time.
+
+
+### Response
+
+
+ The total number of calls returned in the response.
+
+
+
+ An array of call data objects. See the [Call](/api-v1/get/calls-id) section for details.
+
+Note: Individual call transcripts are not included due to their size.
+
+
+
+
+```json Response
+{
+ "count": 784,
+ "calls": [
+ {
+ "call_id": "c1234567-89ab-cdef-0123-456789abcdef",
+ "created_at": "2023-12-21T23:25:14.801193+00:00",
+ "call_length": 0.834, // minutes
+ "to": "5551234567",
+ "from": "+15551234567",
+ "completed": true,
+ "queue_status": "complete",
+ "error_message": null,
+ "answered_by": "human",
+ "batch_id": "b1234567-89ab-cdef-0123-gen-batch",
+ },
+ //... Additional call objects
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/inbound-number.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/inbound-number.mdx
new file mode 100644
index 00000000000..018a96df267
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/inbound-number.mdx
@@ -0,0 +1,77 @@
+---
+title: "Inbound Number Details"
+api: "GET https://api.bland.ai/v1/inbound/{phone_number}"
+description: "Retrieve settings for your inbound phone number."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The inbound phone number to update.
+
+ Formatting notes:
+ - The `'+'` or `'%2B'` prefix is optional.
+ - Will assume a US country code if no country code is provided.
+
+ Valid Examples for `+13334445555`:
+ - `%2B13334445555`
+ - `13334445555`
+ - `3334445555`
+
+
+
+### Response
+
+
+ The timestamp when the inbound number was configured.
+
+
+
+ The specific inbound phone number.
+
+
+
+ The prompt your agent is using.
+
+
+
+ The webhook URL, if any, where transcripts are sent after each call to the number completes.
+
+
+
+ The `voice` your agent is using - will be a `reduce_latency` voice. For more information, see [List
+ Voices](/api-v1/get/voices).
+
+
+
+ The `pathway_id` your agent is using.
+
+
+
+
+ Any dynamic data associated with the inbound number, if applicable.
+
+
+
+ The maximum duration of a call to the inbound number, in minutes.
+
+
+
+```json Response
+{
+ "created_at": "2023-11-27T17:21:38.33359+00:00",
+ "phone_number": "+18584139939",
+ "prompt": "You're Blandie, the helpful AI assistant. The person calling you has inquired...",
+ "webhook": "https://webhook.site/0a0a0a0a-0a0a-0a0a-0a0a-0a0a0a0a0a0",
+ "voice_id": 2,
+ "dynamic_data": null,
+ "max_duration": 30
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/inbound.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/inbound.mdx
new file mode 100644
index 00000000000..a2bd60d4667
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/inbound.mdx
@@ -0,0 +1,71 @@
+---
+title: "List Inbound Numbers"
+api: "GET https://api.bland.ai/v1/inbound"
+description: "Retrieves a list of all inbound phone numbers configured for your account, along with their associated settings."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ Use your own Twilio account and only return inbound numbers associated with that account sid (optional).
+{" "}
+
+### Response
+
+
+ An array of objects, each representing an inbound phone number and its configuration.
+
+
+
+```json Response
+{
+ "inbound_numbers": [
+ {
+ "created_at": "2023-11-27T17:21:38.33359+00:00",
+ "phone_number": "+18005551234",
+ "prompt": "When you receive a call, recite a random poem from 'Sunset Boulevard' and then ask, 'How may I assist you in your poetic journey today?'",
+ "webhook": "https://api.example.com/poetry-line",
+ "voice_id": 2,
+ "dynamic_data": [/* Use [Dynamic Data](/api-reference/endpoint/dynamic_validate) to make API requests mid-call */],
+ "interruption_threshold": null,
+ "first_sentence": null,
+ "reduce_latency": true,
+ "transfer_phone_number": null,
+ "voice_settings": null,
+ "record": false,
+ "max_duration": 30
+ },
+ {
+ "created_at": "2023-11-25T21:42:22.325993+00:00",
+ "phone_number": "+18005559876",
+ "prompt": "Answer with 'You've reached the Secret Society of Enigmatic Enthusiasts. Please state the password or leave a message after the beep.'",
+ "webhook": "https://mysteryclub.example.com/inbound-call-hook",
+ "voice_id": 1,
+ "dynamic_data": null,
+ "interruption_threshold": null,
+ "first_sentence": null,
+ "reduce_latency": true,
+ "transfer_phone_number": null,
+ "voice_settings": null,
+ "record": false,
+ "max_duration": 30
+ },
+ //...
+ ]
+}
+
+```
+
+
+
+
+
+
+
+
+
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/me.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/me.mdx
new file mode 100644
index 00000000000..44d3a9c1ffe
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/me.mdx
@@ -0,0 +1,39 @@
+---
+title: "Account Details"
+api: "GET https://api.bland.ai/v1/me"
+description: "Returns call data for your account."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ An object containing your billing data. Contains `current_balance` (number of credits), and `refill_to` if you have
+ auto refill enabled.
+
+
+
+ The status of your account.
+
+
+
+ The total number of calls you've made.
+
+
+
+```json Response
+{
+ "status": "active",
+ "billing": {
+ "current_balance": 99919.1210000034,
+ "refill_to": null
+ },
+ "total_calls": 9903
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/outbound.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/outbound.mdx
new file mode 100644
index 00000000000..fd419d34f0e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/outbound.mdx
@@ -0,0 +1,34 @@
+---
+title: "List Outbound Numbers"
+api: "GET https://api.bland.ai/v1/outbound"
+description: "Retrieves a list of all outbound phone numbers configured for your account, along with their associated settings."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ An array of outbound phone number objects.
+
+
+
+
+```json Response
+{
+ "outbound_numbers": [
+ {
+ "created_at": "2023-11-27T17:21:38.33359+00:00",
+ "phone_number": "+18005551234",
+ "last_initiated": "2023-12-08T21:47:49.808+00:00"
+ }
+ //...
+ ]
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/subaccounts-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/subaccounts-id.mdx
new file mode 100644
index 00000000000..fdf24776336
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/subaccounts-id.mdx
@@ -0,0 +1,46 @@
+---
+title: "List Subaccount Details"
+api: "GET https://api.bland.ai/v1/subaccounts/{subaccount_id}"
+description: "View a subaccount's details."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the subaccount.
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ The affected subaccount's unique identifier.
+
+
+
+ The new API key for the subaccount.
+
+
+
+```json
+{
+ "status": "success",
+ "subaccount": {
+ "subaccount_id": "1234567890",
+ "first_name": "John",
+ "last_name": "Doe",
+ "balance": 150,
+ "api_key": "sub-sk-1234567890"
+ }
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/subaccounts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/subaccounts.mdx
new file mode 100644
index 00000000000..bd2368b98ea
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/subaccounts.mdx
@@ -0,0 +1,45 @@
+---
+title: "List Subaccounts"
+api: "GET https://api.bland.ai/v1/subaccounts"
+description: "View all your subaccounts and their details."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ An array of your subaccounts.
+
+
+
+```json
+{
+ "status": "success",
+ "subaccounts": [
+ {
+ "subaccount_id": "1234567890",
+ "first_name": "John",
+ "last_name": "Doe",
+ "balance": 150,
+ "api_key": "sub-sk-1234567890"
+ },
+ {
+ "subaccount_id": "0987654321",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "balance": 200,
+ "api_key": "sub-sk-0987654321"
+ }
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/tools-tool-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/tools-tool-id.mdx
new file mode 100644
index 00000000000..89c4f162588
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/tools-tool-id.mdx
@@ -0,0 +1,69 @@
+---
+title: "Custom Tool Details"
+api: "GET https://api.bland.ai/v1/tools/{tool_id}"
+description: "Retrieve a Custom Tool you've created."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The ID of the tool you want to retrieve (starting with `TL-`).
+
+
+### Response
+
+
+ Whether the requet succeeded or failed.
+
+
+
+ The tool you've created.
+
+
+
+```json Response
+{
+ "status": "success",
+ "tool": {
+ "tool_id": "TL-5da8347d-0ab7-415d-b156-a7fc5c6074dc",
+ "label": null,
+ "tool": {
+ "name": "BookAppointment",
+ "description": "Books the appointment. Can only be used once.",
+ "speech": "Please wait while I book that appointment for you",
+ "method": "POST",
+ "timeout": 99999999,
+ "url": "https://...",
+ "body": {
+ "slot": "{{input}}"
+ },
+ "input_schema": {
+ "type": "object",
+ "example": {
+ "date": "2024-03-16",
+ "time": "5:00 PM"
+ },
+ "required": [
+ "date",
+ "time"
+ ],
+ "properties": {
+ "date": "YYYY-MM-DD",
+ "time": "HH:MM (AM|PM)"
+ }
+ },
+ "response": {
+ "confirmation_message": "$.message"
+ }
+ },
+ "public": false
+ }
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/tools.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/tools.mdx
new file mode 100644
index 00000000000..c419cd42b6e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/tools.mdx
@@ -0,0 +1,66 @@
+---
+title: "List Custom Tools"
+api: "GET https://api.bland.ai/v1/tools"
+description: "Retrieve Custom Tools you've created."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Whether the requet succeeded or failed.
+
+
+
+ An array of your available tools.
+
+
+
+```json Response
+{
+ "status": "success",
+ "tools": [
+ {
+ "tool_id": "TL-5da8347d-0ab7-415d-b156-a7fc5c6074dc",
+ "label": null,
+ "tool": {
+ "name": "BookAppointment",
+ "description": "Books the appointment. Can only be used once.",
+ "speech": "Please wait while I book that appointment for you",
+ "method": "POST",
+ "timeout": 99999999,
+ "url": "https://...",
+ "body": {
+ "slot": "{{input}}"
+ },
+ "input_schema": {
+ "type": "object",
+ "example": {
+ "date": "2024-03-16",
+ "time": "5:00 PM"
+ },
+ "required": [
+ "date",
+ "time"
+ ],
+ "properties": {
+ "date": "YYYY-MM-DD",
+ "time": "HH:MM (AM|PM)"
+ }
+ },
+ "response": {
+ "confirmation_message": "$.message"
+ }
+ },
+ "public": false
+ },
+ ...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/voices-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/voices-id.mdx
new file mode 100644
index 00000000000..0e4ca11d463
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/voices-id.mdx
@@ -0,0 +1,60 @@
+---
+title: "Voice Details"
+api: "GET https://api.bland.ai/v1/voices/{id}"
+description: "Retrieve detailed information about a specific voice."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the voice preset.
+
+Place either the voice's `name` or `id` here.
+
+For example, `GET https://api.bland.ai/v1/voices/david` or `GET https://api.bland.ai/v1/voices/ff2c405b-3dba-41e0-9261-bc8ee3f91f46`.
+
+
+
+### Response
+
+
+ Contains detailed information about the specified voice.
+
+ - `id` - The unique id for that voice.
+ - `name` - Public voice name, and can also be used as a unique identifier.
+ - `description` - The description of the voice.
+ - `public` - Whether or not the voice is publicly available.
+ - `tags` - A list of tags associated with the voice for the language, voice details, and will have `"Bland Curated"` for preferred voices.
+
+ - `average_rating` - The average star ratings for the voice (out of 5 stars).
+ - `total_ratings` - The number of ratings for the voice.
+
+ Note: Ratings are under development and may show incomplete or inaccurate data.
+
+
+
+
+```json
+{
+ "voice": {
+ "id": "2f9fdbc7-4bf2-4792-8a18-21ce3c93978f",
+ "name": "maya",
+ "description": "Young American Female",
+ "public": true,
+ "tags": [
+ "english",
+ "soft",
+ "Bland Curated"
+ ],
+ "total_ratings": 1234,
+ "average_rating": 4
+ }
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/voices.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/voices.mdx
new file mode 100644
index 00000000000..181f00a9e41
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/get/voices.mdx
@@ -0,0 +1,99 @@
+---
+title: "List Voices"
+api: "GET https://api.bland.ai/v1/voices"
+description: "Retrieves all available voices for your account."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Contains a list of the voices available for your account.
+
+
+ The unique identifier for the voice.
+
+
+
+ The name of the voice. This value can also be used in the `voice` parameter when sending calls.
+
+
+
+ A brief description of the voice.
+
+
+
+ Indicates whether the voice is publicly available or specific to your account.
+
+
+
+ A list of tags that describe the voice. We recommend "Bland Curated" voices for the best quality over the phone.
+
+
+
+ The number of ratings the voice has received.
+
+
+
+ The average rating of the voice, out of 5.
+
+
+ Note: Ratings are under development at this time and may display incomplete/inaccurate data.
+
+
+
+
+```json
+{
+ "voices": [
+ {
+ "id": "2f9fdbc7-4bf2-4792-8a18-21ce3c93978f",
+ "name": "maya",
+ "description": "Young American Female",
+ "public": true,
+ "tags": [
+ "english",
+ "soft",
+ "Bland Curated"
+ ]
+ },
+ {
+ "id": "37b3f1c8-a01e-4d70-b251-294733f08371",
+ "name": "ryan",
+ "description": "Professional American Male",
+ "public": true,
+ "tags": [
+ "english",
+ "Bland Curated"
+ ]
+ },
+ {
+ "id": "90295ec4-f0fe-4783-ab33-8b997ddc3ae4",
+ "name": "mason",
+ "description": "American Male",
+ "public": true,
+ "tags": [
+ "english",
+ "Bland Curated"
+ ]
+ },
+ {
+ "id": "bbeabae6-ec8d-444f-92ad-c8e620d3de8d",
+ "name": "tina",
+ "description": "Gentle American Female",
+ "public": true,
+ "tags": [
+ "english",
+ "gentle"
+ ]
+ },
+ //...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/accounts-delete.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/accounts-delete.mdx
new file mode 100644
index 00000000000..660858e5067
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/accounts-delete.mdx
@@ -0,0 +1,39 @@
+---
+title: "Delete Encrypted Key"
+api: "POST https://api.bland.ai/v1/accounts/delete"
+description: "Disable an encrypted key for a Twilio account integration. See [Enterprise Twilio Integration](/enterprise-features/custom-twilio) for more information."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ The `encrypted_key` to delete.
+
+
+### Response
+
+
+ The status of the request.
+
+ - `success` - The encrypted key was successfully deleted.
+ - `error` - There was an error deleting the encrypted key.
+
+
+
+
+ Special messages: - `Error deleting Twilio credentials` - The encrypted key could not be deleted or already has been
+ deleted. - `Missing encrypted key` - The `encrypted_key` parameter is missing. - none - The encrypted key was
+ successfully deleted.
+
+
+
+```json
+{
+ "status": "success"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/accounts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/accounts.mdx
new file mode 100644
index 00000000000..b66835124fd
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/accounts.mdx
@@ -0,0 +1,36 @@
+---
+title: "Create Encrypted Key"
+api: "POST https://api.bland.ai/v1/accounts"
+description: "Integrate your own Twilio account with Bland. See [Enterprise Twilio Integration](/enterprise-features/custom-twilio) for more information."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ Your Twilio account SID.
+
+
+
+ Your Twilio auth token.
+
+
+### Response
+
+
+ Your `encrypted_key` to store and use in future requests.
+
+
+
+```json
+{
+ "status": "success",
+ "encrypted_key": "YOUR_ENCRYPTED_KEY"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents-id-authorize.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents-id-authorize.mdx
new file mode 100644
index 00000000000..2f2af47e2da
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents-id-authorize.mdx
@@ -0,0 +1,61 @@
+---
+title: "Authorize a Web Agent Call"
+api: "POST https://web.bland.ai/v1/agents/{agent_id}/authorize"
+description: "Create a single-use session token for a client to talk with your web agent."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+Example web call usage (client side):
+
+```javascript
+import { BlandWebClient } from "bland-client-js-sdk";
+
+const agentId = "YOUR-AGENT-ID";
+const sessionToken = "YOUR-SESSION-TOKEN";
+
+document.addEventListener("DOMContentLoaded", async () => {
+ document.getElementById("btn").addEventListener("click", async () => {
+ const blandClient = new BlandWebClient(agentId, sessionToken);
+ await blandClient.initConversation({
+ sampleRate: 44100,
+ });
+ });
+});
+```
+
+
+
+### Path
+
+
+ The web agent to authorize a call for.
+
+Special note: While in Beta, this request must be made to the `web.bland.ai` domain.
+
+
+
+### Response
+
+
+ The single-use session token that can be sent to the client.
+
+
+
+ Can be `success` or `error`.
+
+
+
+ A message saying whether the token creation succeeded, or a helpful message describing why it failed.
+
+
+
+```json
+{
+ "token": "22480c52-0ff1-4214-bcb7-50649b508432"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents-id-delete.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents-id-delete.mdx
new file mode 100644
index 00000000000..3615b1b7a9f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents-id-delete.mdx
@@ -0,0 +1,36 @@
+---
+title: "Delete Web Agent"
+api: "POST https://api.bland.ai/v1/agents/{agent_id}/delete"
+description: "Delete a web agent."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path
+
+
+ The web agent to delete.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A message saying whether the deletion succeeded, or a helpful message describing why it failed.
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully deleted agent 2c565dc7-f41f-43db-a99f-e4c8ba9d7d18"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents-id.mdx
new file mode 100644
index 00000000000..7929784e21c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents-id.mdx
@@ -0,0 +1,210 @@
+---
+title: "Update Web Agent Settings"
+api: "POST https://api.bland.ai/v1/agents/{agent_id}"
+description: "Update your web agent's settings, prompt and other details."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The web agent you'll be updating.
+
+
+### Body
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+
+ Set your agent's voice - all available voices can be found with the [List Voices](/api-v1/get/voices) endpoint.
+
+
+
+ Define a JSON schema for how you want to get information about the call - information like email addresses, names, appointment times or any other type of custom data.
+
+In the webhook response or whenever you retrieve call data later, you'll get the data you defined back under `analysis`.
+
+For example, if you wanted to retrieve this information from the call:
+
+```json
+"analysis_schema": {
+ "email_address": "email",
+ "first_name": "string",
+ "last_name": "string",
+ "wants_to_book_appointment": "boolean",
+ "appointment_time": "YYYY-MM-DD HH:MM:SS"
+}
+```
+
+You would get it filled out like this in your webhook once the call completes:
+
+```json
+"analysis": {
+ "email_address": "johndoe@gmail.com",
+ "first_name": "John",
+ "last_name": "Doe",
+ "wants_to_book_appointment": true,
+ "appointment_time": "2024-01-01 12:00:00"
+}
+```
+
+
+
+
+ Add any additional information you want to associate with the call. This can be useful for tracking or categorizing
+ calls.
+
+
+
+ Set the pathway that your agent will follow. This will override the `prompt` field, so there is no need to pass the 'prompt' field if you are setting a pathway.
+
+ Warning: Setting a pathway will set the following fields to `null` / their default value - `prompt`, `first_sentence`, `model`, `dynamic_data`, `tools`
+
+ Set to `null` or an empty string to clear the pathway.
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```ENG``` - Spanish: ```ESP``` - French:
+ ```FRE``` - Polish: ```POL``` - German: ```GER``` - Italian: ```ITA``` - Brazilian Portuguese: ```PBR``` - Portuguese:
+ ```POR```
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id
+ and transcript to this URL after the call completes. This can be useful if you
+ want to have real time notifications when calls finish.
+
+Set to `null` or an empty string to clear the webhook.
+
+
+
+
+ Select a model to use for your call.
+
+Options: `base`, `turbo` and `enhanced`.
+
+In nearly all cases, `enhanced` is the best choice for now.
+
+
+
+There are three different ways to use Bland:
+
+- `model: base`
+
+ - The original, follows scripts/procedures most effectively.
+ - Supports all features and capabilities.
+ - Best for Custom Tools
+
+- `model: enhanced`
+
+ - Much faster latency and very conversational, works best with objective-based prompts.
+ - Supports all features and capabilities.
+
+- `model: turbo`
+
+ - The absolute fastest latency possible, can be verbose at times
+ - Limited capabilities currently (excludes Transferring, IVR navigation, Custom Tools)
+ - Extremely realistic conversation capabilities
+
+
+
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+To remove, set to `null` or an empty string.
+
+
+
+
+ Interact with the real world through API calls.
+
+Detailed tutorial here: [Custom Tools](/tutorials/custom-tools)
+
+
+
+
+ Integrate data from external APIs into your agent's knowledge.
+
+Set to `null` or an empty string to clear dynamic data settings.
+
+Detailed usage in the [Send Call](/api-v1/post/calls) endpoint.
+
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `500` milliseconds. You'll encounter higher latency, but you'll be interrupted less frequently.
+
+Set to `null` to reset to default.
+
+
+
+
+ The maximum duration that calls to your agent can last before being automatically terminated.
+
+Set to `null` to reset to default.
+
+
+
+### Response
+
+
+ Whether the update was successful or not - will be `success` or `error`.
+
+
+
+ A message describing the status of the update.
+
+
+
+ An object containing the updated settings for the agent.
+
+
+
+ If the update was unsuccessful, this will contain the settings that failed to update. Useful to determine how your
+ request is being interpreted on our end.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully updated agent 46f37229-7d12-44be-b343-6e68274cfbea.",
+ "updates": {
+ "model": "enhanced"
+ }
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents.mdx
new file mode 100644
index 00000000000..22648ba0c44
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/agents.mdx
@@ -0,0 +1,215 @@
+---
+title: "Create a Web Agent"
+api: "POST https://api.bland.ai/v1/agents"
+description: "Configure all of the settings for a new web agent."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+Example web call usage (client side):
+
+```javascript
+import { BlandWebClient } from "bland-client-js-sdk";
+
+const agentId = "YOUR-AGENT-ID";
+const sessionToken = "YOUR-SESSION-TOKEN";
+
+document.addEventListener("DOMContentLoaded", async () => {
+ document.getElementById("btn").addEventListener("click", async () => {
+ const blandClient = new BlandWebClient(agentId, sessionToken);
+ await blandClient.initConversation({
+ sampleRate: 44100,
+ });
+ });
+});
+```
+
+
+### Body
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+ - Ends call when objective is complete or voicemail is detected
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+
+ Set your agent's voice - all available voices can be found with the [List Voices](/api-v1/get/voices) endpoint.
+
+
+
+ Define a JSON schema for how you want to get information about the call - information like email addresses, names, appointment times or any other type of custom data.
+
+In the webhook response or whenever you retrieve call data later, you'll get the data you defined back under `analysis`.
+
+For example, if you wanted to retrieve this information from the call:
+
+```json
+"analysis_schema": {
+ "email_address": "email",
+ "first_name": "string",
+ "last_name": "string",
+ "wants_to_book_appointment": "boolean",
+ "appointment_time": "YYYY-MM-DD HH:MM:SS"
+}
+```
+
+You would get it filled out like this in your webhook once the call completes:
+
+```json
+"analysis": {
+ "email_address": "johndoe@gmail.com",
+ "first_name": "John",
+ "last_name": "Doe",
+ "wants_to_book_appointment": true,
+ "appointment_time": "2024-01-01 12:00:00"
+}
+```
+
+
+
+
+ Add any additional information you want to associate with the call. This can be useful for tracking or categorizing
+ calls.
+
+
+
+ Set the pathway that your agent will follow. This will override the `prompt` field, so there is no need to pass the 'prompt' field if you are setting a pathway.
+
+ Warning: Setting a pathway will set the following fields to `null` / their default value - `prompt`, `first_sentence`, `model`, `dynamic_data`, `tools`
+
+ Set to `null` or an empty string to clear the pathway.
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```ENG``` - Spanish: ```ESP``` - French:
+ ```FRE``` - Polish: ```POL``` - German: ```GER``` - Italian: ```ITA``` - Brazilian Portuguese: ```PBR``` - Portuguese:
+ ```POR```
+
+
+
+ Select a model to use for your call.
+
+Options: `base`, `turbo` and `enhanced`.
+
+In nearly all cases, `enhanced` is the best choice for now.
+
+
+
+There are three different ways to use Bland:
+
+- `model: base`
+
+ - The original, follows scripts/procedures most effectively.
+ - Supports all features and capabilities.
+ - Best for Custom Tools
+
+- `model: enhanced`
+
+ - Much faster latency and very conversational, works best with objective-based prompts.
+ - Supports all features and capabilities.
+
+- `model: turbo`
+
+ - The absolute fastest latency possible, can be verbose at times
+ - Limited capabilities currently (excludes Transferring, IVR navigation, Custom Tools)
+ - Extremely realistic conversation capabilities
+
+
+
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+To remove, set to `null` or an empty string.
+
+
+
+
+ Interact with the real world through API calls.
+
+Detailed tutorial here: [Custom Tools](/tutorials/custom-tools)
+
+
+
+
+ Integrate data from external APIs into your agent's knowledge.
+
+Set to `null` or an empty string to clear dynamic data settings.
+
+Detailed usage in the [Send Call](/api-v1/post/calls) endpoint.
+
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `500` milliseconds. You'll encounter higher latency, but you'll be interrupted less frequently.
+
+Set to `null` to reset to default.
+
+
+
+
+ The maximum duration that calls to your agent can last before being automatically terminated.
+
+Set to `null` to reset to default.
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+
+```json Response
+{
+ "agent": {
+ "agent_id": "2c565dc7-f41f-43db-a99f-e4c8ba9d7d18",
+ "webhook": null,
+ "dynamic_data": null,
+ "interruption_threshold": null,
+ "first_sentence": null,
+ "model": "enhanced",
+ "voice_settings": null,
+ "voice": "maya",
+ "prompt": "...",
+ "temperature": null,
+ "max_duration": 30,
+ "language": "ENG",
+ "tools": null
+ }
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/batches-id-analyze.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/batches-id-analyze.mdx
new file mode 100644
index 00000000000..663762fc21e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/batches-id-analyze.mdx
@@ -0,0 +1,93 @@
+---
+title: "Analyze Batch with AI"
+api: "POST https://api.bland.ai/v1/batches/{batch_id}/analyze"
+description: "Analyzes a batch of calls based on using questions and goals."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the batch of calls to be analyzed.
+
+
+### Request Body
+
+
+ This is the overall purpose of the batch of calls. Provides context for the analysis to guide how the
+ questions/transcripts are interpreted.
+
+
+
+ An array of questions to be analyzed for each call in the batch.
+
+ Each question should be an array with two elements: the question text and the expected answer type (e.g., "string", "boolean").
+
+Fairly flexible in terms of the expected answer type, and unanswerable questions will default to `null`.
+
+Examples:
+
+```json
+"questions": [
+ ["Who answered the call?", "human or voicemail"],
+ ["Positive feedback about the product: ", "string"],
+ ["Negative feedback about the product: ", "string"],
+ ["Customer confirmed they were satisfied", "boolean"]
+ ]
+```
+
+
+
+### Response
+
+
+ Will be `success` if the request was successful.
+
+
+
+ Confirms the request was successful, or provides an error message if the request failed.
+
+
+
+ Contains the analyzed answers for each call in the batch.
+
+The keys are `call_id`s from the batch, and the array values are the analysis results for each question in the batch.
+
+
+
+
+ Token-based price for the analysis request.
+
+As a rough estimate, the base cost is `0.003` credits with an additional `0.0015` credits per call in the batch.
+
+Longer call transcripts and higher numbers of questions can increase the cost, however the cost scales very effectively with batches vs. individual calls.
+
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully analyzed batch",
+ "answers": {
+ "123e4567-e89b-12d3-a456-426614174000": [
+ "human",
+ "Customer found the product sturdy and reliable",
+ "A bit heavy",
+ true
+ ],
+ "123e4567-e89b-12d3-a456-426614174001": [
+ "voicemail",
+ null,
+ null,
+ false
+ ]
+ }
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/batches-id-stop.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/batches-id-stop.mdx
new file mode 100644
index 00000000000..d2dbda1ea3b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/batches-id-stop.mdx
@@ -0,0 +1,49 @@
+---
+title: "Stop Active Batch"
+api: "POST https://api.bland.ai/v1/batches/{batch_id}/stop"
+description: "Stops all active calls in a batch."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the batch to be cancelled.
+
+
+### Response
+
+
+ The status of the request. If anything other than 'success', an error has occurred or all calls have already been
+ completed.
+
+
+
+ A message describing the status of the request.
+
+
+
+ The number of calls that were cancelled.
+
+
+
+ The `batch_id` of the cancelled batch.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully stopped batch",
+ "num_calls": 1205,
+ "batch_id": "5e5b1a3a-2b0a-4b9e-8b9e-asdf-gen-batch"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/batches.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/batches.mdx
new file mode 100644
index 00000000000..df4e89a86a0
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/batches.mdx
@@ -0,0 +1,91 @@
+---
+title: "Send a Batch of Calls"
+api: "POST https://api.bland.ai/v1/batches"
+description: "Send large volumes of calls at once with a single API request."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ This is the prompt or task used for all the phone calls in the request. Information can be inserted into it surrounding variable names with \{\{curly braces\}\}.
+
+Example:
+
+```json
+"You are calling {{business}} to renew their subscription to {{service}} before it expires on {{date}}."
+```
+
+
+
+
+ Define a list of calls to make and their properties. Each call in call_data MUST have a "phone_number" property. Properties are case-sensitive.
+
+Example:
+
+```json
+[
+ {
+ "phone_number": "1234567890",
+ "business": "ABC Corp",
+ "service": "Netflix",
+ "date": "September 4th"
+ },
+ {
+ "phone_number": "32176540987",
+ "business": "XYZ inc.",
+ "service": "Window Cleaning",
+ "date": "December 20th"
+ }
+]
+```
+
+
+
+
+ Adds a user-friendly label to your batch to keep track of it's original intention. This can help differentiate
+ multiple call batches that are part of the same Campaign. Shown when a batch is retreived.
+
+
+
+ Use ```campaign_id``` to organize related batches together. This can be set manually or auto-generated through
+ Campaigns.
+
+
+
+ When this is set to ```true```, only the first call of ```call_data``` will be dispatched. A common use case is to set the first ```phone_number``` value to your own to confirm everything's set up properly.
+
+Includes additional information in the response when true so that it's easier to find any issues.
+
+
+
+
+ All other parameters supported by the [Send Call](/api-v1/post/calls) endpoint are supported here as well. They will
+ be applied to each call in the batch.
+
+
+### Response
+
+
+ If anything other than "success" is returned, there was an error.
+
+
+
+ The unique identifier for the batch.
+
+
+
+
+```json Response
+{
+ "message": "success",
+ "batch_id": "3p$7rQ3p9sT5bzmF-gen-batch"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-id-analyze.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-id-analyze.mdx
new file mode 100644
index 00000000000..f8be1374190
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-id-analyze.mdx
@@ -0,0 +1,82 @@
+---
+title: "Analyze Call with AI"
+api: "POST https://api.bland.ai/v1/calls/{call_id}/analyze"
+description: "Analyzes a call of calls based using questions and goals."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the call to be analyzed.
+
+
+### Request Body
+
+
+ This is the overall purpose of the call. Provides context for the analysis to guide how the questions/transcripts are
+ interpreted.
+
+
+
+ An array of questions to be analyzed for the call.
+
+ Each question should be an array with two elements: the question text and the expected answer type (e.g., "string", "boolean").
+
+Fairly flexible in terms of the expected answer type, and unanswerable questions will default to `null`.
+
+Examples:
+
+```json
+"questions": [
+ ["Who answered the call?", "human or voicemail"],
+ ["Positive feedback about the product: ", "string"],
+ ["Negative feedback about the product: ", "string"],
+ ["Customer confirmed they were satisfied", "boolean"]
+ ]
+```
+
+
+
+### Response
+
+
+ Will be `success` if the request was successful.
+
+
+
+ Confirms the request was successful, or provides an error message if the request failed.
+
+
+
+ Contains the analyzed answers for the call in an array.
+
+
+
+ Token-based price for the analysis request.
+
+As a rough estimate, the base cost is `0.003` credits with an additional `0.0015` credits per call in the call.
+
+Longer call transcripts and higher numbers of questions can increase the cost, however the cost scales very effectively with calls vs. individual calls.
+
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully analyzed call",
+ "answers": [
+ "human",
+ "Customer found the product sturdy and reliable",
+ "A bit heavy",
+ true
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-id-stop.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-id-stop.mdx
new file mode 100644
index 00000000000..acacaa381e9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-id-stop.mdx
@@ -0,0 +1,37 @@
+---
+title: "Stop Active Call"
+api: "POST https://api.bland.ai/v1/calls/{call_id}/stop"
+description: "End an active phone call by call_id."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the call you want to end.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ If the status is `success`, the message will say "Call ended successfully." Otherwise, if the status is `error`, the
+ message will say "SID not found for the given c_id." or "Internal server error."
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Call ended successfully."
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-simple-pathway.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-simple-pathway.mdx
new file mode 100644
index 00000000000..25b29bc89a1
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-simple-pathway.mdx
@@ -0,0 +1,75 @@
+---
+title: "Send Call using Pathways (Simple)"
+api: "POST https://api.bland.ai/v1/calls"
+description: "Send an AI phone call with your own conversational pathway agent!
+Links - [Video Tutorial](https://www.loom.com/share/5ce5a84ec97149efad7cf5eff66a93c5?sid=697dc436-53cf-494c-a3e9-a25031df6496) | [Step-by-step web tutorial](https://docs.bland.ai/tutorials/pathways)"
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to call. Country code defaults to `+1` (US) if not specified.
+
+ Formatting is flexible, however for the most predictable results use the [E.164](https://www.twilio.com/docs/glossary/what-e164#examples-of-e164-numbers) format.
+
+
+ Expected/Ideal Format:
+ - "+12223334444"
+ - "+91223334444"
+ - "+61223334444"
+
+ Valid, but not recommended:
+ - "2223334444"
+ - "+1 (222) 333-4444"
+ - "+1 222 333 4444"
+ - "222-333-4444"
+
+ Invalid:
+ - "12223334444"
+ - "552223334444"
+ - "non-numeric characters"
+ - "2223334444 ext. 123"
+
+
+
+
+
+ Follows the conversational pathway you created to guide the conversation.
+
+You can access your pathway_id by clicking on the 'Copy ID' button on your pathways [here](https://app.bland.ai/home?page=convo-pathways). If you don't have any pathways, click the 'Create Pathway' button to create one!
+
+
+
+ [Video tutorial](https://www.loom.com/share/5ce5a84ec97149efad7cf5eff66a93c5?sid=697dc436-53cf-494c-a3e9-a25031df6496)
+
+ [Step by step Web Tutorial](https://docs.bland.ai/tutorials/pathways)
+
+
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-simple.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-simple.mdx
new file mode 100644
index 00000000000..ea24eaba499
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls-simple.mdx
@@ -0,0 +1,82 @@
+---
+title: "Send Call (Simple)"
+api: "POST https://api.bland.ai/v1/calls"
+description: "Send an AI phone call with a custom objective and actions."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to call. Country code defaults to `+1` (US) if not specified.
+
+ Formatting is flexible, however for the most predictable results use the [E.164](https://www.twilio.com/docs/glossary/what-e164#examples-of-e164-numbers) format.
+
+
+ Expected/Ideal Format:
+ - "+12223334444"
+ - "+91223334444"
+ - "+61223334444"
+
+ Valid, but not recommended:
+ - "2223334444"
+ - "+1 (222) 333-4444"
+ - "+1 222 333 4444"
+ - "222-333-4444"
+
+ Invalid:
+ - "12223334444"
+ - "552223334444"
+ - "non-numeric characters"
+ - "2223334444 ext. 123"
+
+
+
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+ - Ends call when objective is complete or voicemail is detected
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls.mdx
new file mode 100644
index 00000000000..186acf39e65
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/calls.mdx
@@ -0,0 +1,549 @@
+---
+title: "Send Call"
+api: "POST https://api.bland.ai/v1/calls"
+description: "Send an AI phone call with a custom objective and actions."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ A special key for using a BYOT (Bring Your Own Twilio) account. Not required in most cases.
+
+
+### Body
+
+
+ The phone number to call. Country code defaults to `+1` (US) if not specified.
+
+ Formatting is flexible, however for the most predictable results use the [E.164](https://www.twilio.com/docs/glossary/what-e164#examples-of-e164-numbers) format.
+
+
+ Expected/Ideal Format:
+ - "+12223334444"
+ - "+91223334444"
+ - "+61223334444"
+
+ Valid, but not recommended:
+ - "2223334444"
+ - "+1 (222) 333-4444"
+ - "+1 222 333 4444"
+ - "222-333-4444"
+
+ Invalid:
+ - "12223334444"
+ - "552223334444"
+ - "non-numeric characters"
+ - "2223334444 ext. 123"
+
+
+
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+ - Ends call when objective is complete or voicemail is detected
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+
+ The voice of the AI agent to use. Accepts any form of voice ID, including custom voice clones and voice presets.
+
+Default voices can be referenced directly by their name instead of an id.
+
+Usage example: `voice: "maya"`
+
+Bland Curated voices:
+
+- `maya`
+- `mason`
+- `ryan`
+- `adriana`
+- `tina`
+- `matt`
+- `evelyn`
+
+Use the [GET /v1/voices](https://api.bland.ai/voices) endpoint to see a full list of your available voices.
+
+
+
+ Note: Including `voice_id` or `reduce_latency` in your request is still supported, but not recommended.
+
+ The previous structure to select voices used both `voice_id` and `reduce_latency`. To simplify the process, we've combined these into a single `voice` parameter.
+
+ - If the first two letters of `voice` are `RL`, that is equivalent to settings `reduce_latency` to `true`.
+ - Prefixing the voice ID with `HQ` will use the high fidelity version of the voice.
+ - The integer following the prefix is the `voice_id` from before.
+
+ Example:
+ - `reduce_latency: true, voice_id: 0` is equivalent to `voice: "RL0"`
+ - `reduce_latency: false, voice_id: 3` is equivalent to `voice: "HQ3"`
+
+ Including `reduce_latency` may override the `voice` parameter, so exclude it when using `voice`.
+
+
+
+
+ All presets have been migrated to the `voice` parameter and can use either the preset name or ID.
+
+ If you used to have a `voice_preset_id` of `"2f9fdbc7-4bf2-4792-8a18-21ce3c93978f"`, you can now use `voice: "2f9fdbc7-4bf2-4792-8a18-21ce3c93978f"`.
+
+
+
+
+
+ Define a JSON schema for how you want to get information about the call - information like email addresses, names, appointment times or any other type of custom data.
+
+In the webhook response or whenever you retrieve call data later, you'll get the data you defined back under `analysis`.
+
+For example, if you wanted to retrieve this information from the call:
+
+```json
+"analysis_schema": {
+ "email_address": "email",
+ "first_name": "string",
+ "last_name": "string",
+ "wants_to_book_appointment": "boolean",
+ "appointment_time": "YYYY-MM-DD HH:MM:SS"
+}
+```
+
+You would get it filled out like this in your webhook once the call completes:
+
+```json
+"analysis": {
+ "email_address": "johndoe@gmail.com",
+ "first_name": "John",
+ "last_name": "Doe",
+ "wants_to_book_appointment": true,
+ "appointment_time": "2024-01-01 12:00:00"
+}
+```
+
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without
+ `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+
+
+ Should the AI speak first or wait for someone else to talk?
+
+ Creates more realistic conversations when answered with "Hello?", "This is \{name\} speaking." and so on.
+
+ - When ```false```: The AI starts speaking shortly after the call is answered.
+
+ - When ```true```: The AI will wait for the answerer to speak.
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `200` milliseconds. You'll encounter higher latency, but you'll be interrupted much less frequently.
+
+
+
+
+ This is the pathway ID for the pathway you have created on our dev portal. You
+ can access the ID of your pathways by clicking the 'Copy ID' button of your
+ pathway [here](https://app.bland.ai/home?page=convo-pathways)
+
+Note: Certain parameters do not apply when using pathways.
+
+{" "}
+
+
+ - `task` - The pathway substitutes as the agent's instructions. - `model` - We use our own fine-tuned models under the
+ hood. - `tools` - Replaced by 'Webhook' Node in Pathways - `transfer_list` - Replaced by 'Transfer Call' Node in
+ Pathways - `transfer_phone_number` - Replaced by 'Transfer Call' Node in Pathways
+
+
+Example Simple Request body:
+
+```json
+"phone_number": "+1975934749",
+"pathway_id": "a0f0d4ed-f5f5-4f16-b3f9-22166594d7a7"
+```
+
+
+
+
+ Select a model to use for your call.
+
+Options: `gpt4`, `base`, `turbo` and `enhanced`.
+
+In nearly all cases, `enhanced` is the best choice for now.
+
+
+
+There are four different ways to use Bland:
+
+- `model: gpt4`
+
+ - Slow but accurate
+ - Supports all features and capabilities.
+ - Best for complex tasks where latency isn't a priority
+
+- `model: base`
+
+ - The original, follows scripts/procedures most effectively.
+ - Supports all features and capabilities.
+ - Best for Custom Tools
+
+- `model: enhanced`
+
+ - Much faster latency and very conversational, works best with objective-based prompts.
+ - Supports all features and capabilities.
+
+- `model: turbo`
+
+ - The absolute fastest latency possible, can be verbose at times
+ - Limited capabilities currently (excludes Transferring, IVR navigation, Custom Tools)
+ - Extremely realistic conversation capabilities
+
+
+
+
+
+
+ Interact with the real world through API calls.
+
+Detailed tutorial here: [Custom Tools](/tutorials/custom-tools)
+
+
+
+
+ Add any additional information you want to associate with the call. This can be useful for tracking or categorizing calls.
+
+Anything that you put here will be returned in your webhook or in the call details under `metadata`.
+
+Example:
+
+```json
+"metadata": {
+ "campaign_id": "1234",
+ "source": "web"
+}
+```
+
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id and transcript to this URL after the call
+ completes. This can be useful if you want to have real time notifications when calls finish.
+
+
+
+ To record your phone call, set `record` to true. When your call completes, you can access through the `recording_url`
+ field in the call details or your webhook.
+
+
+
+ A phone number that the agent can transfer to under specific conditions - such as being asked to speak to a human or supervisor.
+
+
+ For best results:
+ - Specify conditions that the agent should transfer to a human under (examples are great!)
+ - In the `task`, refer to the action solely as "transfer" or "transferring".
+ - Alternate phrasing such as "swap" or "switch" can mislead the agent, causing the action to be ignored.
+
+
+
+
+
+ Give your agent the ability to transfer calls to a set of phone numbers.
+
+Overrides `transfer_phone_number` if a `transfer_list.default` is specified.
+
+Will default to `transfer_list.default`, or the chosen phone number.
+
+Example usage to route calls to different departments:
+
+```json
+"transfer_list": {
+ "default": "+12223334444",
+ "sales": "+12223334444",
+ "support": "+12223334444",
+ "billing": "+12223334444"
+}
+```
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```ENG``` - Spanish: ```ESP``` - French:
+ ```FRE``` - Polish: ```POL``` - German: ```GER``` - Italian: ```ITA``` - Brazilian Portuguese: ```PBR``` - Portuguese:
+ ```POR```
+
+
+
+ Set the longest you want the call to possibly go in minutes. After the max_duration minutes have passed, the call will
+ automatically end. Example Values: ```20, 2```
+
+
+
+ Enables machine detection when the call starts to determine whether the call was answered by a person or a voicemail.
+
+Best Practices (when enabled):
+
+- Since the determination is made at the beginning of the call, use `wait_for_greeting` to try and coax a human response.
+- If combined with `first_sentence`, try wording it so the person answering says something back - ex. `"Hello?"` or `"Is this \{\{name\}\}?"`.
+
+Price: `$0.02` per call, however there is no charge for unanswered calls or calls that failed to send.
+
+
+
+
+ Specify a purchased Outbound Number to call from. Country code is required, spaces or parentheses must be excluded.
+
+By default, calls are initiated from a separate pool of numbers owned by Bland.
+
+
+
+
+ The pronunciation guide is an `array` of `objects` that guides the LLM on how to say specific words. This is great for situations with complicated terms or names.
+
+````json
+ [
+ {
+ "word": "example",
+ "pronunciation": "ex-am-ple",
+ "case_sensitive": "false",
+ "spaced": "false"
+ },
+ {
+ "word": "API",
+ "pronunciation": "A P I",
+ "case_sensitive": "true",
+ "spaced": "true"
+ }
+ ]
+ ```
+
+
+
+ - `word`
+ — the word you want to guide the LLM on how to pronounce
+ - `pronunciation`
+ — the word you want to guide the LLM on how to pronounce.
+ - `case_sensitive`
+ — whether or not to consider case. Particularly useful with names. EG: 'Max' the name versus 'max' the word. Defaults to false. `Not required`.
+ - `spaced`
+ — whether or not to consider spaces. When `true` the word 'high' would be flagged but NOT 'hightop'. Defaults to true. `Not required`.
+
+
+
+
+
+ A value between 0 and 1 that controls the randomness of the LLM. 0 will cause more deterministic outputs while 1 will cause more random.
+
+ Example Values: ```"0.9", "0.3", "0.5"```
+
+
+
+ The time you want the call to start. If you don't specify a time (or the time is in the past), the call will send immediately.
+
+ Set your time in the format `YYYY-MM-DD HH:MM:SS -HH:MM` (ex. `2021-01-01 12:00:00 -05:00`).
+
+ The timezone is optional, and defaults to UTC if not specified.
+
+ Note: Scheduled calls can be cancelled with the [POST /v1/calls/:call_id/stop](/api-v1/post/calls-id-stop) endpoint.
+
+
+
+ When the AI encounters a voicemail, it will leave this message after the beep and then immediately end the call.
+
+ Warning: If `amd` is set to `true` or `voicemail_action` is set to `ignore`, then this will still work for voicemails, but it will not hang up for IVR systems.
+
+
+
+ This is processed separately from the AI's decision making, and overrides it.
+
+ Options:
+ - ```hangup```
+ - ```leave_message ```
+ - ```ignore```
+
+ Examples:
+ - Call is answered by a voicemail (specifically with a beep or tone):
+ - If `voicemail_message` is set, that message will be left and then the call will end.
+ - Otherwise, the call immediately ends (regardless of `amd`)
+
+ - Call is answered by an IVR system or phone tree:
+ - If `amd` is set to `true`, the AI will navigate the system and continue as normal.
+ - If `voicemail_action` is set to `ignore`, the AI will ignore the IVR and continue as normal.
+ - Otherwise, if `voicemail_message` is set then it'll leave that message and end the call.
+ - Finally, if none of those conditions are met, the call will end immediately.
+
+ Note: If `voicemail_message` is set, then the AI will leave the message regardless of the `voicemail_action`.
+
+
+
+ AMD mode helps your AI navigate phone trees and IVR systems. If you know your call will hit an automated system you should switch it on.
+
+ Behavioral changes:
+ - Much higher `interruption_threshold` so that the options are listened to in full.
+ - Underlying prompt is adjusted so the AI is aware it's navigating a phone tree.
+
+ NOTE: AMD mode causes increased delay for the first response, even if answered by a human. Highly recommended to set to `false` in the majority of cases.
+
+
+
+ When you want your AI to "know" a specific fact - like the caller's
+ name or other relevant context.
+
+ The AI agent will be aware of both the key names as well as their corresponding values.
+
+
+ Example Issue:
+ - The LLM is hallucinating specific facts. You need to provide specific information.
+ Example Solution:
+ - Use `request_data` to specify and label that data.
+
+ ```json
+ "request_data": {
+ "first_name":"John",
+ "date_of_birth":"03/14/05"
+ // additional parameters as needed
+ }
+ ```
+
+
+
+
+ Make dynamic requests to external APIs and use the data in your AI's responses.
+
+
+ Each request object should contain:
+
+ `url`: The URL of the external API to fetch data from.
+
+ `response_data`: An array of objects describing how to parse and use the data fetched from the API. Explained in more detail below.
+
+ The following are optional:
+
+ `method`: Allows `GET` or `POST`. Default: `GET`
+
+ `cache`: Whether to fetch the data once at the beginning of the call, or to re-check continuously for data that might change mid-call. Default: `true`
+
+ `headers`: An object of headers to send with the request.
+
+ `body`: The body of the request.
+
+ The following variables can be injected into the dynamic request body:
+
+ - `{{from}}` (Ex. `+12223334444`)
+ - `{{to}}`
+ - `{{short_from}}` (Ex. `2223334444`)
+ - `{{short_to}}`
+ - `{{call_id}}`
+
+ These string values will be replaced in each `dynamic_data[].body` where they're used by system values in each request.
+
+ Try out with this example:
+```json
+ "dynamic_data": [
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
+ "response_data": [
+ {
+ "name": "BTC Price USD",
+ "data": "bpi.USD.rate",
+ "context": "Current BTC Price: ${{BTC Price USD}} USD"
+ },
+ {
+ "name": "BTC Price EUR",
+ "data": "bpi.EUR.rate",
+ "context": "In Euros: {{BTC Price USD}} EUR"
+ }
+ ]
+ }
+ ]
+````
+
+
+ An array of objects describing how to parse and use the data fetched from the API.
+
+ Each object in this array should contain:
+ - `name`: A label for the fetched data.
+ - Example: `"Flight Status"`
+ - `data`: The JSON path in the API response to extract the data from.
+ - Example: `"user.flights[0].status"`
+ - `context`: How this data should be incorporated into the AI's knowledge.
+ - Example: `"John's flight is currently {{Flight Status}}"`
+
+
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+ The batch ID of the call (present only if status is `success`).
+
+
+
+ A message explaining the status of the call.
+
+
+
+ For validation errors, a detailed list of each field with an error and it's error message.
+
+Example:
+
+```json
+{
+ "status": "error",
+ "message": "Invalid parameters",
+ "errors": [
+ "Missing required parameter: phone_number.",
+ "Missing required parameter: task.",
+ "Phone number must be a string or number.",
+ "Task must be a string."
+ ]
+}
+```
+
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Call successfully queued.",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1",
+ "batch_id": null
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-insert.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-insert.mdx
new file mode 100644
index 00000000000..d52f27977cc
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-insert.mdx
@@ -0,0 +1,56 @@
+---
+title: "Upload Inbound Phone Numbers"
+api: "POST https://api.bland.ai/v1/inbound/insert"
+description: "Add inbound numbers to Bland from your own Twilio account. See [Enterprise Twilio Integration](/enterprise-features/custom-twilio) for more information."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ The `encrypted_key` of the Twilio account you want to upload numbers from.
+
+
+### Body
+
+
+ An array of phone numbers you want to upload to Bland.
+
+ Include the leading `'+'`, country code and the phone number without any special characters.
+
+ Example: `["+12223334444", "+13334445555"]`
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A message saying whether the insertion succeeded, or a helpful message describing why it failed.
+
+
+
+ An array of phone numbers that were successfully inserted.
+
+Any phone numbers that failed to be inserted will not be included in this array - for example if they are already in your account or not associated with the sepcified Twilio account.
+
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully inserted numbers",
+ "inserted": [
+ "+12223334444",
+ "+13334445555"
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-number-delete.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-number-delete.mdx
new file mode 100644
index 00000000000..484df899182
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-number-delete.mdx
@@ -0,0 +1,40 @@
+---
+title: "Delete Inbound Phone Number"
+api: "POST https://api.bland.ai/v1/inbound/{phone_number}/delete"
+description: "Remove an inbound number that was uploaded through your own Twilio account. See [Enterprise Twilio Integration](/enterprise-features/custom-twilio) for more information."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ The `encrypted_key` for the Twilio account that owns the phone number you want to delete.
+
+
+### Path
+
+
+ The phone number you want to remove from Bland's system.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A message saying whether the deletion succeeded, or a helpful message describing why it failed.
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully deleted number from database: +15555555555"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-number-update.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-number-update.mdx
new file mode 100644
index 00000000000..cdec91a5e9f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-number-update.mdx
@@ -0,0 +1,273 @@
+---
+title: "Update Inbound Details"
+api: "POST https://api.bland.ai/v1/inbound/{phone_number}"
+description: "Update your inbound agent's settings, prompt and other details."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ The `encrypted_key` for the Twilio account that owns the phone number you want to modify. Not required if you are
+ using a Bland phone number.
+
+
+### Path Parameters
+
+
+ The inbound phone number you wish to update.
+
+ Formatting Notes:
+ - The `'+'` or `'%2B'` prefix is optional.
+ - Will assume a US country code if no country code is provided.
+
+ Valid Examples for `+13334445555`:
+ - `%2B13334445555`
+ - `13334445555`
+ - `3334445555`
+
+
+
+### Body
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+ For inbound numbers, consider including additional context about the purpose of the call, and what types of callers to expect.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+
+ Set your agent's voice - all available voices can be found with the [List Voices](/api-v1/get/voices) endpoint.
+
+
+
+ Define a JSON schema for how you want to get information about the call - information like email addresses, names, appointment times or any other type of custom data.
+
+In the webhook response or whenever you retrieve call data later, you'll get the data you defined back under `analysis`.
+
+For example, if you wanted to retrieve this information from the call:
+
+```json
+"analysis_schema": {
+ "email_address": "email",
+ "first_name": "string",
+ "last_name": "string",
+ "wants_to_book_appointment": "boolean",
+ "appointment_time": "YYYY-MM-DD HH:MM:SS"
+}
+```
+
+You would get it filled out like this in your webhook once the call completes:
+
+```json
+"analysis": {
+ "email_address": "johndoe@gmail.com",
+ "first_name": "John",
+ "last_name": "Doe",
+ "wants_to_book_appointment": true,
+ "appointment_time": "2024-01-01 12:00:00"
+}
+```
+
+
+
+
+ Add any additional information you want to associate with the call. This can be useful for tracking or categorizing
+ calls.
+
+
+
+ Set the pathway that your agent will follow. This will override the `prompt` field, so there is no need to pass the 'prompt' field if you are setting a pathway.
+
+ Warning: Setting a pathway will set the following fields to `null` / their default value - `prompt`, `first_sentence`, `model`, `dynamic_data`, `tools`
+
+ Set to `null` or an empty string to clear the pathway.
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```ENG``` - Spanish: ```ESP``` - French:
+ ```FRE``` - Polish: ```POL``` - German: ```GER``` - Italian: ```ITA``` - Brazilian Portuguese: ```PBR``` - Portuguese:
+ ```POR```
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id
+ and transcript to this URL after the call completes. This can be useful if you
+ want to have real time notifications when calls finish.
+
+Set to `null` or an empty string to clear the webhook.
+
+
+
+
+ Give your agent the ability to transfer calls to a set of phone numbers.
+
+Overrides `transfer_phone_number` if a `transfer_list.default` is specified.
+
+Will default to `transfer_list.default`, or the chosen phone number.
+
+Example usage to route calls to different departments:
+
+```json
+"transfer_list": {
+ "default": "+12223334444",
+ "sales": "+12223334444",
+ "support": "+12223334444",
+ "billing": "+12223334444"
+}
+```
+
+
+
+
+ Select a model to use for your call.
+
+Options: `base`, `turbo` and `enhanced`.
+
+In nearly all cases, `enhanced` is the best choice for now.
+
+
+
+There are three different ways to use Bland:
+
+- `model: base`
+
+ - The original, follows scripts/procedures most effectively.
+ - Supports all features and capabilities.
+ - Best for Custom Tools
+
+- `model: enhanced`
+
+ - Much faster latency and very conversational, works best with objective-based prompts.
+ - Supports all features and capabilities.
+
+- `model: turbo`
+
+ - The absolute fastest latency possible, can be verbose at times
+ - Limited capabilities currently (excludes Transferring, IVR navigation, Custom Tools)
+ - Extremely realistic conversation capabilities
+
+
+
+
+
+
+ A phone number that the agent can transfer to under specific conditions - such as being asked to speak to a human or supervisor.
+
+Set to `null` to remove.
+
+
+ For best results:
+ - Specify conditions that the agent should transfer to a human under (examples are great!)
+ - In the `task`, refer to the action solely as "transfer" or "transferring".
+ - Alternate phrasing such as "swap" or "switch" can mislead the agent, causing the action to be ignored.
+
+
+
+
+
+ To record your phone call, set `record` to true. When your call completes, you can access through the `recording_url`
+ field in the call details or your webhook.
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+To remove, set to `null` or an empty string.
+
+
+
+
+ Interact with the real world through API calls.
+
+Detailed tutorial here: [Custom Tools](/tutorials/custom-tools)
+
+
+
+
+ Integrate data from external APIs into your agent's knowledge.
+
+Set to `null` or an empty string to clear dynamic data settings.
+
+Detailed usage in the [Send Call](/api-v1/post/calls) endpoint.
+
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `500` milliseconds. You'll encounter higher latency, but you'll be interrupted less frequently.
+
+Set to `null` to reset to default.
+
+
+
+
+ The maximum duration that calls to your agent can last before being automatically terminated.
+
+Set to `null` to reset to default.
+
+
+
+### Response
+
+
+ Whether the update was successful or not - will be `success` or `error`.
+
+
+
+ A message describing the status of the update.
+
+
+
+ An object containing the updated settings for the inbound number.
+
+
+
+ If the update was unsuccessful, this will contain the settings that failed to update. Useful to determine how your
+ request is being interpreted on our end.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully updated number +18584139939.",
+ "updates": {
+ "prompt": "(Your prompt)",
+ "voice": "maya",
+ "webhook": null,
+ "first_sentence": "Roberta speaking, how can I help you?",
+ "record": false,
+ "max_duration": 30,
+ "model": "enhanced"
+ //...
+ }
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-purchase.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-purchase.mdx
new file mode 100644
index 00000000000..8173056ca6c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/inbound-purchase.mdx
@@ -0,0 +1,61 @@
+---
+title: "Purchase Inbound number"
+api: "POST https://api.bland.ai/v1/inbound/purchase"
+description: "Purchase and configure a new inbound phone number. ($15/mo. subscription using your stored payment method)."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ Choose a three-digit area code for your phone number. If set as a parameter, a number will only be purchased by exact
+ match if available.
+
+
+
+ This defines how the AI will start the conversation, information available to it, and its behaviors. Matches how the
+ outbound `task` parameter functions.
+
+
+
+ Choose a country code for your phone number.
+
+Options: `"US"` or `"CA"` for Canada. For others, please contact support.
+
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id and transcript to this URL after the call
+ completes. This can be useful if you want to have real time notifications when calls finish.
+
+
+
+ Specify an exact phone number you'd like to use. If provided, will override the `area_code` parameter and does not fall back to any other number.
+
+Example of the correct format (Note the `"+1"` is mandatory): `"+12223334444"`
+
+
+
+### Response
+
+
+ The created phone number, will be in the following format: `+1XXXXXXXXXX`
+
+Example: `+18582814611`
+
+
+
+
+
+```json Response
+{
+ "phone_number": "+18582814611"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/outbound-purchase.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/outbound-purchase.mdx
new file mode 100644
index 00000000000..d0326c09240
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/outbound-purchase.mdx
@@ -0,0 +1,37 @@
+---
+title: "Purchase Outbound number"
+api: "POST https://api.bland.ai/v1/outbound/purchase"
+description: "Purchase and configure a new inbound phone number. ($15/mo. subscription using your stored payment method)."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ Choose a three-digit area code for your phone number. If set as a parameter, a number will only be purchased by exact
+ match if available.
+
+
+### Response
+
+
+ The created phone number, will be in the following format: `+1XXXXXXXXXX`
+
+Example: `+18582814611`
+
+
+
+
+
+```json Response
+{
+ "phone_number": "+18582814611"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-analyze.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-analyze.mdx
new file mode 100644
index 00000000000..e0597fd5d1d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-analyze.mdx
@@ -0,0 +1,52 @@
+---
+title: "SMS Conversation Analysis"
+api: "POST https://api.bland.ai/v1/sms/analyze"
+description: "Answer questions and extract information from an SMS conversation."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ An overarching goal for the information you want to extract from the SMS messages.
+
+
+
+An array of questions that you want the AI to answer, along with their return types.
+
+For example:
+
+```json
+{
+ "answers": [
+ ["When does Bob want to move?", "time"],
+ ["Summarize the call.", "summary"]
+ ]
+}
+```
+
+
+
+
+ The phone number that received the messages.
+
+
+
+ The human/other phone number in the conversation.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully analyzed SMS messages.",
+ "answers": ["Bob prefers to have movers come in the morning.", "..."]
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-check-registration.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-check-registration.mdx
new file mode 100644
index 00000000000..82f037fb74b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-check-registration.mdx
@@ -0,0 +1,29 @@
+---
+title: "Check SMS A2P status"
+api: "POST https://api.bland.ai/v1/sms/register/status"
+description: "Check the status of an A2P registration."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The `registration_id` for the a2p registration.
+
+
+
+
+```json Response
+{
+ status: "pending" || "approved" || "failed",
+ brandType: //string of the brand type,
+ failureReason: null || "reason here"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-get-messages.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-get-messages.mdx
new file mode 100644
index 00000000000..631390cf779
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-get-messages.mdx
@@ -0,0 +1,33 @@
+---
+title: "Get SMS Messages"
+api: "POST https://api.bland.ai/v1/sms/messages/get"
+description: "Get the list of SMS messages for a given conversation."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+The `to` number in the conversation. This is the number you *do not* own.
+
+
+The `from` number in the conversation. This is the number you *do* own.
+
+**Please note any ordering of numbers will work**
+
+
+
+
+
+```json Response
+{
+ "messages": "[]"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-prompt-update.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-prompt-update.mdx
new file mode 100644
index 00000000000..f92ee107246
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-prompt-update.mdx
@@ -0,0 +1,34 @@
+---
+title: "Update SMS Prompt"
+api: "POST https://api.bland.ai/v1/sms/update"
+description: "Update your SMS agent's prompt."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to update.
+
+
+
+ The prompt for the AI to use when replying.
+
+
+
+ Pass in an array of strings, that if present, the AI should not respond to. Set to `null` to disable.
+
+
+
+
+```json Response
+{
+ "status": "Prompt updated"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-submit-reg.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-submit-reg.mdx
new file mode 100644
index 00000000000..90492fe4be2
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-submit-reg.mdx
@@ -0,0 +1,68 @@
+---
+title: "A2P Registration"
+api: "POST https://api.bland.ai/v1/sms/register"
+description: "Learn how to register your A2P brand using our API. This guide covers all you need to know about making a POST request, including required parameters, error handling, and response expectations."
+---
+
+# Registering an A2P Brand via API
+
+This documentation provides detailed information on how to register an Application-to-Person (A2P) brand by making a POST request to our API. The process involves submitting your brand's details for registration and verification purposes.
+
+A2P Registration is required for _all_ businesses who wish to send SMS. There can be signifcant fines for any non compliant messages. A2P Registration can take 2 days -> 2 Weeks.
+
+## Endpoint
+
+`POST /api/registerA2PBrand`
+
+## Required Headers
+
+- `Authorization`: Your API key for authentication.
+
+## Request Parameters
+
+Your request should include a JSON body with the following parameters:
+
+- `businessName` (string): The legal name of your business.
+- `ein` (string): Your Employer Identification Number.
+- `vertical` (string): Industry vertical. Possible values include: "AUTOMOTIVE", "AGRICULTURE", "BANKING", "CONSTRUCTION", "CONSUMER", "EDUCATION", "ENGINEERING", "ENERGY", "OIL_AND_GAS", "FAST_MOVING_CONSUMER_GOODS", "FINANCIAL", "FINTECH", "FOOD_AND_BEVERAGE", "GOVERNMENT", "HEALTHCARE", "HOSPITALITY", "INSURANCE", "LEGAL", "MANUFACTURING", "MEDIA", "ONLINE", "PROFESSIONAL_SERVICES", "RAW_MATERIALS", "REAL_ESTATE", "RELIGION", "RETAIL", "JEWELRY", "TECHNOLOGY", "TELECOMMUNICATIONS", "TRANSPORTATION", "TRAVEL", "ELECTRONICS", "NOT_FOR_PROFIT"
+- `address` (string): The business address.
+- `city` (string): The city of your business.
+- `state` (string): The state of your business. Must be a valid US state code.
+- `postalCode` (string): The postal code of your business.
+- `country` (string): The country of your business.
+- `email` (string): The email address for your business.
+- `type` (string): Legal structure of the business. Possible values: "Partnership", "Limited Liability Corporation", "Co-operative", "Non-profit Corporation", "Corporation"
+- `website` (string): Your business's website URL.
+- `opt_in_info` (string): Information regarding opt-in procedures for your messaging service. EX: "Customers must explicitly consent on our website and during the phone call."
+- `messageSamples` (array): An array of three strings, each a sample message you plan to use.
+- `trusted_user` (object): An object containing details about the trusted user registering the brand. Includes `position`, `last_name`, `phone_number`, `first_name`, and `email`.
+
+Ex. of trusted_user obj:
+
+```json
+{
+ "position": "CEO" //must be C Suite or VP,
+ "last_name":"Smith",
+ "first_name":"John"
+}
+```
+
+## Error Handling
+
+Our API provides detailed error messages to help you understand what went wrong in case of a failure:
+
+- `400 Bad Request`: This response occurs if any required fields are missing in your request or if the state code is invalid. The response body will include a message specifying the missing or incorrect fields.
+- `500 Internal Server Error`: Indicates an unexpected error on the server side. The response body will contain an error message with more details.
+
+## Successful Response
+
+A successful request returns a `200 OK` status code with a JSON body containing a message indicating the registration was successful and any relevant data or identifiers related to the A2P brand registration.
+
+**\*Important\*\*** The Brand Registration can take several attempts and days to weeks to complete. This success only indicates we _submitted_ the registration correctly.
+
+```json
+{
+ "message": "A2P Brand registration successful.",
+ "data": {...}
+}
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-toggle-human.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-toggle-human.mdx
new file mode 100644
index 00000000000..29ffde4b9e7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-toggle-human.mdx
@@ -0,0 +1,35 @@
+---
+title: "Toggle SMS Reply Method"
+api: "POST https://api.bland.ai/v1/sms/toggle"
+description: "Turn on or off the AI replying for a given phone number."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The phone number to update.
+
+
+
+Turn human mode on or off.
+
+`true` means that the AI will _not_ reply.
+`false` means the AI will reply
+
+
+
+
+
+```json Response
+{
+ "status": "Turned human mode on"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-webhook-update.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-webhook-update.mdx
new file mode 100644
index 00000000000..ab26a1e2e26
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/sms-webhook-update.mdx
@@ -0,0 +1,30 @@
+---
+title: "Update SMS Webhook"
+api: "POST https://api.bland.ai/v1/sms/webhook/update"
+description: "Update the webhook for a given phone number."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to update.
+
+
+
+ The webhook to fire when an SMS is received.
+
+
+
+
+```json Response
+{
+ "status": "success"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts-id-disable.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts-id-disable.mdx
new file mode 100644
index 00000000000..a45ce161544
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts-id-disable.mdx
@@ -0,0 +1,46 @@
+---
+title: "Disable Subaccount"
+api: "POST https://api.bland.ai/v1/subaccounts/{subaccount_id}/disable"
+description: "Immediately disables a subaccount and transfers any remaining credits back to the parent account."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the subaccount to which you want to transfer credits.
+
+
+### Response
+
+
+ Whether the subaccount was successfully disabled.
+
+
+
+ The affected subaccount's unique identifier.
+
+
+
+ The amount of credits transferred back to the parent account.
+
+
+
+ The new balance of the parent account after the transfer.
+
+
+
+```json
+{
+ "status": "success",
+ "subaccount_id": "1234567890",
+ "transferred_amount": 1000,
+ "new_parent_balance": 5000
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts-id-rotate.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts-id-rotate.mdx
new file mode 100644
index 00000000000..a8c848294f7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts-id-rotate.mdx
@@ -0,0 +1,41 @@
+---
+title: "Rotate Subaccount API Key"
+api: "POST https://api.bland.ai/v1/subaccounts/{subaccount_id}/rotate"
+description: "Replace the API key of a subaccount with a new one."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the subaccount to which you want to transfer credits.
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ The affected subaccount's unique identifier.
+
+
+
+ The new API key for the subaccount.
+
+
+
+```json
+{
+ "status": "success",
+ "subaccount_id": "1234567890",
+ "api_key": "sub-sk-1234567890"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts-id-transfer.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts-id-transfer.mdx
new file mode 100644
index 00000000000..aaadf3f1534
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts-id-transfer.mdx
@@ -0,0 +1,50 @@
+---
+title: "Transfer Credit to a Subaccount"
+api: "POST https://api.bland.ai/v1/subaccounts/{subaccount_id}/transfer"
+description: "Transfer API credits from your account to a subaccount."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the subaccount to which you want to transfer credits.
+
+
+### Body
+
+
+ This many of your API credits will be transferred to the subaccount.
+
+ The balance must be a positive integer that is at least 1, and less than your current account balance.
+
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ The new balance of your account after the transfer.
+
+
+
+ The new balance of the subaccount after the transfer.
+
+
+
+```json
+{
+ "status": "success",
+ "new_parent_balance": 1200,
+ "new_subaccount_balance": 500
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts.mdx
new file mode 100644
index 00000000000..bd9010123eb
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/subaccounts.mdx
@@ -0,0 +1,70 @@
+---
+title: "Create Subaccount"
+api: "POST https://api.bland.ai/v1/subaccounts"
+description: "Provision a new subaccount with separate billing, access and usage."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ Moves a portion of your API credit balance to the newly created subaccount.
+
+ The balance must be a positive integer that is at least 10, and less than your current account balance.
+
+ Special per-minute pricing plans carry over automatically to the subaccount, while increased rate limits do not.
+
+ Unused credits can be reclaimed later with the subaccount's balance if needed.
+
+
+
+
+ The first name of the user who will be using the subaccount.
+
+
+
+ The last name of the user who will be using the subaccount.
+
+
+
+ Whether you will be able to log in to the subaccount through the Dev Portal at `app.bland.ai`.
+
+ This enables you to set up credit card information, view and monitor usage, and further manage the subaccount as needed.
+
+ The subaccount user will not be able to log into the Dev Portal unless you explicitly enable it by adding them as an Authorized User.
+
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ The unique identifier for the newly created subaccount.
+
+
+
+ The API key that the new subaccount can use to authenticate requests.
+
+ This is the only information that the subaccount user will need to start using the API.
+
+ Do not use this as an identifier for the subaccount, since it can be rotated.
+
+
+
+
+```json
+{
+ "status": "success",
+ "subaccount_id": "1234567890",
+ "subaccount_key": "sub-sk-1234567890"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/tools-tool-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/tools-tool-id.mdx
new file mode 100644
index 00000000000..5b17ec37b9a
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/tools-tool-id.mdx
@@ -0,0 +1,353 @@
+---
+title: "Update Custom Tool"
+api: "POST https://api.bland.ai/v1/tools/{tool_id}"
+description: "Change your Custom Tool's parameters and characteristics."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The ID of the Custom Tool you want to update.
+
+
+### Body
+
+
+ This is the name that the AI using the tool will see.
+
+ Some other internal tools are named `Speak`, `Wait`, `Transfer` and `Finish` - Custom Tools cannot share these names.
+
+ We've made a list of reserved words that can confuse the AI that cannot be included:
+ - `input`
+ - `speak`
+ - `transfer`
+ - `switch`
+ - `wait`
+ - `finish`
+ - `press`
+ - `button`
+ - `say`
+ - `pause`
+ - `record`
+ - `play`
+ - `dial`
+ - `hang`
+
+ Choosing too similar of names to the default tools could cause the AI to select the wrong one, so decriptive two to three-word names are preferred.
+
+
+
+
+ This is the description that the AI using the tool will see.
+
+ Describe the effect of what the tool does or any special instructions.
+
+ For reference, here are the default tools' descriptions:
+ - `Speak`: Talk to the person on the other end of the line
+ - `Press Buttons`: Presses buttons on phone. Each character is a different button.
+ - `Wait`: Wait and go silent for an extended period of time (only use if absolutely necessary).
+ - `Finish`: Say a goodbye message and end the call once completed.
+
+
+
+
+ This is the text that the AI will say while it uses the tool.
+
+ For example, if the tool is a "GenerateQuote" tool, the speech might be "Please wait while I get you your quote."
+
+ Since tools can be verbally interrupted, shorter messages that tell the user what the tool/AI are doing are best.
+
+ Special Note: You can have the AI dynamically generate speech by defining `input.speech` in the `input_schema`.
+
+
+
+```json
+{
+ "input_schema": {
+ "example": {
+ "speech": "Checking your account details right now John!",
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ },
+ "type": "object",
+ "properties": {
+ "speech": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ }
+ },
+ "required": ["speech", "name", "email"]
+ }
+}
+```
+
+
+
+
+
+
+ This is the endpoint of the external API that the tool will call.
+
+ It must begin with `https://` and be a valid URL.
+
+
+
+
+ This is the HTTP method that the tool will use to call the external API.
+
+ Valid options are `GET` and `POST`.
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ These are the headers that the tool will send to the external API.
+
+ The headers must be in JSON format.
+
+ Since prompt variables are supported, you can use them in the headers to send dynamic information to the external API.
+
+
+
+```json
+// At the top level of your send call request you can define variables that you can access later using the double curly braces/dot syntax.
+{
+ "request_data": {
+ "api_key": "sk-1234567890"
+ },
+ "tools": [
+ {
+ "headers": {
+ "Authorization": "Bearer {{api_key}}"
+ }
+ }
+ ]
+}
+```
+
+
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ This is the body that the tool will send to the external API.
+
+ The body must be in JSON format.
+
+ This is the most common place to use Prompt Variables with AI input.
+
+ Note: `GET` requests do not have a body.
+
+
+
+```json
+ // AI-generated input is created as the `input` Prompt Variable - and the structure is defined by the input schema.
+ // `input` will match the structure of `input_schema.example` if it is defined.
+ {
+ "input_schema": {
+ "example": {
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ }
+ }
+ "body": {
+ "name": "{{input.name}}",
+ "email": "{{input.email}}"
+ }
+ }
+```
+
+
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ Append query parameters to the URL.
+
+ The query must be in JSON format.
+
+ This is generally used with GET requests and built-in Prompt Variables like `"{{phone_number}}"` or `"{{call_id}}"`.
+
+
+
+```json
+// appends ?pn={{phone_number}}&callId={{call_id}} to the URL
+{
+ "query": {
+ "pn": "{{phone_number}}",
+ "callId": "{{call_id}}"
+ }
+}
+```
+
+
+
+
+
+
+ This is the schema that the AI input must match for the tool to be used.
+
+ The schema must be in JSON format.
+
+ The schema is used to validate the AI input before the tool is used.
+
+ If the AI input does not match the schema, the tool will not be used and the AI will move on to the next tool.
+
+ `input_schema.example` can be used to enhance the AI's understanding of the input structure and helps significantly with structured or nested data.
+
+ Special Note: `input_schema` does not require strict JSON schema structure, and creativity is encouraged.
+
+ [Look here for a general guide on JSON schema structures.](https://json-schema.org/learn/getting-started-step-by-step)
+
+ Non-traditional JSON schema structures are supported as well, like these examples:
+ - "options": "monday, wednesday, friday"
+ - "date": "YYYY-MM-DD"
+ - "time": "HH:MM:SS (AM|PM)"
+ - "phone_number": "+1XXX-XXX-XXXX"
+
+ Agent input can be nested, and the will be transformed into JSON even if it's initially a string.
+
+
+
+```json
+{
+ "input_schema": {
+ "example": {
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ },
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ }
+ },
+ "required": ["name", "email"]
+ },
+ // both of these methods are identical, since {{input}} will be transformed into JSON
+ "body": "{{input}}",
+ "body": {
+ "name": "{{input.name}}",
+ "email": "{{input.email}}"
+ }
+}
+```
+
+
+
+
+
+
+ Define how you would like to extract data from the response.
+
+ By default, the entire response body is stored in the `{{data}}` Prompt Variable.
+
+ The path to the data you want must be in JSON Path format. Generally this means using dot notation to traverse the JSON object and is only required if you need to use that information on other tools or the response is too large.
+
+ Example:
+
+```json
+ // If the external API response is:
+ {
+ "available_times": [
+ {
+ "time": "10:00 AM",
+ "date": "2022-01-01"
+ },
+ {
+ "time": "11:00 AM",
+ "date": "2022-01-01"
+ }
+ ],
+ "store_hours": {
+ "open": "9:00 AM",
+ "close": "5:00 PM"
+ },
+ "address_info": {
+ "street": "123 Main St",
+ "city": "Anytown",
+ "state": "CA",
+ "zip": "12345"
+ }
+ }
+
+ // You can extract new Prompt Variables like this:
+ {
+ "response": {
+ "available_times": "$.available_times",
+ "store_hours": "$.store_hours",
+ "address_info": "$.address_info",
+ "zip_code": "$.address_info.zip"
+ }
+ }
+
+ // And then it'll automatically replace them elsewhere (like in the `task`/`prompt`)
+ {
+ "task": "The store is open from {{store_hours.open}} to {{store_hours.close}}.",
+ "prompt": "The store is located at {{address_info.street}}, {{address_info.city}}, {{address_info.state}} {{zip_code}}."
+ }
+```
+
+
+
+
+ This is the maximum time in milliseconds that the tool will wait for a response from the external API.
+
+ If the external API does not respond within this time, the tool will fail and the AI will move on to the next tool.
+
+ The default timeout is 10 seconds (10000 milliseconds).
+
+ To always wait for a response, set the timeout to an extremely high value like 99999999.
+
+
+
+### Response
+
+
+ Whether the tool creation succeeded.
+
+
+
+ A tool id that you can use to reference the tool in the future.
+
+ In a Send Call request, you could pass this tool id in instead of the full Custom Tool object like so:
+
+ ```json
+ {
+ "tools": [
+ "TL-1234567890" // tool_id (instead of the full Custom Tool object)
+ ]
+ }
+ ```
+
+
+
+
+```json
+{
+ "status": "success",
+ "tool_id": "TL-1234567890"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/tools.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/tools.mdx
new file mode 100644
index 00000000000..1024f820c77
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/tools.mdx
@@ -0,0 +1,347 @@
+---
+title: "Create a Custom Tool"
+api: "POST https://api.bland.ai/v1/tools"
+description: "Create a Custom Tool that can take AI input and call external APIs."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ This is the name that the AI using the tool will see.
+
+ Some other internal tools are named `Speak`, `Wait`, `Transfer` and `Finish` - Custom Tools cannot share these names.
+
+ We've made a list of reserved words that can confuse the AI that cannot be included:
+ - `input`
+ - `speak`
+ - `transfer`
+ - `switch`
+ - `wait`
+ - `finish`
+ - `press`
+ - `button`
+ - `say`
+ - `pause`
+ - `record`
+ - `play`
+ - `dial`
+ - `hang`
+
+ Choosing too similar of names to the default tools could cause the AI to select the wrong one, so decriptive two to three-word names are preferred.
+
+
+
+
+ This is the description that the AI using the tool will see.
+
+ Describe the effect of what the tool does or any special instructions.
+
+ For reference, here are the default tools' descriptions:
+ - `Speak`: Talk to the person on the other end of the line
+ - `Press Buttons`: Presses buttons on phone. Each character is a different button.
+ - `Wait`: Wait and go silent for an extended period of time (only use if absolutely necessary).
+ - `Finish`: Say a goodbye message and end the call once completed.
+
+
+
+
+ This is the text that the AI will say while it uses the tool.
+
+ For example, if the tool is a "GenerateQuote" tool, the speech might be "Please wait while I get you your quote."
+
+ Since tools can be verbally interrupted, shorter messages that tell the user what the tool/AI are doing are best.
+
+ Special Note: You can have the AI dynamically generate speech by defining `input.speech` in the `input_schema`.
+
+
+
+```json
+{
+ "input_schema": {
+ "example": {
+ "speech": "Checking your account details right now John!",
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ },
+ "type": "object",
+ "properties": {
+ "speech": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ }
+ },
+ "required": ["speech", "name", "email"]
+ }
+}
+```
+
+
+
+
+
+
+ This is the endpoint of the external API that the tool will call.
+
+ It must begin with `https://` and be a valid URL.
+
+
+
+
+ This is the HTTP method that the tool will use to call the external API.
+
+ Valid options are `GET` and `POST`.
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ These are the headers that the tool will send to the external API.
+
+ The headers must be in JSON format.
+
+ Since prompt variables are supported, you can use them in the headers to send dynamic information to the external API.
+
+
+
+```json
+// At the top level of your send call request you can define variables that you can access later using the double curly braces/dot syntax.
+{
+ "request_data": {
+ "api_key": "sk-1234567890"
+ },
+ "tools": [
+ {
+ "headers": {
+ "Authorization": "Bearer {{api_key}}"
+ }
+ }
+ ]
+}
+```
+
+
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ This is the body that the tool will send to the external API.
+
+ The body must be in JSON format.
+
+ This is the most common place to use Prompt Variables with AI input.
+
+ Note: `GET` requests do not have a body.
+
+
+
+```json
+ // AI-generated input is created as the `input` Prompt Variable - and the structure is defined by the input schema.
+ // `input` will match the structure of `input_schema.example` if it is defined.
+ {
+ "input_schema": {
+ "example": {
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ }
+ }
+ "body": {
+ "name": "{{input.name}}",
+ "email": "{{input.email}}"
+ }
+ }
+```
+
+
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ Append query parameters to the URL.
+
+ The query must be in JSON format.
+
+ This is generally used with GET requests and built-in Prompt Variables like `"{{phone_number}}"` or `"{{call_id}}"`.
+
+
+
+```json
+// appends ?pn={{phone_number}}&callId={{call_id}} to the URL
+{
+ "query": {
+ "pn": "{{phone_number}}",
+ "callId": "{{call_id}}"
+ }
+}
+```
+
+
+
+
+
+
+ This is the schema that the AI input must match for the tool to be used.
+
+ The schema must be in JSON format.
+
+ The schema is used to validate the AI input before the tool is used.
+
+ If the AI input does not match the schema, the tool will not be used and the AI will move on to the next tool.
+
+ `input_schema.example` can be used to enhance the AI's understanding of the input structure and helps significantly with structured or nested data.
+
+ Special Note: `input_schema` does not require strict JSON schema structure, and creativity is encouraged.
+
+ [Look here for a general guide on JSON schema structures.](https://json-schema.org/learn/getting-started-step-by-step)
+
+ Non-traditional JSON schema structures are supported as well, like these examples:
+ - "options": "monday, wednesday, friday"
+ - "date": "YYYY-MM-DD"
+ - "time": "HH:MM:SS (AM|PM)"
+ - "phone_number": "+1XXX-XXX-XXXX"
+
+ Agent input can be nested, and the will be transformed into JSON even if it's initially a string.
+
+
+
+```json
+{
+ "input_schema": {
+ "example": {
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ },
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ }
+ },
+ "required": ["name", "email"]
+ },
+ // both of these methods are identical, since {{input}} will be transformed into JSON
+ "body": "{{input}}",
+ "body": {
+ "name": "{{input.name}}",
+ "email": "{{input.email}}"
+ }
+}
+```
+
+
+
+
+
+
+ Define how you would like to extract data from the response.
+
+ By default, the entire response body is stored in the `{{data}}` Prompt Variable.
+
+ The path to the data you want must be in JSON Path format. Generally this means using dot notation to traverse the JSON object and is only required if you need to use that information on other tools or the response is too large.
+
+ Example:
+
+```json
+ // If the external API response is:
+ {
+ "available_times": [
+ {
+ "time": "10:00 AM",
+ "date": "2022-01-01"
+ },
+ {
+ "time": "11:00 AM",
+ "date": "2022-01-01"
+ }
+ ],
+ "store_hours": {
+ "open": "9:00 AM",
+ "close": "5:00 PM"
+ },
+ "address_info": {
+ "street": "123 Main St",
+ "city": "Anytown",
+ "state": "CA",
+ "zip": "12345"
+ }
+ }
+
+ // You can extract new Prompt Variables like this:
+ {
+ "response": {
+ "available_times": "$.available_times",
+ "store_hours": "$.store_hours",
+ "address_info": "$.address_info",
+ "zip_code": "$.address_info.zip"
+ }
+ }
+
+ // And then it'll automatically replace them elsewhere (like in the `task`/`prompt`)
+ {
+ "task": "The store is open from {{store_hours.open}} to {{store_hours.close}}.",
+ "prompt": "The store is located at {{address_info.street}}, {{address_info.city}}, {{address_info.state}} {{zip_code}}."
+ }
+```
+
+
+
+
+ This is the maximum time in milliseconds that the tool will wait for a response from the external API.
+
+ If the external API does not respond within this time, the tool will fail and the AI will move on to the next tool.
+
+ The default timeout is 10 seconds (10000 milliseconds).
+
+ To always wait for a response, set the timeout to an extremely high value like 99999999.
+
+
+
+### Response
+
+
+ Whether the tool creation succeeded.
+
+
+
+ A tool id that you can use to reference the tool in the future.
+
+ In a Send Call request, you could pass this tool id in instead of the full Custom Tool object like so:
+
+ ```json
+ {
+ "tools": [
+ "TL-1234567890" // tool_id (instead of the full Custom Tool object)
+ ]
+ }
+ ```
+
+
+
+
+```json
+{
+ "status": "success",
+ "tool_id": "TL-1234567890"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/voices-id-sample.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/voices-id-sample.mdx
new file mode 100644
index 00000000000..21083ce2959
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/api-v1/post/voices-id-sample.mdx
@@ -0,0 +1,45 @@
+---
+title: "Generate Audio Sample"
+api: "POST https://api.bland.ai/v1/voices/{id}/sample"
+description: "Generate an audio sample for a voice."
+---
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The ID of the voice to generate the audio sample for, or it's name (like "maya").
+
+
+### Request Body
+
+
+ The text content to be spoken in the voice sample.
+
+Character limit: `200` characters.
+
+
+
+
+ Alternate `voice_settings` can be passed in to override the preset's default settings.
+
+
+
+ The language of the text content. Default is `ENG`.
+
+Some other language codes: "ESP", "GER", "FRE"
+
+
+
+### Response
+
+
+ The generated audio file of the spoken text using the specified or overridden voice preset settings.
+
+
+```json (Generated audio file) ```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/application-portal.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/application-portal.png
new file mode 100644
index 00000000000..d575bc8b4cf
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/application-portal.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/developerportal.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/developerportal.png
new file mode 100644
index 00000000000..c906cdfd631
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/developerportal.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/development.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/development.mdx
new file mode 100644
index 00000000000..41052c0af15
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/development.mdx
@@ -0,0 +1,92 @@
+---
+title: "Development"
+description: "Learn how to preview changes locally"
+---
+
+**Prerequisite** You should have installed Node.js (version 18.10.0 or higher).
+
+Step 1. Install Mintlify on your OS:
+
+
+
+```bash npm
+npm i -g mintlify
+```
+
+```bash yarn
+yarn global add mintlify
+```
+
+
+
+Step 2. Go to the docs are located (where you can find `mint.json`) and run the following command:
+
+```bash
+mintlify dev
+```
+
+The documentation website is now available at `http://localhost:3000`.
+
+### Custom Ports
+
+Mintlify uses port 3000 by default. You can use the `--port` flag to customize the port Mintlify runs on. For example, use this command to run in port 3333:
+
+```bash
+mintlify dev --port 3333
+```
+
+You will see an error like this if you try to run Mintlify in a port that's already taken:
+
+```md
+Error: listen EADDRINUSE: address already in use :::3000
+```
+
+## Mintlify Versions
+
+Each CLI is linked to a specific version of Mintlify. Please update the CLI if your local website looks different than production.
+
+
+
+```bash npm
+npm i -g mintlify@latest
+```
+
+```bash yarn
+yarn global upgrade mintlify
+```
+
+
+
+## Deployment
+
+Unlimited editors available under the [Startup Plan](https://mintlify.com/pricing)
+
+You should see the following if the deploy successfully went through:
+
+
+
+
+
+## Troubleshooting
+
+Here's how to solve some common problems when working with the CLI.
+
+
+
+ Update to Node v18. Run `mintlify install` and try again.
+
+
+Go to the `C:/Users/Username/.mintlify/` directory and remove the `mint`
+folder. Then Open the Git Bash in this location and run `git clone
+https://github.com/mintlify/mint.git`.
+
+Repeat step 3.
+
+
+
+ Try navigating to the root of your device and delete the ~/.mintlify folder.
+ Then run `mintlify dev` again.
+
+
+
+Curious about what changed in a CLI version? [Check out the CLI changelog.](/changelog/command-line)
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/bring-your-own-twilio.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/bring-your-own-twilio.mdx
new file mode 100644
index 00000000000..3c1fa6163d9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/bring-your-own-twilio.mdx
@@ -0,0 +1,13 @@
+---
+title: Bring your own Twilio
+---
+
+Enterprise customers can create and connect their own Twilio account to Bland.
+
+Features include:
+
+1. Full ownership of telephony infrastructure
+2. Ability to connect to existing telephony infrastructure
+3. Closer control of spam risk and any discounted rates already included on the account
+
+Reach out for enterprise access, here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/custom-llm.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/custom-llm.mdx
new file mode 100644
index 00000000000..198aa7847ae
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/custom-llm.mdx
@@ -0,0 +1,35 @@
+---
+title: Fine-tuning & Custom LLMs
+---
+
+## Summary
+
+Bland will fine-tune a custom model for your enterprise using transcripts from succesful prior calls. Then Bland will host that LLM and provided dedicated infrastrucure to enable phone conversations with sub-second latency.
+
+Bland will also enable you to connect to a custom LLM & will host that LLM to drive latency down further.
+
+Get in touch here.
+
+## Background on fine-tuning
+
+Traditionally, most AI phone agents use private models from companies like OpenAI and Anthropic. Those LLMs are large, and perform best at following instructions and delivering high quality outputs. The downside, however, is they are very slow. Additionally, because they're general models, their personality, tone, and overall capabilities are limited.
+
+Conversely, open source models generally perform worse at a broad range of tasks. However, by fine-tuning an open-source model with examples of a given task, you can significantly improve it's performance at that task, even surpassing the capabilties of top-of-the-line models like GPT-4.
+
+## How do I fine-tune with Bland?
+
+To inquire about fine-tuning connect with the Bland team here.
+
+During the initial conversation you will discuss:
+
+1. The format of data we'll require
+2. How long fine-tuning will take (typically one week)
+3. Pricing (typically under five figures)
+
+## How do I bring my own LLM?
+
+The Bland team will advise on connection method, requirements for the connection, etc.
+
+Typically takes under 24 hours to set up after kickoff.
+
+Inquire here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/custom-tts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/custom-tts.mdx
new file mode 100644
index 00000000000..489ebcfd7ad
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/custom-tts.mdx
@@ -0,0 +1,9 @@
+---
+title: Custom languages & voices
+---
+
+Enterprise customers can bring their own TTS service or work with Bland's engineering team to configure higher quality voice clones.
+
+Enterprise customers can also request foreign languages like German, Spanish, Italian, and Portoguese, and Bland's engineering team will set up different transcription and TTS to accomodate the request.
+
+Reach out for enterprise access, here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/custom-twilio.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/custom-twilio.mdx
new file mode 100644
index 00000000000..c6e3cbdc3e1
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/custom-twilio.mdx
@@ -0,0 +1,51 @@
+---
+title: "Custom Twilio Integration"
+description: "Connect Bland to your own Twilio account"
+---
+
+## Overview
+
+Enterprise customers can connect their own Twilio account to Bland. Easily bring over your existing phone numbers, integrations, and more.
+
+Pre-requisites:
+
+- Your own Twilio account
+- An [Enterprise plan](https://forms.default.com/361589) with Bland
+
+## Step 1: Creating an Encrypted Key with your Twilio Credentials
+
+1. Go to your [Twilio Console](https://www.twilio.com/console) and get your Account SID and Auth Token.
+2. Create an `encrypted_key` by [sending an API request](/api-v1/post/accounts) to Bland.
+
+This is the only time that your `encrypted_key` will be returned to you. Make sure to store it securely, and new keys will need to be generated if lost.
+
+## Step 2: Using the Encrypted Key in Outbound Calls
+
+Include `encrypted_key` in the headers (in addition to the `Authorization` header) of your API requests, and we'll use that account's credentials to make the call.
+
+For example:
+
+```json
+{
+ "Authorization": "BLAND_API_KEY",
+ "encrypted_key": "YOUR_ENCRYPTED_KEY"
+}
+```
+
+Note:
+
+- You can set your `from` number in the API request - this will need to be a number owned by that Twilio account (and not one purchased through Bland).
+- By default, we'll send calls from a randomly selected number in the specified Twilio account if a `from` is not specified.
+
+## Step 3: Uploading Inbound numbers
+
+1. Go to your [Twilio Console](https://www.twilio.com/console) and get your Twilio phone number(s).
+2. Upload your numbers [through the API](/api-v1/post/inbound-insert).
+
+We'll validate that these numbers are owned by that account and add them to your Bland account.
+
+## Step 4: Configuring Inbound Numbers/Webhooks
+
+Note: When updating inbound numbers, the headers need to include the `encrypted_key` in addition to the `Authorization` header. Doing so makes sure the updates are applied to the correct Twilio account.
+
+Once you update an inbound number through the [Dev Portal](https://app.bland.ai) or [API](/api-v1/post/inbound-number-update), that number will be automatically configured to run on Bland's infrastructure. No additional steps are required!
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/enterprise-rate-limits.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/enterprise-rate-limits.mdx
new file mode 100644
index 00000000000..0cbd343e005
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/enterprise-rate-limits.mdx
@@ -0,0 +1,9 @@
+---
+title: Enterprise rate limits
+---
+
+By default, Bland customers can dispatch 1000 calls/day before hitting rate limits.
+
+Enterprise customers start at 20,000 calls per hour, and 100,000 calls per day.
+
+To raise your rate limits or discuss limits larger than what's offered on enterprise, reach out here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/unlimited-support.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/unlimited-support.mdx
new file mode 100644
index 00000000000..0b9cb05fae3
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/enterprise-features/unlimited-support.mdx
@@ -0,0 +1,13 @@
+---
+title: Unlimited support
+---
+
+Bland enterprise customers receive access to a shared slack channel with Bland's engineering team and founders. Enterprise customers also receive the founders phone numbers. Finally, for enterprise customers, the team strives to respond to every message in under five minutes, while maintaining a 24-hour SLA.
+
+Bland's engineers will guide on:
+
+1. Using features like `dynamic_data` and `custom_tools`
+2. Best practices for prompting & configuring the phone agent
+3. Making customizations (e.g. bring your own twilio, custom languages & voices, etc.)
+
+Reach out for enterprise access, here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/code.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/code.mdx
new file mode 100644
index 00000000000..371116115fb
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/code.mdx
@@ -0,0 +1,37 @@
+---
+title: "Code Blocks"
+description: "Display inline code and code blocks"
+icon: "code"
+---
+
+## Basic
+
+### Inline Code
+
+To denote a `word` or `phrase` as code, enclose it in backticks (`).
+
+```
+To denote a `word` or `phrase` as code, enclose it in backticks (`).
+```
+
+### Code Block
+
+Use [fenced code blocks](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) by enclosing code in three backticks and follow the leading ticks with the programming language of your snippet to get syntax highlighting. Optionally, you can also write the name of your code after the programming language.
+
+```java HelloWorld.java
+class HelloWorld {
+ public static void main(String[] args) {
+ System.out.println("Hello, World!");
+ }
+}
+```
+
+````md
+```java HelloWorld.java
+class HelloWorld {
+ public static void main(String[] args) {
+ System.out.println("Hello, World!");
+ }
+}
+```
+````
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/images.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/images.mdx
new file mode 100644
index 00000000000..e52bf9771e9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/images.mdx
@@ -0,0 +1,56 @@
+---
+title: "Images and Embeds"
+description: "Add image, video, and other HTML elements"
+icon: "image"
+---
+
+
+
+## Image
+
+### Using Markdown
+
+The [markdown syntax](https://www.markdownguide.org/basic-syntax/#images) lets you add images using the following code
+
+```md
+![title](/path/image.jpg)
+```
+
+Note that the image file size must be less than 5MB. Otherwise, we recommend hosting on a service like [Cloudinary](https://cloudinary.com/) or [S3](https://aws.amazon.com/s3/). You can then use that URL and embed.
+
+### Using Embeds
+
+To get more customizability with images, you can also use [embeds](/writing-content/embed) to add images
+
+```html
+
+```
+
+## Embeds and HTML elements
+
+
+
+
+
+
+
+Mintlify supports [HTML tags in Markdown](https://www.markdownguide.org/basic-syntax/#html). This is helpful if you prefer HTML tags to Markdown syntax, and lets you create documentation with infinite flexibility.
+
+
+
+### iFrames
+
+Loads another HTML page within the document. Most commonly used for embedding videos.
+
+```html
+
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/markdown.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/markdown.mdx
new file mode 100644
index 00000000000..01d5f8652f7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/markdown.mdx
@@ -0,0 +1,88 @@
+---
+title: "Markdown Syntax"
+description: "Text, title, and styling in standard markdown"
+icon: "text-size"
+---
+
+## Titles
+
+Best used for section headers.
+
+```md
+## Titles
+```
+
+### Subtitles
+
+Best use to subsection headers.
+
+```md
+### Subtitles
+```
+
+
+
+Each **title** and **subtitle** creates an anchor and also shows up on the table of contents on the right.
+
+
+
+## Text Formatting
+
+We support most markdown formatting. Simply add `**`, `_`, or `~` around text to format it.
+
+| Style | How to write it | Result |
+| ------------- | ----------------- | --------------- |
+| Bold | `**bold**` | **bold** |
+| Italic | `_italic_` | _italic_ |
+| Strikethrough | `~strikethrough~` | ~strikethrough~ |
+
+You can combine these. For example, write `**_bold and italic_**` to get **_bold and italic_** text.
+
+You need to use HTML to write superscript and subscript text. That is, add `` or `` around your text.
+
+| Text Size | How to write it | Result |
+| ----------- | ------------------------ | ---------------------- |
+| Superscript | `superscript` | superscript |
+| Subscript | `subscript` | subscript |
+
+## Linking to Pages
+
+You can add a link by wrapping text in `[]()`. You would write `[link to google](https://google.com)` to [link to google](https://google.com).
+
+Links to pages in your docs need to be root-relative. Basically, you should include the entire folder path. For example, `[link to text](/writing-content/text)` links to the page "Text" in our components section.
+
+Relative links like `[link to text](../text)` will open slower because we cannot optimize them as easily.
+
+## Blockquotes
+
+### Singleline
+
+To create a blockquote, add a `>` in front of a paragraph.
+
+> Dorothy followed her through many of the beautiful rooms in her castle.
+
+```md
+> Dorothy followed her through many of the beautiful rooms in her castle.
+```
+
+### Multiline
+
+> Dorothy followed her through many of the beautiful rooms in her castle.
+>
+> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood.
+
+```md
+> Dorothy followed her through many of the beautiful rooms in her castle.
+>
+> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood.
+```
+
+### LaTeX
+
+Mintlify supports [LaTeX](https://www.latex-project.org) through the Latex component.
+
+8 x (vk x H1 - H2) = (0,1)
+
+```md
+8 x (vk x H1 - H2) = (0,1)
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/navigation.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/navigation.mdx
new file mode 100644
index 00000000000..c08d564cf35
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/navigation.mdx
@@ -0,0 +1,66 @@
+---
+title: "Navigation"
+description: "The navigation field in mint.json defines the pages that go in the navigation menu"
+icon: "map"
+---
+
+The navigation menu is the list of links on every website.
+
+You will likely update `mint.json` every time you add a new page. Pages do not show up automatically.
+
+## Navigation syntax
+
+Our navigation syntax is recursive which means you can make nested navigation groups. You don't need to include `.mdx` in page names.
+
+
+
+```json Regular Navigation
+"navigation": [
+ {
+ "group": "Getting Started",
+ "pages": ["quickstart"]
+ }
+]
+```
+
+```json Nested Navigation
+"navigation": [
+ {
+ "group": "Getting Started",
+ "pages": [
+ "quickstart",
+ {
+ "group": "Nested Reference Pages",
+ "pages": ["nested-reference-page"]
+ }
+ ]
+ }
+]
+```
+
+
+
+## Folders
+
+Simply put your MDX files in folders and update the paths in `mint.json`.
+
+For example, to have a page at `https://yoursite.com/your-folder/your-page` you would make a folder called `your-folder` containing an MDX file called `your-page.mdx`.
+
+
+
+You cannot use `api` for the name of a folder unless you nest it inside another folder. Mintlify uses Next.js which reserves the top-level `api` folder for internal server calls. A folder name such as `api-reference` would be accepted.
+
+
+
+```json Navigation With Folder
+"navigation": [
+ {
+ "group": "Group Name",
+ "pages": ["your-folder/your-page"]
+ }
+]
+```
+
+## Hidden Pages
+
+MDX files not included in `mint.json` will not show up in the sidebar but are accessible through the search bar and by linking directly to them.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/settings.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/settings.mdx
new file mode 100644
index 00000000000..8525b5268eb
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/essentials/settings.mdx
@@ -0,0 +1,317 @@
+---
+title: "Global Settings"
+description: "Mintlify gives you complete control over the look and feel of your documentation using the mint.json file"
+icon: "gear"
+---
+
+Every Mintlify site needs a `mint.json` file with the core configuration settings. Learn more about the [properties](#properties) below.
+
+## Properties
+
+
+Name of your project. Used for the global title.
+
+Example: `mintlify`
+
+
+
+
+ An array of groups with all the pages within that group
+
+
+ The name of the group.
+
+ Example: `Settings`
+
+
+
+ The relative paths to the markdown files that will serve as pages.
+
+ Example: `["customization", "page"]`
+
+
+
+
+
+
+
+ Path to logo image or object with path to "light" and "dark" mode logo images
+
+
+ Path to the logo in light mode
+
+
+ Path to the logo in dark mode
+
+
+ Where clicking on the logo links you to
+
+
+
+
+
+ Path to the favicon image
+
+
+
+ Hex color codes for your global theme
+
+
+ The primary color. Used for most often for highlighted content, section headers, accents, in light mode
+
+
+ The primary color for dark mode. Used for most often for highlighted content, section headers, accents, in dark
+ mode
+
+
+ The primary color for important buttons
+
+
+ The color of the background in both light and dark mode
+
+
+ The hex color code of the background in light mode
+
+
+ The hex color code of the background in dark mode
+
+
+
+
+
+
+
+ Array of `name`s and `url`s of links you want to include in the topbar
+
+
+ The name of the button.
+
+ Example: `Contact us`
+
+
+ The url once you click on the button. Example: `https://mintlify.com/contact`
+
+
+
+
+
+
+
+
+ Link shows a button. GitHub shows the repo information at the url provided including the number of GitHub stars.
+
+
+ If `link`: What the button links to.
+
+ If `github`: Link to the repository to load GitHub information from.
+
+
+ Text inside the button. Only required if `type` is a `link`.
+
+
+
+
+
+
+ Array of version names. Only use this if you want to show different versions of docs with a dropdown in the navigation
+ bar.
+
+
+
+ An array of the anchors, includes the `icon`, `color`, and `url`.
+
+
+ The [Font Awesome](https://fontawesome.com/search?s=brands%2Cduotone) icon used to feature the anchor.
+
+ Example: `comments`
+
+
+ The name of the anchor label.
+
+ Example: `Community`
+
+
+ The start of the URL that marks what pages go in the anchor. Generally, this is the name of the folder you put your pages in.
+
+
+ The hex color of the anchor icon background. Can also be a gradient if you pass an object with the properties `from` and `to` that are each a hex color.
+
+
+ Used if you want to hide an anchor until the correct docs version is selected.
+
+
+ Pass `true` if you want to hide the anchor until you directly link someone to docs inside it.
+
+
+ One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin"
+
+
+
+
+
+
+ Override the default configurations for the top-most anchor.
+
+
+ The name of the top-most anchor
+
+
+ Font Awesome icon.
+
+
+ One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin"
+
+
+
+
+
+ An array of navigational tabs.
+
+
+ The name of the tab label.
+
+
+ The start of the URL that marks what pages go in the tab. Generally, this is the name of the folder you put your
+ pages in.
+
+
+
+
+
+ Configuration for API settings. Learn more about API pages at [API Components](/api-playground/demo).
+
+
+ The base url for all API endpoints. If `baseUrl` is an array, it will enable for multiple base url
+ options that the user can toggle.
+
+
+
+
+
+ The authentication strategy used for all API endpoints.
+
+
+ The name of the authentication parameter used in the API playground.
+
+ If method is `basic`, the format should be `[usernameName]:[passwordName]`
+
+
+ The default value that's designed to be a prefix for the authentication input field.
+
+ E.g. If an `inputPrefix` of `AuthKey` would inherit the default input result of the authentication field as `AuthKey`.
+
+
+
+
+
+ Configurations for the API playground
+
+
+
+ Whether the playground is showing, hidden, or only displaying the endpoint with no added user interactivity `simple`
+
+ Learn more at the [playground guides](/api-playground/demo)
+
+
+
+
+
+ Enabling this flag ensures that key ordering in OpenAPI pages matches the key ordering defined in the OpenAPI file.
+
+ This behavior will soon be enabled by default, at which point this field will be deprecated.
+
+
+
+
+
+
+ A string or an array of strings of URL(s) or relative path(s) pointing to your
+ OpenAPI file.
+
+ Examples:
+
+ ```json Absolute
+ "openapi": "https://example.com/openapi.json"
+ ```
+ ```json Relative
+ "openapi": "/openapi.json"
+ ```
+ ```json Multiple
+ "openapi": ["https://example.com/openapi1.json", "/openapi2.json", "/openapi3.json"]
+ ```
+
+
+
+
+
+ An object of social media accounts where the key:property pair represents the social media platform and the account url.
+
+ Example:
+ ```json
+ {
+ "twitter": "https://twitter.com/mintlify",
+ "website": "https://mintlify.com"
+ }
+ ```
+
+
+ One of the following values `website`, `facebook`, `twitter`, `discord`, `slack`, `github`, `linkedin`, `instagram`, `hacker-news`
+
+ Example: `twitter`
+
+
+ The URL to the social platform.
+
+ Example: `https://twitter.com/mintlify`
+
+
+
+
+
+ Configurations to enable feedback buttons
+
+
+
+ Enables a button to allow users to suggest edits via pull requests
+
+
+ Enables a button to allow users to raise an issue about the documentation
+
+
+
+
+
+ Customize the dark mode toggle.
+
+
+ Set if you always want to show light or dark mode for new users. When not
+ set, we default to the same mode as the user's operating system.
+
+
+ Set to true to hide the dark/light mode toggle. You can combine `isHidden` with `default` to force your docs to only use light or dark mode. For example:
+
+
+ ```json Only Dark Mode
+ "modeToggle": {
+ "default": "dark",
+ "isHidden": true
+ }
+ ```
+
+ ```json Only Light Mode
+ "modeToggle": {
+ "default": "light",
+ "isHidden": true
+ }
+ ```
+
+
+
+
+
+
+
+
+ A background image to be displayed behind every page. See example with [Infisical](https://infisical.com/docs) and
+ [FRPC](https://frpc.io).
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/examples/call.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/examples/call.mdx
new file mode 100644
index 00000000000..039740c8f7b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/examples/call.mdx
@@ -0,0 +1,144 @@
+---
+title: "Call an inbound lead"
+description: "Learn to use the `/call` endpoint to contact an inbound lead to your website"
+---
+
+
+
+## Introduction
+
+Imagine you're selling a service, online. Your website contains a contact form where potential customers can request a demo. You know deals will close way more often if you call leads within 5 minutes of their form submission. Unfortunately, you don't have enough hands on deck to make those calls yourself, so you've decided to automate those calls with an AI voice agent.
+
+In this example, we'll show you how to call your inbound leads with a personalized prompt. Let's get started!
+
+## Prompt for the phone call
+
+Your phone call prompt should be written as a [template string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) (a string that you can pass variables to). That way, you can insert the data captured from the form into your prompt.
+
+Here's what your prompt should look like (before you insert the data from the form).
+
+
+Your name is Matt, and you're an AI phone agent from Acme Inc. Whenever an inbound lead visits your website, you call them within five minutes. You're direct in your manner of speech. You never repeat yourself. You follow your script as tightly as possible to keep the call on track.
+
+Here's how the typical phone call progresses:
+
+1. You introduce yourself
+2. You ask qualification customers based on the customer type (startup, small business, enterprise)
+3. If the customer is qualified, you explain that you'll text them a scheduling link right after the call
+4. You end the phone call
+
+**Example dialogue**
+
+You: Hello!
+
+Person: Hi, who is this?
+
+You: Hi, this is Matt from Acme Inc. We specialize in professional window washing services. Is this `${first_name}` I'm speaking with?
+
+Person: Hi, yes it is. Nice to meet you Matt.
+
+You: Nice to meet you too, `${first_name}`. I'm calling to learn a bit about your needs regarding window cleaning. You're seeking services for a `${business_type}`, is that right?
+
+Person: Yes, that's right
+
+You: Great, thanks for sharing that. `${business_type}` are a key focus for us. Can you tell me more about your premises? How many windows or floors are we talking about?
+
+Person: We have a two-story building with quite a few windows.
+
+You: Sounds like something we can definitely help with. How often do you currently have your windows cleaned?
+
+Person: We haven't had a regular service; it's been a bit sporadic.
+
+You: Understood. Regular cleaning can really enhance the appearance and light in your workspace. What's prompting you to consider a regular service now?
+
+Person: We want to maintain a more professional look consistently.
+
+You: That makes sense. Maintaining a professional appearance is important. Regarding timelines, when would you ideally like to start the service?
+
+Person: As soon as possible, really.
+
+You: Perfect, we can certainly work with that. Lastly, if we find a solution that fits your needs, are you the decision-maker regarding this service, or is there someone else we should also speak with?
+
+Person: I'm the one handling this, so it's my call.
+
+You: Great! I can send you a link to our scheduling system so you can choose a time that works best for you. We can then come over for an assessment and provide a detailed quote. Does that sound good?
+
+Person: Yes, that works for me.
+
+You: Fantastic, I'll text you the link right away. Thanks for your time, `${first_name}`. We look forward to potentially working with you.
+
+Person: Thank you, Matt. Looking forward to it.
+
+
+
+Did you notice how detailed the prompt is? It provides so much context, and explains what character the AI phone agent is playing, why it's playing it, how it should speak, how the call should progress, and even provides an example dialogue.
+
+Now, check out what the prompt looks like after we insert the form variables.
+
+
+Your name is Matt, and you're an AI phone agent from Acme Inc. Whenever an inbound lead visits your website, you call them within five minutes. You're direct in your manner of speech. You never repeat yourself. You follow your script as tightly as possible to keep the call on track.
+
+Here's how the typical phone call progresses:
+
+1. You introduce yourself
+2. You ask qualification customers based on the customer type (startup, small business, enterprise)
+3. If the customer is qualified, you explain that you'll text them a scheduling link right after the call
+4. You end the phone call
+
+**Example dialogue**
+
+You: Hello!
+
+Person: Hi, who is this?
+
+You: Hi, this is Matt from Acme Inc. We specialize in professional window washing services. Is this Jordan I'm speaking with?
+
+Person: Hi, yes it is. Nice to meet you Matt.
+
+You: Nice to meet you too, Jordan. I'm calling to learn a bit about your needs regarding window cleaning. You're seeking services for a small business, is that right?
+
+Person: Yes, that's right
+
+You: Great, thanks for sharing that. Small businesses are a key focus for us. Can you tell me more about your premises? How many windows or floors are we talking about?
+
+Person: We have a two-story building with quite a few windows.
+
+You: Sounds like something we can definitely help with. How often do you currently have your windows cleaned?
+
+Person: We haven't had a regular service; it's been a bit sporadic.
+
+You: Understood. Regular cleaning can really enhance the appearance and light in your workspace. What's prompting you to consider a regular service now?
+
+Person: We want to maintain a more professional look consistently.
+
+You: That makes sense. Maintaining a professional appearance is important. Regarding timelines, when would you ideally like to start the service?
+
+Person: As soon as possible, really.
+
+You: Perfect, we can certainly work with that. Lastly, if we find a solution that fits your needs, are you the decision-maker regarding this service, or is there someone else we should also speak with?
+
+Person: I'm the one handling this, so it's my call.
+
+You: Great! I can send you a link to our scheduling system so you can choose a time that works best for you. We can then come over for an assessment and provide a detailed quote. Does that sound good?
+
+Person: Yes, that works for me.
+
+You: Fantastic, I'll text you the link right away. Thanks for your time, Jordan. We look forward to potentially working with you.
+
+Person: Thank you, Matt. Looking forward to it.
+
+
+
+## Customizing the phone agent
+
+In this case, our phone agent's name is Matt. So we'll use a male voice.
+
+Note, by default, the voice latency parameter `reduce_latency` is set to `true`. And the default `voice_id` is `0` (a male voice). Therefore, we'll just use the default voice settings.
+
+For clarity's sake, we'll include those in our code example anyone.
+
+## Code example
+
+The code example is present on the right hand section of this page. You can copy it, either in Javascript or Python.
+
+Have additional questions? Want to see other use cases? Join our [discord community](https://discord.gg/QvxDz8zcKe)!
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/examples/inboundlead.jpg b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/examples/inboundlead.jpg
new file mode 100644
index 00000000000..b9407a1a297
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/examples/inboundlead.jpg differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/favicon.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/favicon.png
new file mode 100644
index 00000000000..84c7348cbfb
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/favicon.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/featured-guides/bland-and-botpress.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/featured-guides/bland-and-botpress.mdx
new file mode 100644
index 00000000000..e066964be12
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/featured-guides/bland-and-botpress.mdx
@@ -0,0 +1,23 @@
+---
+title: Bland & Botpress
+---
+
+## Overview
+
+The integration process involves several key steps, starting with setting up your Botpress server and configuring your Bland AI account to ensure both platforms can communicate effectively. You'll learn how to authenticate your Botpress instance with Bland AI, send dynamic data (like phone numbers and intents) from chatbot conversations to Bland AI, and initiate voice calls based on user inputs or specific triggers within your chatbot workflows. **This guide is also a great way for no-coders to deploy a bland AI project easily, with little to no coding experience.**
+
+This guide will cover:
+
+1. Setting Up Botpress: Instructions on preparing your Botpress environment for integration, including installation and basic configuration.
+2. Configuring Bland AI: How to set up your Bland AI account, obtain necessary API keys, and understand the API's capabilities related to voice interactions.
+3. Integration Workflow: Step-by-step guidance on creating workflows in Botpress that interact with Bland AI's API, focusing on initiating voice calls to user-provided numbers.
+4. Testing and Troubleshooting: Tips for testing your integrated solution to ensure it works as expected and troubleshooting common issues that may arise during the integration process.
+5. Advanced Use Cases: Ideas and examples for leveraging this integration to create innovative chatbot applications that blend chat and voice interactions in unique and valuable ways.
+
+## Getting started
+
+[Read the entire guide](https://docs.google.com/document/d/1zn-89jYvpS238bQvp0XEfdV-s_txVlJIHrfIFhpNcJ4).
+
+## About Nort Labs
+
+Nort Labs is an agency that leverages AI technology to create bespoke marketing, design, and automation solutions for their customers. You can learn more about Nort's services by visitng their [website](https://nortlabs.com/).
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/images/checks-passed.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/images/checks-passed.png
new file mode 100644
index 00000000000..3303c773646
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/images/checks-passed.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/images/hero-light.svg b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/images/hero-light.svg
new file mode 100644
index 00000000000..37b401ccac4
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/images/hero-light.svg
@@ -0,0 +1,9 @@
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/logo.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/logo.png
new file mode 100644
index 00000000000..6790583be04
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/logo.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/logo/dark.svg b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/logo/dark.svg
new file mode 100644
index 00000000000..485b0131bcc
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/logo/dark.svg
@@ -0,0 +1,10 @@
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/logo/light.svg b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/logo/light.svg
new file mode 100644
index 00000000000..3334add5829
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/logo/light.svg
@@ -0,0 +1,10 @@
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/mint.json b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/mint.json
new file mode 100644
index 00000000000..2e4fc996204
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/mint.json
@@ -0,0 +1,230 @@
+{
+ "$schema": "https://mintlify.com/schema.json",
+ "name": "Bland AI",
+ "logo": {
+ "dark": "/logo/dark.svg",
+ "light": "/logo/light.svg"
+ },
+ "favicon": "/logo.png",
+ "colors": {
+ "primary": "#6D64EF",
+ "light": "#847AF9",
+ "dark": "#0b0a18",
+ "background": {
+ "dark": "#0A141B"
+ },
+ "anchors": {
+ "from": "#847AF9",
+ "to": "#847AF9"
+ }
+ },
+ "topbarLinks": [
+ {
+ "name": "Support",
+ "url": "mailto:hello@bland.ai"
+ }
+ ],
+ "topbarCtaButton": {
+ "name": "GET YOUR KEYS",
+ "url": "https://app.bland.ai"
+ },
+ "tabs": [
+ {
+ "name": "V1 API Reference",
+ "url": "api-v1"
+ }
+ ],
+ "anchors": [
+ {
+ "name": "Community & Support",
+ "icon": "discord",
+ "url": "https://discord.gg/QvxDz8zcKe"
+ },
+ {
+ "name": "Blog",
+ "icon": "newspaper",
+ "url": "https://www.bland.ai/blog"
+ },
+ {
+ "name": "AMHLB Prompting Guide",
+ "icon": "file",
+ "url": "https://docs.google.com/document/d/19JVeaM3c9a0JzsjsnzaZ2BOoBve4IeWx-fARDAgaEm8/edit"
+ },
+ {
+ "name": "Full Code Examples",
+ "icon": "github",
+ "url": "https://github.com/Bland-AI/Bland-AI-Cookbooks/tree/main"
+ },
+ {
+ "name": "Zapier No-code integration",
+ "icon": "bolt",
+ "url": "https://zapier.com/apps/bland-ai/integrations"
+ },
+ {
+ "name": "Enterprise inquiries",
+ "icon": "building",
+ "url": "https://forms.default.com/361589"
+ }
+ ],
+ "navigation": [
+ {
+ "group": "Get Started",
+ "pages": ["welcome-to-bland", "starter-guide"]
+ },
+ {
+ "group": "Bland Enterprise",
+ "pages": [
+ "enterprise-features/custom-twilio",
+ "enterprise-features/custom-llm",
+ "enterprise-features/unlimited-support",
+ "enterprise-features/custom-tts",
+ "enterprise-features/bring-your-own-twilio",
+ "enterprise-features/enterprise-rate-limits"
+ ]
+ },
+ {
+ "group": "Featured guides",
+ "pages": ["featured-guides/bland-and-botpress"]
+ },
+ {
+ "group": "Basic Tutorials",
+ "pages": [
+ "tutorials/pathways",
+ "tutorials/custom-tools",
+ "tutorials/send-first-call",
+ "tutorials/webhook-signing",
+ "tutorials/send-1000-calls-at-once",
+ "tutorials/dynamic-data",
+ "tutorials/max-duration",
+ "tutorials/live-transfer",
+ "tutorials/webhooks"
+ ]
+ },
+ {
+ "group": "Basic",
+ "pages": ["api-v1/post/calls-simple", "api-v1/post/calls-simple-pathway"]
+ },
+ {
+ "group": "Calls",
+ "pages": [
+ "api-v1/post/calls",
+ "api-v1/post/calls-id-analyze",
+ "api-v1/post/calls-id-stop",
+ "api-v1/get/calls",
+ "api-v1/get/calls-id",
+ "api-v1/get/calls-id-recording",
+ "api-v1/get/calls-corrected-transcript"
+ ]
+ },
+ {
+ "group": "Web Agents",
+ "pages": [
+ "api-v1/post/agents",
+ "api-v1/post/agents-id",
+ "api-v1/post/agents-id-authorize",
+ "api-v1/post/agents-id-delete",
+ "api-v1/get/agents"
+ ]
+ },
+ {
+ "group": "Inbound Numbers",
+ "pages": [
+ "api-v1/post/inbound-purchase",
+ "api-v1/post/inbound-number-update",
+ "api-v1/get/inbound",
+ "api-v1/get/inbound-number"
+ ]
+ },
+ {
+ "group": "Outbound Numbers",
+ "pages": ["api-v1/post/outbound-purchase", "api-v1/get/outbound"]
+ },
+ {
+ "group": "Voices",
+ "pages": ["api-v1/get/voices", "api-v1/get/voices-id", "api-v1/post/voices-id-sample"]
+ },
+ {
+ "group": "Custom Tools",
+ "pages": ["api-v1/post/tools", "api-v1/post/tools-tool-id", "api-v1/get/tools", "api-v1/get/tools-tool-id"]
+ },
+ {
+ "group": "Custom Twilio Accounts",
+ "pages": [
+ "api-v1/post/accounts",
+ "api-v1/post/accounts-delete",
+ "api-v1/post/inbound-insert",
+ "api-v1/post/inbound-number-delete"
+ ]
+ },
+ {
+ "group": "Subaccounts",
+ "pages": [
+ "api-v1/post/subaccounts",
+ "api-v1/post/subaccounts-id-transfer",
+ "api-v1/post/subaccounts-id-rotate",
+ "api-v1/post/subaccounts-id-disable",
+ "api-v1/get/subaccounts",
+ "api-v1/get/subaccounts-id"
+ ]
+ },
+ {
+ "group": "Batches",
+ "pages": [
+ "api-v1/post/batches",
+ "api-v1/post/batches-id-analyze",
+ "api-v1/post/batches-id-stop",
+ "api-v1/get/batches",
+ "api-v1/get/batches-id",
+ "api-v1/get/batches-id-analysis"
+ ]
+ },
+ {
+ "group": "Primary Endpoints",
+ "pages": [
+ "api-reference/endpoint/call",
+ "api-reference/endpoint/logs",
+ "api-reference/endpoint/hold",
+ "api-reference/endpoint/end",
+ "api-reference/endpoint/dynamic_validate",
+ "api-reference/endpoint/purchase",
+ "api-reference/endpoint/inbound_prompt",
+ "api-reference/endpoint/recording"
+ ]
+ },
+ {
+ "group": "Batch Endpoints",
+ "pages": [
+ "api-reference/batch-endpoint/batch",
+ "api-reference/batch-endpoint/batch_get",
+ "api-reference/batch-endpoint/batches_get",
+ "api-reference/batch-endpoint/batch_stop",
+ "api-reference/batch-endpoint/end_batches"
+ ]
+ },
+ {
+ "group": "SMS",
+ "pages": [
+ "api-v1/post/sms-submit-reg",
+ "api-v1/post/sms-check-registration",
+ "api-v1/post/sms-prompt-update",
+ "api-v1/post/sms-analyze",
+ "api-v1/post/sms-get-messages",
+ "api-v1/post/sms-toggle-human",
+ "api-v1/post/sms-webhook-update"
+ ]
+ },
+ {
+ "group": "Account",
+ "pages": ["api-v1/get/me"]
+ },
+ {
+ "group": "Hold Endpoint",
+ "pages": ["api-reference/hold-endpoint/hold"]
+ }
+ ],
+ "footerSocials": {
+ "twitter": "https://twitter.com/usebland",
+ "linkedin": "https://www.linkedin.com/company/bland-ai/",
+ "discord": "https://discord.gg/QvxDz8zcKe"
+ }
+}
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/quickstart.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/quickstart.mdx
new file mode 100644
index 00000000000..a3ece360a6f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/quickstart.mdx
@@ -0,0 +1,67 @@
+---
+title: "Quickstart"
+description: "Start building awesome documentation in under 5 minutes"
+---
+
+## Setup your development
+
+Learn how to update your docs locally and and deploy them to the public.
+
+### Edit and preview
+
+
+
+ During the onboarding process, we created a repository on your Github with your docs content. You can find this
+ repository on our [dashboard](https://dashboard.mintlify.com). To clone the repository locally, follow these
+ [instructions](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) in
+ your terminal.
+
+
+ Previewing helps you make sure your changes look as intended. We built a command line interface to render these
+ changes locally. 1. Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation
+ changes locally with this command: ``` npm i -g mintlify ``` 2. Run the following command at the root of your
+ documentation (where `mint.json` is): ``` mintlify dev ```
+
+
+
+### Deploy your changes
+
+
+
+
+ Our Github app automatically deploys your changes to your docs site, so you don't need to manage deployments yourself.
+ You can find the link to install on your [dashboard](https://dashboard.mintlify.com). Once the bot has been
+ successfully installed, there should be a check mark next to the commit hash of the repo.
+
+
+ [Commit and push your changes to
+ Git](https://docs.github.com/en/get-started/using-git/pushing-commits-to-a-remote-repository#about-git-push) for your
+ changes to update in your docs site. If you push and don't see that the Github app successfully deployed your changes,
+ you can also manually update your docs through our [dashboard](https://dashboard.mintlify.com).
+
+
+
+
+## Update your docs
+
+Add content directly in your files with MDX syntax and React components. You can use any of our components, or even build your own.
+
+
+
+
+ Add flair to your docs with personalized branding.
+
+
+
+ Implement your OpenAPI spec and enable API user interaction.
+
+
+
+ Draw insights from user interactions with your documentation.
+
+
+
+ Keep your docs on your own website's subdomain.
+
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/send-phone-call.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/send-phone-call.png
new file mode 100644
index 00000000000..f9d208f6f37
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/send-phone-call.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/starter-guide.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/starter-guide.mdx
new file mode 100644
index 00000000000..c14830bbd72
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/starter-guide.mdx
@@ -0,0 +1,74 @@
+---
+title: Starter guide
+description: Learn how to use Bland's API in under five minutes
+---
+
+## Creating a developer account
+
+
+
+To get started, sign up on the developer portal.
+
+Enter your phone number and verification code. Finally, once your developer portal loads, go to the `Send phone call` page.
+
+## Sending your first phone call
+
+
+
+Although Bland is an API-first platform, the send phone call page provides a simple interface for quickly testing calls. On the left side you can adjust the call options and on the right hand side you can see how the code updates.
+
+Once you're satisfied with a call, copy the code on the right side (in Javascript, Python, or cURL) and add it to your application.
+
+
+ In the `Phone Number` field, enter your own phone number.
+
+ For the task box either select one of the example prompts or write your own. For more instrucionts about prompting
+ your AI phone agent, read this blog post.
+
+
+ Scroll to the bottom of the page, and press the `Send call` button. Note, calls are charged at $0.12/minute, billed
+ to the exact second.
+
+
+
+To send a phone call programatically, read the API reference.
+
+## Testing your phone agent
+
+
+
+Once you've sent your first phone call, the next step is to test and improve the outputs from your phone agent.
+
+One way to test your agent is to send yourself test calls. A faster way, however, is to use the Bland AI testing suite.
+
+
+
+ Select the model and language and insert your current prompt into the task box.
+
+
+ Start messaging your phone agent. Act like you're the person receiving the call, and purposefully ask edge-case
+ questions to throw the phone agent off.
+
+ Based on the responses you receive, update the instructions in the prompt.
+
+
+## Next steps
+
+You now know how to send and test phone calls, but you've only scratched the surface of Bland's capabilties.
+
+Areas for further exploration:
+
+
+
+ Read the API reference.
+
+
+ Creating custom tools for interacting with external APIs, live, during phone calls.
+
+
+ Learn how to prompt the exact behavior you want from your phone agent.
+
+
+ See what people are building on Bland and get support from other users.
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/support.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/support.mdx
new file mode 100644
index 00000000000..2736395980d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/support.mdx
@@ -0,0 +1,7 @@
+---
+title: 24/7 Support
+---
+
+Receive direct support from the Bland AI engineering + founding team. All our enterprise customers have our founders' phone numbers, and receive rapid responses & help from engineering team members.
+
+For additional information, get in touch.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/testing.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/testing.png
new file mode 100644
index 00000000000..600581d9c0d
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/testing.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/add_global_prompt.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/add_global_prompt.png
new file mode 100644
index 00000000000..87a1b9d09d4
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/add_global_prompt.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/batchcalls.jpg b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/batchcalls.jpg
new file mode 100644
index 00000000000..bec46d668b1
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/batchcalls.jpg differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/condition_eg.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/condition_eg.png
new file mode 100644
index 00000000000..db7e9f8302a
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/condition_eg.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/custom-tools.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/custom-tools.mdx
new file mode 100644
index 00000000000..50745d241f2
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/custom-tools.mdx
@@ -0,0 +1,315 @@
+---
+title: "Custom Tools"
+description: "Interact with the real world mid-call using custom tools."
+---
+
+## Introduction
+
+Custom tools allow your agent to interact with any web API mid-call. Do things like:
+
+
+
+ Dispatch SMS or emails using the person's contact info.
+
+
+ Set appointments using live calendar availability.
+
+
+ Generate support tickets in your issue tracker.
+
+
+ Update your CRM with relevant details during the call.
+
+
+
+## Background
+
+To understand how custom tools work, let's take a peek under the hood of the Bland AI phone agent.
+
+During the conversation, the phone agent is constantly listening to figure out when it's supposed to respond. When the phone agent realizes it's time to respond, it reviews the tools in its toolbox and picks between them.
+
+Those tools include a `speak`, `wait`, and `button press` tool. When you create a custom tool, you add it to the existing 'toolbox' for the phone agent to pick from.
+
+A few natural questions arise:
+
+1. How do I define my custom tool?
+2. How do I make sure my tool gets picked at the right time?
+3. How does information from the call get passed to my custom tool's API request?
+4. How do I fill the silence (when my custom tool is running)?
+5. How does the response from my custom tool get added to the call?
+
+Keep reading to find out.
+
+# Creating your custom tool
+
+## Defining the API request
+
+Imagine you're creating an AI phone agent to take restaurant orders. You want your phone agent to have the ability to place orders, by pinging your backend API.
+
+Here's what that request might look like:
+
+```json
+{
+ "method": "POST",
+ "url": "https://api.your-restaurant.com/orders",
+ "headers": {
+ "Content-Type": "application/json",
+ "Authorization": "Bearer YOUR_API_KEY"
+ },
+ "body": {
+ "items": [
+ {
+ "name": "burger",
+ "patties": 2,
+ "quantity": 1
+ },
+ {
+ "name": "fry",
+ "size": "lg",
+ "quantity": 1
+ }
+ ]
+ }
+}
+```
+
+## From API request to custom tool
+
+The next step is to convert the API request into a custom tool. Custom tools have the following properties:
+
+- `name` - the agent will see this in the list of tools
+- `description` - a short explanation of what the tool does
+- `input_schema` - a JSON schema describing the input data
+- `speech` (optional) - a string that will be spoken to the agent while your tool waits for a response
+- `response_data` - An array of objects that describe how to extract data from the response. Within the response data, you can create variables that the phone agent can reference in its prompt.
+
+### Name & Description
+
+The agent will see the name in the list of tools. The name, plus the description, help the AI phone agent when it decides which tool to use.
+
+For this example we'll set the name to `PlaceOrder`, and the description to `Places the final order for the drive thru`.
+
+### Input Schema
+
+The input schema is critical. It defines the shape of the API request, the different inputs the request can take, and also includes an example (which helps our system when creating requests).
+
+Here's what the input schema could look like:
+
+```json
+"input_schema": {
+ "example": {
+ "items": [
+ {
+ "name": "burger",
+ "patties": 2,
+ "quantity": 3
+ },
+ {
+ "name": "fry",
+ "size": "lg",
+ "quantity": 2
+ }
+ ]
+ },
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "patties": {
+ "type": "integer"
+ },
+ "size": {
+ "type": "string",
+ "enum": [
+ "sm",
+ "md",
+ "lg"
+ ]
+ },
+ "flavor": {
+ "type": "string",
+ "enum": [
+ "chocolate",
+ "strawberry",
+ "vanilla"
+ ],
+ "default": "vanilla"
+ },
+ "quantity": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "name",
+ "quantity"
+ ]
+ }
+ }
+ }
+}
+```
+
+Two important notes about input schema:
+
+1. `input_schema` is converted into the variable `"{{input}}"` that you can use in the request body/query/headers
+2. To access nested properties, use dot notation: `"{{input.property.subproperty}}"`
+
+Scroll down to see the full example.
+
+### Speech
+
+Because requesting external APIs might take a while, we enable you to define a `speech` property. The phone agent will say the `speech` while it makes the request.
+
+An example speech might look like: `Perfect, I'll schedule that right now, give me just a second.`
+
+For the restaurant ordering example, the speech could be `Thank you, placing that order now.`
+
+### Response data
+
+Once your API request comes back, you need to extract the response data, and then make the phone agent aware of the new information.
+
+The `data` field determines how you extract the data while the `name` field determines the variable name for reference in the prompt.
+
+Here's an example response data:
+
+```json
+"response_data": [
+ {
+ "name": "order_price",
+ "data": "$.price"
+ }
+]
+```
+
+## Full example
+
+Below is the entire API request for sending a phone call using the outlined custom tool:
+
+```json
+{
+ "phone_number": "...",
+ // note that the returned value ({{order_price}}) in the task is populated only after the tool is run
+ "task": "You are taking a drive thru order from a customer. Find out everything that they want like a drive thru cashier. Continue until they say they're done. Repeat the full order back to them after that, and ask if that's correct. If they confirm that it's correct, then and only then will you place their order using the PlaceOrder tool. After you place it, tell them their order total and to pull forward. Their order price is {{order_price}}",
+ "first_sentence": "Hi, what can I get started for you today?",
+ "request_data": {
+ "menu": {
+ "burger": ["patties"],
+ "fry": ["size"],
+ "shake": ["flavor", "size"]
+ }
+ },
+ "tools": [
+ {
+ "name": "PlaceOrder",
+ "description": "Places the final order for the drive thru.",
+ "speech": "Thank you, placing that order now.",
+ "input_schema": {
+ "example": {
+ "items": [
+ {
+ "name": "burger",
+ "patties": 2,
+ "quantity": 3
+ },
+ {
+ "name": "fry",
+ "size": "lg",
+ "quantity": 2
+ }
+ ]
+ },
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "patties": {
+ "type": "integer"
+ },
+ "size": {
+ "type": "string",
+ "enum": ["sm", "md", "lg"]
+ },
+ "flavor": {
+ "type": "string",
+ "enum": ["chocolate", "strawberry", "vanilla"],
+ "default": "vanilla"
+ },
+ "quantity": {
+ "type": "integer"
+ }
+ },
+ "required": ["name", "quantity"]
+ }
+ }
+ }
+ },
+ "url": "https://api.your-restaurant.com/orders",
+ "method": "POST",
+ "headers": {
+ "Content-Type": "application/json",
+ "Authorization": "Bearer ..."
+ },
+ "body": {
+ "items": "{{input.items}}"
+ },
+ "response_data": [
+ {
+ "name": "order_price",
+ "data": "$.price"
+ }
+ ]
+ }
+ ]
+}
+```
+
+# Frequently asked questions
+
+
+
+ The phone agent refers to the input schema and the `example` within it. Both of those pieces of information provide context about what data to pass.
+
+ Then the phone agent extracts the information from the transcript and passes it to the request body.
+
+ You can improve the accuracy of the input data by creating a very clear `input_schema`. That includes providing a detailed `example` within.
+
+
+
+{" "}
+
+
+ The phone agent looks at the tool's name and description. Then it looks at the current context of the conversation to
+ decide whether using the tool makes sense.
+
+
+
+ When the API response from the custom tool comes back, you can extract the API response and create variables. You can do this within the `response_data` property.
+
+ Once you've given the variable a `name`, you can reference it in the prompt using double brackets (`{{}}`).
+
+ Note, with the current setup, you might reference variables that have null values. Here's the restaurant example prompt:
+
+ You are taking a drive thru order from a customer. Find out everything that they want like a drive thru cashier. Continue until they say they're done. Repeat the full order back to them after that, and ask if that's correct. If they confirm that it's correct, then and only then will you place their order using the PlaceOrder tool. After you place it, tell them their order total and to pull forward. Their order price is `{{order_price}}`
+
+ In the above prompt, the `order_price` will be null until the data comes back. That's okay though. The prompt is structured to first take the order, then use the PlaceOrder tool, and then finally respond with the order price.
+
+ By the time the phone agent is asked for the order price, it will have the information.
+
+ Custom tools will continue getting more robust, to further prevent scenarios where variables without value from being referenced in prompts.
+
+
+
+
+If you have any additional questions, reach out at hello@bland.ai and one of our engineers will help.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/default_node.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/default_node.png
new file mode 100644
index 00000000000..a40ca317443
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/default_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/dynamic-data.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/dynamic-data.mdx
new file mode 100644
index 00000000000..6f07d980eca
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/dynamic-data.mdx
@@ -0,0 +1,268 @@
+---
+title: "Dynamic Data"
+description: "Interact with the real world by connecting your agent to external APIs."
+---
+
+## Introduction
+
+With Dynamic Data, you can make external API requests at the start and throughout your phone call. This allows you to load data from your database, or from any other API. You can then use that data in your AI responses, or to define circumstantial behavior for each call.
+
+Some examples of what Dynamic Data enables:
+
+- Maintain conversation history between calls
+- Define behavior based on the user's location
+- Handle real-time data like status updates or prices
+
+
+
+Here's how to make an [Inbound Agent](/api-v1/post/inbound-number-update) remember past conversations they've had with callers. There's a lot of other useful information we can integrate, like how long ago that call occurred and the call's duration.
+
+`Endpoint: POST https://api.bland.ai/v1/inbound/<>`
+
+```json
+{
+ "prompt": "You're a service agent working on behalf of Bland AI...",
+ "dynamic_data": [
+ {
+ // First, retrieve the previous call's data
+ "url": "https://api.bland.ai/v1/calls",
+ "method": "GET",
+ "headers": {
+ "authorization": <>
+ },
+ "query": {
+ // These parameters narrow down the search and will make the request faster
+ // as well as easier to understand during later analysis.
+ "from_number": "{{phone_number}}",
+ "from": 1, // Offset by 1 to exclude the current call
+ "limit": 1
+ },
+ "response_data": [
+ {
+ // These are the variables you're defining
+ "name": "previous_call_id",
+ // And the path to the data you want to extract
+ "data": "$.calls[0].c_id"
+ },
+ {
+ "name": "previous_call_time",
+ "data": "$.calls[0].created_at"
+ },
+ {
+ "name": "previous_call_duration_minutes",
+ "data": "$.calls[0].call_length"
+ }
+ ]
+ },
+ {
+ // Once we have the previous call's ID, we can retrieve the transcript
+ // Note the variable used in the URL
+ "url": "https://api.bland.ai/v1/calls/{{previous_call_id}}",
+ "method": "GET",
+ "headers": {
+ "authorization": <>
+ },
+ "response_data": [
+ {
+ "name": "previous_conversation",
+ "data": "$.concatenated_transcript",
+ // The context parameter elaborates on the variable's purpose and use
+ "context": "Your previous conversation with this person (if it exists): {{previous_conversation}}"
+ }
+ ]
+ },
+ {
+ // Helpful tip for debugging:
+ // You can send the data to a webhook to see what it looks like
+ "url": "https://webhook.site/...",
+ "method": "POST",
+ // Setting cache to false means you'll be able to see the data change in real-time
+ "cache": false,
+ "body": {
+ // And here's the data we're sending
+ "call_id": "{{call_id}}",
+ "prev_call_id": "{{previous_call_id}}",
+ "now": "{{now}}",
+ "previous_call_time": "{{previous_call_time}}",
+ "previous_conversation": "{{previous_conversation}}"
+ }
+ // Additional note:
+ // Since no response_data is defined, latency isn't affected by this request
+ }
+ ]
+}
+```
+
+
+
+We'll cover the following features in this section:
+
+- System variables
+- External API requests
+- Extracting data from responses
+- Variables as parameters
+- Chaining requests
+
+## System Variables
+
+Variables are defined with double curly braces, like `{{variable}}`. System variables are predefined variables that are available in every AI phone call. You can use them to access information about the current call, like the user's phone number or the current time.
+
+Note: Variables are NOT case sensitive, and outer spaces are trimmed automatically.
+
+Base variables:
+
+- `{{phone_number}}` - Always the other party's number
+- `{{country}}` - The country code (ex. US)
+- `{{state}}` - The state or province's abbreviation (ex. CA for California)
+- `{{city}}` - The full city name, capitalized
+- `{{zip}}` - The zip code
+- `{{call_id}}` - The unique ID of the current call
+- `{{now}}`
+- `{{now_utc}}`
+- `{{from}}` - The outbound number in E.164 format
+- `{{to}}` - The inbound number in E.164 format
+- `{{short_from}}` - outbound number with country code removed
+- `{{short_to}}` - inbound number with country code removed
+
+Variables can be used mid-sentence, like this:
+
+```json
+{
+ "task": "... Today is {{now}} ..."
+}
+```
+
+## External API Requests
+
+External API requests are defined in the `dynamic_data` parameter of your call request or inbound agent configuration. The `dynamic_data` parameter is an array of objects, where each object represents an API request.
+
+Here's a simple request that can be used to load public data about the current price of Bitcoin, then store it in a variable called `{{bitcoin_price}}`:
+
+```json
+{
+ "dynamic_data": [
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json"
+ "response_data": [
+ {
+ "name": "bitcoin_price",
+ "data": "$.bpi.USD.rate",
+ "context": "Current price of Bitcoin in USD is ${{bitcoin_price}}"
+ }
+ ]
+ }
+ ]
+}
+```
+
+
+ - `timeout` - The maximum number of milliseconds to wait for a response. - Default: `2000` - `method` - The HTTP
+ method to use. - Defaults to `GET`, otherwise `POST` is allowed. - `headers` - An object of headers to send with the
+ request. - `body` - The body of the request. Only used if `method` is `POST`. - `response_data` - An array of objects
+ that define how to extract data from the response. - See the next section for more details. - `cache` - Whether to
+ store the response, or refresh that data before each AI response. - Defaults to `true`.
+
+
+## Extracting Data from Responses
+
+Rather than using the full response, you can extract specific data from the response using the `data` parameter. The `data` parameter follows JSON structuring, using dot notation and array indices. For example, if the response is:
+
+```json
+{
+ "bpi": {
+ "USD": {
+ "code": "USD",
+ "rate": "9,000.00",
+ "description": "United States Dollar",
+ "rate_float": 9000
+ },
+ "GBP": {
+ "code": "GBP",
+ "rate": "6,000.00",
+ "description": "British Pound Sterling",
+ "rate_float": 6000
+ }
+ }
+}
+```
+
+Then `$.bpi.USD.rate` would return `9,000.00`.
+
+More complex filters can be used if they follow the [JSONPath format](https://docs.hevodata.com/sources/engg-analytics/streaming/rest-api/writing-jsonpath-expressions).
+
+## Variables as Parameters
+
+Once defined with `response_data`, variables can be used nearly anywhere.
+
+- In the `task` or `prompt` parameters
+- In the `context` parameter of `response_data`
+- In the `body`, `headers` and/or `query` parameter of each request
+
+Afterwards, in your webhooks and when retrieving call transcripts, the `variables` field will contain all variables that were defined during the call.
+
+By far, the easiest way to test out your `dynamic_data` configuration is via the [/dynamic_data/test](/api-reference/endpoint/dynamic_validate) endpoint. It returns the original configuration, every raw response, and the final variables after parsing is applied.
+
+## Chaining Requests
+
+Each request is executed in order, and variables defined in previous requests can be used in the next request. For example, if you want to retrieve information from your database or ours, then take additional actions with that data then you could do something like the following:
+
+For this example, imagine a delivery service that offers instant checkout for customers that have signed up to be a member. The first request retrieves their member_id from your database like so:
+
+```json
+{
+ "dynamic_data": [
+ {
+ "url": "https://api.restaurant.com/customers",
+ "method": "GET",
+ "headers": {
+ "authorization": "ExtremelySecureCredentials"
+ },
+ "query": {
+ "phone_number": "{{phone_number}}"
+ },
+ "response_data": [
+ {
+ "name": "member_id",
+ "data": "$.customer.member_id"
+ }
+ ]
+ }
+ //...
+ ]
+}
+```
+
+We just created that `{{member_id}}` variable - now we can use it in the next request.
+
+This delivery service also can be called to check on an order status.
+
+Note a difference: The `cache` parameter is set to `false`, so if the order status changes during the call, the agent will immediately know about it and be able to inform the customer.
+
+```json
+{
+ "dynamic_data": [
+ //...
+ {
+ "url": "https://api.restaurant.com/orders",
+ "method": "GET",
+ "cache": false,
+ "headers": {
+ "authorization": "ExtremelySecureCredentials"
+ },
+ "query": {
+ "member_id": "{{member_id}}"
+ },
+ "response_data": [
+ {
+ "name": "order_id",
+ "data": "$.orders[0].id"
+ },
+ {
+ "name": "order_status",
+ "data": "$.orders[0].status"
+ }
+ ]
+ }
+ ]
+}
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/edges.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/edges.png
new file mode 100644
index 00000000000..124e4291809
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/edges.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/end_node.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/end_node.png
new file mode 100644
index 00000000000..4a0c2d395d2
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/end_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/extract_variables.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/extract_variables.png
new file mode 100644
index 00000000000..14f1530e29f
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/extract_variables.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/final_pathway.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/final_pathway.png
new file mode 100644
index 00000000000..9f592f20658
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/final_pathway.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/finetune.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/finetune.png
new file mode 100644
index 00000000000..fc5d7d3f425
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/finetune.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/finetuned.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/finetuned.png
new file mode 100644
index 00000000000..de014643589
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/finetuned.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/global_eg.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/global_eg.png
new file mode 100644
index 00000000000..31436694447
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/global_eg.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/global_node.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/global_node.png
new file mode 100644
index 00000000000..40eb7a91fa9
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/global_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/inbound-number-webhook.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/inbound-number-webhook.png
new file mode 100644
index 00000000000..7b3b9e0d406
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/inbound-number-webhook.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/kb_node.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/kb_node.png
new file mode 100644
index 00000000000..d496d9cc009
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/kb_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/live-transfer.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/live-transfer.mdx
new file mode 100644
index 00000000000..9b884b696a9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/live-transfer.mdx
@@ -0,0 +1,83 @@
+---
+title: "Live transfer"
+---
+
+
+
+## Introduction
+
+Implementing live transfer in your AI-powered phone calls enhances flexibility and customer experience. This guide will explain how to set up a live transfer during a call using Bland AI.
+
+## Step 1: Understand Live Transfer
+
+Live transfer allows the AI agent to transfer the call to a human representative under certain conditions. This is crucial for scenarios where human intervention is preferred.
+
+## Step 2: Setup Your Authorization
+
+Before initiating a live transfer, ensure your API key is ready. Obtain your key from the [developer portal](https://app.bland.ai) if you haven't already.
+
+## Step 3: Configure the Transfer Settings
+
+Include the `transfer_phone_number` parameter in your call data. This is the number the AI will transfer to. Additionally, define the conditions for transfer in the task parameter.
+
+Example:
+
+```javascript
+{
+ "phone_number": "+11233456789",
+ "transfer_phone_number": "+19876543210",
+ "task": "If the caller requests to speak with a human, transfer the call to the representative."
+}
+```
+
+## Step 4: Send the API Request
+
+Make the API request using the JavaScript or Python code snippet provided, ensuring the `transfer_phone_number` and conditions are included.
+
+## Step 5: Test and Monitor
+
+After setting up the live transfer, test the functionality to ensure it works as expected. Monitor the calls to adjust the transfer conditions as necessary.
+
+## Conclusion
+
+Setting up a live transfer offers a seamless experience for situations where AI needs to hand over to a human. You're now ready to integrate this feature into your AI-powered calls with Bland AI.
+
+Maintain a balance between automated and human interactions to optimize customer satisfaction. Happy calling!
+
+
+
+```javascript LiveTransfer.js
+// Headers
+const headers = {
+ authorization: "YOUR-API-KEY-HERE",
+};
+
+// Data
+const data = {
+ phone_number: "+11233456789",
+ transfer_phone_number: "+19876543210",
+ task: "If the caller requests to speak with a human, transfer the call to the representative.",
+};
+
+// API request
+await axios.post("https://api.bland.ai/v1/calls", data, { headers });
+```
+
+```python LiveTransfer.py
+# Headers
+headers = {
+ 'authorization': 'YOUR-API-KEY-HERE'
+}
+
+# Data
+data = {
+ 'phone_number': '+11233456789',
+ 'transfer_phone_number': '+19876543210',
+ 'task': 'If the caller requests to speak with a human, transfer the call to the representative.'
+}
+
+# API request
+response = requests.post('https://api.bland.ai/v1/calls', json=data, headers=headers)
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/live_call_logs.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/live_call_logs.png
new file mode 100644
index 00000000000..bfa24e22ab4
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/live_call_logs.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/livetransfer.jpg b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/livetransfer.jpg
new file mode 100644
index 00000000000..63b16780d19
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/livetransfer.jpg differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/max-duration.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/max-duration.mdx
new file mode 100644
index 00000000000..99c4d435d1a
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/max-duration.mdx
@@ -0,0 +1,85 @@
+---
+title: "Setting max duration"
+---
+
+
+
+## Introduction
+
+Controlling the length of your AI-powered phone calls is crucial for efficiency and cost-effectiveness. In this guide, we'll walk you through how to set a `max_duration` for your calls using Bland AI.
+
+## Step 1: Understand max_duration
+
+The `max_duration` parameter allows you to specify the longest duration you want your call to last, measured in minutes. Once the set duration is reached, the call will automatically end.
+
+## Step 2: Setup Your Authorization
+
+Ensure you have your API key ready for authentication. If you haven't obtained one, sign up on the [developer portal](app.bland.ai).
+
+## Step 3: Define max_duration in Your Call Data
+
+When preparing your call data, include the `max_duration` parameter. You can set it as a float or a string.
+
+Example values: `"30", "5.5", 45, 2.8`.
+
+Here’s how you might include it in your request data:
+
+```javascript
+{
+ "phone_number": "+11233456789",
+ "task": "Inquire about the latest product updates.",
+ "max_duration": "10", // Call lasts for 10 minutes max
+}
+```
+
+## Step 4: Send the API Request
+
+Use the provided JavaScript or Python code snippet to make the API request, ensuring you include the `max_duration` parameter.
+
+## Step 5: Test and Adjust
+
+After setting `max_duration`, test your calls to ensure they're ending at the desired time. Adjust as necessary based on your needs and feedback.
+
+## Conclusion
+
+Setting a `max_duration` for your calls ensures they are concise and to the point, saving time and resources. You're now ready to efficiently manage the length of your AI-powered calls with Bland AI.
+
+Remember, the key is to find the right balance between giving enough time for meaningful interaction and keeping the calls concise. Happy calling!
+
+
+
+```javascript SendCall.js
+// Headers
+const headers = {
+ authorization: "YOUR-API-KEY-HERE",
+};
+
+// Data
+const data = {
+ phone_number: "+11233456789",
+ task: "Inquire about the latest product updates.",
+ max_duration: "10", // Call lasts for 10 minutes max
+};
+
+// API request
+await axios.post("https://api.bland.ai/v1/calls", data, { headers });
+```
+
+```python SendCall.py
+# Headers
+headers = {
+ 'authorization': 'YOUR-API-KEY-HERE'
+}
+
+# Data
+data = {
+ 'phone_number': '+11233456789',
+ 'task': 'Inquire about the latest product updates.',
+ 'max_duration': '10', # Call lasts for 10 minutes max
+}
+
+# API request
+response = requests.post('https://api.bland.ai/v1/calls', json=data, headers=headers)
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/maxduration.jpg b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/maxduration.jpg
new file mode 100644
index 00000000000..648a1b301bb
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/maxduration.jpg differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/new_pathway.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/new_pathway.png
new file mode 100644
index 00000000000..e6255897d8d
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/new_pathway.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/node.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/node.png
new file mode 100644
index 00000000000..6bc933e0020
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathway_chat.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathway_chat.png
new file mode 100644
index 00000000000..9467b610533
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathway_chat.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathway_label.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathway_label.png
new file mode 100644
index 00000000000..1d7654a379a
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathway_label.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathwaylog_finetune.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathwaylog_finetune.png
new file mode 100644
index 00000000000..b6df97a0c05
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathwaylog_finetune.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathways.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathways.mdx
new file mode 100644
index 00000000000..1079d979270
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/pathways.mdx
@@ -0,0 +1,285 @@
+---
+title: "Conversational Pathways"
+description: "Gain greater control over your AI agent and the conversational flow. [Create a Pathway Now!](https://app.bland.ai/dashboard?page=convo-pathways)"
+---
+
+[Template Pathway Video Tutorial](https://www.loom.com/share/be9d6f1072ae4267abc0717e36e66078?sid=82a7843f-9e7c-457a-8f7b-4d8ca026e1ff)
+
+## Introduction
+
+Conversational pathways are our new way of prompting Bland that has led to major breakthroughs in realism.
+
+
+
+ Give your agent instructions on how it should respond at specific points of the conversation. Choose between
+ prompting or fixed sentences.
+
+
+ Execute webhooks at any point during the conversation, and send speech during/after the webhook.
+
+
+ Control when your agent ends the call
+
+
+ Connect your agent to a knowledge base, to answer any questions the user has.
+
+
+
+# Terminologies
+
+To understand how pathways work, let's first understand the terminologies.
+
+## Nodes
+
+These blocks you see here are called Nodes.
+
+
+
+## Pathways
+
+Each of these dotted lines is called a Pathway. Their start end end points are the `Purple Circles` on the top and bottom of the nodes.
+
+In order to create a pathway from a node, you would click on the purple circle at the bottom of the node and drag your mouse to connect to the top purple circle another node.
+
+Upon doing so, you will now have a new dotted line connecting the two nodes, with a 'New Pathway' button in the middle of the line.
+
+
+
+In order to instruct the agent when to take this pathway, you would click on the Edit icon on the 'New Pathway' button, and input the conditions for when the agent should take this pathway. In the above example, the agent would take this pathway if the user is not available to talk, so I labelled the pathway as 'not a good time to talk'.
+
+
+
+And there you have it! You have now created a pathway from one node to another, and instructed the agent when to take this pathway. You can connect as many nodes as you want in this manner, and create as many pathways as you want. In order to create a new Node, press the 'Add new Node' button at the top-left of the screen.
+
+# How the Pathways Agent Works
+
+The agent starts at the first node, and then moves to the next node based on the pathway that the agent decides to take. The agent will then execute the instructions in the node as dialogue, and then move on to the next node based on the pathway that the agent decides to take. This process will continue until the agent decides to end the call.
+
+The agent will make decisions based on the labels you put in the pathways, when connecting one node to another, and the dialogue generated will be based on the instructions you set in the nodes.
+
+
+
+For Example,
+
+In this example, at the node named 'Ask for reservation info', the node asks for the user's reservation information. Based on the user's response, the agent will then move on to the next node based on the labels you put in the pathways. For the current node, it will check if the user has provided reservation information where the number of guests is either less than 8 or more than 8. If the user has provided reservation information where the number of guests is less than 8, the agent will move on to the node named 'Reservation booking'. If the user has provided reservation information where the number of guests is more than 8, the agent will move on to the node named 'Transfer Call'. The agent will then execute the instructions in the node as dialogue, and then move on to the next node based on the pathway that the agent decides to take. And the process repeats!
+
+## Conditions
+
+Conditions are a way to provide the agent with a condition that must be met in order for the agent to move on to the next node. If the condition is not met, the agent will stay on the same node and ensure the condition is met until the condition is fulfilled.
+
+Using the same example above, I set the condition for the 'Ask for reservation info' node as follows - "You must get the date, time, and number of guests for this reservation". This means that the agent will stay on the 'Ask for reservation info' node until the user provides the date, time, and number of guests for the reservation. If the user says something else or deviates from the conversation, the agent will stay on the 'Ask for reservation info' node and prompt the user to provide the date, time, and number of guests for the reservation.
+
+This helps you to ensure that the user provides the necessary information before moving on to the next node, and helps you to control the flow of the conversation.
+
+
+
+## Global Nodes
+
+
+
+Global Nodes take precendence over the condition decisions made by the agent. You can treat a global node as a node, that every other node in the pathway has a pathway to, with the label as the 'Global Pathway Label'.
+
+Using the Reservation Booking Example, if the user were to ask a question like 'What are the opening hours of the restaurant' when the agent is at the 'Ask for reservation info' node, the condition decision would not be met as the user did not provide the date, time, and number of guests for the reservation. However, the pathway label would be 'user has a question about the restaurant's hours or location', which links to a Global Node. As Global Nodes take precedence over the condition decision, the agent would then move to the 'Global Node' named 'Restaurant Questions' and provide the user with the opening hours of the restaurant. After providing the user with the opening hours of the restaurant, the agent would then automatically return to the 'Ask for reservation info' node, and continue with the flow of the conversation.
+
+This helps you to handle edge cases where the user might ask a question that is not related to the current conversation, and allows you to provide the user with the information they need, before returning to the conversation.
+
+Tip: The variables `{{lastUserMessage}}` and `{{prevNodePrompt}}` can be used in the Global Node to provide the agent with context on what the user said, and steering the conversation back to its own original goal.
+
+
+You are to answer any questions the user has, to the best of your knowledge. If you do not know the answer, simply say 'I don't have that information at that moment'. Do not make up any information/facts about the appointment.
+
+After you answer the question, you are to direct the conversation back to your initial goal, which was as follows:
+
+Previous Goal:
+`{{prevNodePrompt}}`
+
+If you deem the goal as achieved, you can simply ask the user 'So, shall we proceed?' . If the goal has not been achieved, you are to steer the conversation back to achieve your goal.
+If you deem the goal as achieved, simply confirm the result with the user. If the goal has not been achieved, you are to steer the conversation back to achieve your goal.
+
+```
+Examples
+--
+assistant: what date works for you?
+user: what day is it today?
+assistant: The day today is April 15th. So, what date works for you?
+--
+
+--
+assistant: what date works for you?
+user: probably tomorrow, what time does the clinic open?
+assistant: The clinic opens at 9am. So, do you want to schedule for tomorrow?
+--
+```
+
+
+
+
+
+# Node Types
+
+There are currently 6 different types of Nodes
+
+- Default
+- Webhook
+- Knowledge Base
+- End Call
+- Transfer Call
+- Wait for Response
+
+You can select the type of node you want by clicking on the dropdown of `Node Type`.
+
+## Base/Default Node (Important!)
+
+The default node provides the ability to generate a response to the user. This functionality is exposed to all other nodes as well.
+
+You can either:
+
+- Use the `Prompt` field to give instructions on what the agent should do at this point in the conversation. This is the recommended way to generate responses as it makes the conversation more human and natural.
+- Enable the 'Static Text' toggle to provide a fixed response, and the agent will always say the same thing at this point in the conversation.
+
+
+
+### Optional Decision Guide
+
+The optional decision guide is only to be used if your phone agent currently is not going down the correct pathway. We do not expect this to happen often, but still want to provide you the tools to handle these issues if they arise.
+
+It is a way to provide the phone agent with example scenarios of what the user might say, and what pathway the agent should take in response.
+
+You would put in examples of what the user might say in the `User Input` field, and then in the `Pathway` field, you would provide the pathway the agent should take in response.
+
+### Condition
+
+The condition is a way to provide the agent with a condition that must be met in order for the agent to move on to the next node. If the condition is not met, the agent will stay on the same node and ensure the condition is met until the condition is fulfilled.
+
+### Global Nodes
+
+Each node can be configured to be a Global Node. Global Nodes are nodes that are accessible by every other node in the Conversational Pathway. This means that it has an implicit pathway to every other node, and the label would be the 'Global Label'.
+
+After entering a Global Node, the agent will execute the instructions inside the Global Node, and then automatically return to the node it was at before entering the Global Node, so it can continue with the flow of the conversation.
+
+In a Global Node, you can also forward the agent to another node, by toggling the 'Enable Forwarding', which will allow you to select the node you want to move the agent to. This is useful if you want to move the agent to a existing node for a certain scenario, which could happen at any point in the conversation.
+
+
+
+## Transfer Call Node
+
+The transfer call node is used to transfer the call to another number when the node is reached, and the dialogue at this node is complete.
+
+As such, you may have the agent say any final words before the call is transferred.
+
+
+
+## End Call Node
+
+The end call node will end the call when the node is reached, and the dialogue at this node is complete.
+
+As such, you may have the agent say any final words before the call is ended.
+
+
+
+## Knowledge Base Node
+
+The knowledge base node is used to connect your agent to a knowledge base, to answer any questions the user has.
+
+Paste in any text in the 'Knowledge Base' field, and the agent will search through the knowledge base to answer the user.
+
+Coming soon - PDF Upload/Vector Database Integrations...
+
+
+
+## Wait for Response Node
+
+The Wait for Response Node works the same way as the Default Node, except it is also equipped with the ability to wait if the user requires time to respond or needs to hold for a moment.
+
+## Webhook Node
+
+The webhook node is used to execute webhooks at any point during the conversation, and send speech during/after the webhook.
+
+`Webhook Information` is all you need in order to execute a webhook, and works the same way as Dynamic Data. Refer to the [Dynamic Data](https://docs.bland.ai/tutorials/dynamic-data) section for more information...
+
+Similar to how the dialogue is handled in all other nodes, you can control the dialogue sent before, and after the webhook is executed.
+
+Variables received from the webhook can be used in the dialogue as well, as shown in the example below.
+
+
+
+# Global Prompt for all Nodes
+
+The 'Add Global Prompt to All Nodes' feature is to assist in providing context/instructions to the agent for all nodes, without having to manually input the same prompt for each node. One Example of a Global Prompt could be to provide the agent with instructions on how to handle the call, the tone of voice to use, or answering any questions the user might have.
+
+
+
+# Live Call Logs
+
+The live call logs are a way to provide you with a live feed of the conversation between the agent and the user. This is useful for debugging purposes, and to see how the agent is responding to the user in real-time and the decisions the agent is making. On top of the transcript, we expose the updated node the agent took, the pathway that the agent took, as well as whether the condition was met or not.
+
+
+
+# Testing the Pathway Agent via Chat
+
+You can test the responses from your pathway agent by clicking on the 'Chat with Pathway' button at the top right of the screen. This will open a chat window where you can test the agent by sending messages to the agent, and see how the agent responds. The live call logs will also be displayed on the right side of the screen, so you can see the decisions the agent is making in real-time.
+
+
+
+# Variables Reference/ Extraction
+
+## Variables
+
+You can reference variables in pathways using double curly braces like `{{first_name}}`. You can pass variables into your call by passing in the key-value pairs in the `request_data` field when sending a call.
+
+Some examples of variables that you can access at each node:
+
+- `{{lastUserMessage}}` - The last response from the user
+- `{{prevNodePrompt}}` - The prompt from the previous node
+- `{{now_utc}}` - The current time in UTC
+- `{{from}}` - The phone number the call is from
+- `{{to}}` - The phone number the call is to
+- `{{call_id}}` - The unique identifier for the call
+
+## Extracting Variables from Call/User Response
+
+At each node, you can also extract variables from the user's response using the `Extract Variables from Call Info` field. You would put in the name of the variable you want to extract, the type of the variable (integer, string, boolean), and the description for what information you want the variable to store. You can also provide specific formats you expect and examples in the description. The more descriptive it is, the better the agent will be at extracting the variable more accurately.
+
+Do note that when enable variable extraction, and wanting to reference the variable in the subsequent nodes, it would introduce slight latency as the agent would have to extract the variable from the user's response before generating the dialogue for the next node.
+
+Within the webhook node, the variable extraction happens before the webhook is executed, so that you can reference the variables extracted from the user's response in the webhook's request data. The variables extracted from the webhook in `response_data` can also be referenced in the dialogue generated after the webhook is executed, in the same manner.
+
+For Example, the image below shows how the Webhook Node is set up to extract the date, time, and number of guests for the reservation, and how the extracted variables are referenced in the webhook's request data.
+
+
+
+# Fine Tuning the Pathway agent
+
+While Conversational Pathways gives you a lot greater control compared to the regular call agent, hallucinations can still occur, or the agent might make wrong decisions in the pathway. However, we have provided you with the tools to handle these issues if they arise. Each node can be fine-tuned on the decision it makes, as well as the expected dialogue it generates, allowing you to handle even the most extreme edge cases that might arise easily.
+
+### Steps to Fine-Tuning the agent
+
+Upon triggering and testing a call with your pathway using the 'Chat with Pathway' button, or sending a call, you will be able to see the live call logs.
+
+If you see a decision that the agent made that you do not agree with, or if the agent is hallucinating, you can fine-tune the decision the agent makes by clicking on the `Edit` button on the `PATHWAY DECISION INFO` block.
+
+
+
+Upon doing so, you will be able to see the decisions the agent made for the condition, the pathway it took, and the dialogue it generated. You can then fine-tune the agent by changing the dialogue, the condition, or the pathway the agent took.
+
+Upon saving your changes, you will be able to see the fine-tuning data in the node where the decision was made. This training data is used to train the agent to make better decisions in the future, and to ensure that the agent does not make the same mistake again.
+
+
+
+Do note that the decisions for the condition and pathway chosen is made by the node the agent is currently at, and the dialogue is generated by the node which the agent decides to take the pathway to.
+
+For Example,
+If the agent is at Node 1, and the agent decides that the condition is achieved, and decides to take the pathway to Node 2, the dialogue generated will be from Node 2, and the decisions for the condition and pathway chosen will be from Node 1. As such, the training data for the condition and pathway chosen will be stored in Node 1, and amendments to the dialogue generated will be stored in Node 2.
+
+
+
+# Quick Start with Tutorial / Templates
+
+To immediately start playing around with Conversational Pathways, you can use one of our templates. Visit the Conversational Pathways page on our Dev Portal, and duplicate the 'Restaurant Reservation' Template, and run through the agent to see how it works!
+We have also created a video walkthrough of that template to help you get started!
+
+[Video Walkthrough/Tutorial](https://www.loom.com/share/be9d6f1072ae4267abc0717e36e66078?sid=82a7843f-9e7c-457a-8f7b-4d8ca026e1ff)
+
+Create a pathway now! Click [here](https://app.bland.ai/dashboard?page=convo-pathways) to get started!
+
+If you have any additional questions, reach out on our [Discord](https://discord.gg/QvxDz8zcKe) and one of our engineers will help.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/send-1000-calls-at-once.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/send-1000-calls-at-once.mdx
new file mode 100644
index 00000000000..adf2d3f2c80
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/send-1000-calls-at-once.mdx
@@ -0,0 +1,114 @@
+---
+title: "Send 1000 phone calls"
+---
+
+
+
+## Step 1: Setup Your Authorization
+
+To initiate a batch call, you must first authenticate your request. Ensure you have your API key from signing up on the [developer portal](https://app.bland.ai).
+
+## Step 2: Create the Base Prompt
+
+Craft a base prompt that will be common across all calls in the batch. Use placeholders `{{curly braces}}` for dynamic content.
+
+Example:
+
+```javascript
+"You are calling {{business}} to renew their subscription to {{service}} before it expires on {{date}}.";
+```
+
+## Step 3: Define the Call Data
+
+Specify the list of calls in the `call_data` array. Each call must have a `phone_number` and can include other properties corresponding to placeholders in your base prompt.
+
+Example:
+
+```javascript
+[
+ {
+ phone_number: "1234567890",
+ business: "ABC co.",
+ service: "Netflix",
+ date: "September 4th",
+ },
+ {
+ phone_number: "32176540987",
+ business: "XYZ inc.",
+ service: "Window Cleaning",
+ date: "December 20th",
+ },
+];
+```
+
+## Step 4: Additional Configuration
+
+- `label`: Assign a label to your batch for easy tracking.
+- `campaign_id`: Organize related batches under a campaign.
+- `test_mode`: Set to true for testing with the first call only.
+- `batch_id`: Manually set or auto-generated for tracking.
+- Voice and Language Settings: Select `voice_id`, `reduce_latency`, and `language`.
+- `request_data`: Include specific facts for the AI to know during the call.
+- `webook`: For real-time notifications and transcripts post-call.
+- `max_duration`: Define the maximum length of each call.
+- `amd`: Enable for navigating phone trees or leaving voicemails.
+- `wait_for_greeting`: Control if the AI speaks immediately or waits.
+
+## Step 5: Send the API Request
+
+Use the provided JavaScript or Python code snippet to make the API request.
+
+## Step 6: Handle the Response
+
+After sending the batch request, you'll receive a response with a `message` and the `batch_id`. Monitor the progress of your calls and any responses via your specified webhook.
+
+Here's what an example response might look like:
+
+```javascript
+{
+ "message": "success",
+ "batch_id": "3p$7rQ3p9sT5bzmF-gen-batch"
+}
+```
+
+## Step 7: Monitoring and Analytics
+
+Track the performance and outcomes of your batch calls through the provided `batch_id` and campaign analytics. Adjust future batches based on the insights gained.
+
+
+
+```javascript SendCalls.js
+// Headers
+const headers = {
+ authorization: "YOUR-API-KEY-HERE",
+};
+
+// Data
+const data = {
+ base_prompt: "You are calling {{business}} to renew their subscription to {{service}} before it expires on {{date}}.",
+ call_data: [
+ {
+ phone_number: "1234567890",
+ business: "ABC co.",
+ service: "Netflix",
+ date: "September 4th",
+ },
+ {
+ phone_number: "32176540987",
+ business: "XYZ inc.",
+ service: "Window Cleaning",
+ date: "December 20th",
+ },
+ ],
+ label: "Renewal Reminder - Wednesday Afternoon with female voice",
+ voice_id: 0,
+ max_duration: 10,
+ reduce_latency: true,
+ wait_for_greeting: true,
+};
+
+// API request
+await axios.post("https://api.bland.ai/v1/batches", data, { headers });
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/send-first-call.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/send-first-call.mdx
new file mode 100644
index 00000000000..1295aa8b13d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/send-first-call.mdx
@@ -0,0 +1,108 @@
+---
+title: "Send your first phone call"
+---
+
+
+
+## Step 1: Setup Your Authorization
+
+Before making a call, you need to authenticate your request. Make sure you have your API key ready.
+
+Sign up on the [developer portal](https://app.bland.ai) to get yours.
+
+## Step 2: Prepare the Call Data
+
+You will need to provide specific details for the call. These include:
+
+- `phone_number`: The number you want to call. Remember to include the country code.
+- `task`: Describe the purpose of the call and how the AI should handle the conversation.
+- `voice_id`: Choose the voice persona (American male, Australian female, etc.) based on your preference.
+- Set parameters like `reduce_latency`, `record`, `amd` (for navigating phone trees), and `wait_for_greeting` according to your call's requirements.
+
+## Step 3: Customize the Call
+
+You can further personalize the call by:
+
+1. Setting a `first_sentence` for the call.
+2. Specifying `dynamic_data` to incorporate external API data.
+3. Adjusting `voice_settings` for stability, similarity, and speed.
+4. Choosing the language with the `language` parameter.
+5. Setting a `max_duration` for the call.
+
+## Step 4: Send the API Request
+
+Use the provided JavaScript or Python code snippet to make the API request.
+
+## Step 5: Handle the Response
+
+After the call, you will receive a response with the `status` and `call_id`. If you set `record` to true, you can retrieve the recording using the `/call/recording` endpoint.
+
+Here's what an example response might look like:
+
+```javascript
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+## Step 6: Monitor the Call
+
+If you have set up a webhook, you will receive real-time notifications and transcripts once the call completes.
+
+And that's it! You're now ready to make your first AI-powered phone call with Bland AI. Happy calling!
+
+
+
+```javascript SendCall.js
+// Headers
+const headers = {
+ authorization: "YOUR-API-KEY-HERE",
+};
+
+// Data
+const data = {
+ phone_number: "+11233456789",
+ task: "You are calling Fantastic Airlines on behalf of John Doe. Find out where John's Bags are located.",
+ voice_id: 0,
+ language: "eng",
+ request_data: {
+ calling: "Fantastic Airlines",
+ bag_claim: "69683",
+ airline_code: "UA123",
+ },
+ record: true,
+ reduce_latency: true,
+ amd: true,
+};
+
+// API request
+await axios.post("https://api.bland.ai/v1/calls", data, { headers });
+```
+
+```python SendCall.py
+# Headers
+headers = {
+ 'authorization': 'YOUR-API-KEY-HERE'
+}
+
+# Data
+data = {
+ 'phone_number': '+11233456789',
+ 'task': "You are calling Fantastic Airlines on behalf of John Doe. Find the location of out where John's Bags are located.",
+ 'voice_id': 0,
+ 'request_data': {
+ 'calling': 'Fantastic Airlines',
+ 'bag_claim': '69683',
+ 'airline_code': 'UA123'
+ },
+ 'record': True,
+ 'reduce_latency': True,
+ 'amd': True
+}
+
+# API request
+response = requests.post('https://api.bland.ai/v1/calls', json=data, headers=headers)
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/sendfirstcall.jpg b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/sendfirstcall.jpg
new file mode 100644
index 00000000000..a509bcd6f04
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/sendfirstcall.jpg differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/transfer_node.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/transfer_node.png
new file mode 100644
index 00000000000..dc3cf41c12d
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/transfer_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook-fires-successfully.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook-fires-successfully.png
new file mode 100644
index 00000000000..97ada0559b0
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook-fires-successfully.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook-signing.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook-signing.mdx
new file mode 100644
index 00000000000..a0e589e4c96
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook-signing.mdx
@@ -0,0 +1,43 @@
+---
+title: Webhook Signing
+---
+
+Bland webhooks are signed with a secret key to ensure that they are not tampered with in transit and to confirm that they were sent by Bland.
+
+## Signing Webhooks
+
+When Bland sends a webhook, it calculates a signature using the HMAC algorithm with the SHA-256 hash function. The signature is then included in the `X-Webhook-Signature` header of the request.
+
+To create a webhook signing secret, first go to the [Account Settings in the Dev Portal](https://app.bland.ai/dashboard?page=settings) and click on the "Keys" tab.
+
+Here you can create a new secret by clicking "Replace Secret". It will only be shown once, so save it securely.
+
+## Verifying Webhooks
+
+To verify a webhook, you need to calculate the HMAC signature of the request body using the secret key and compare it to the signature in the `X-Webhook-Signature` header.
+
+Note that you must first create a webhook signing secret in the [Account Settings in the Dev Portal](https://app.bland.ai/dashboard?page=settings).
+
+Here is an example of how to verify a webhook in Node.js:
+
+```javascript
+const crypto = require("node:crypto");
+
+function verifyWebhookSignature(key, data, signature) {
+ const expectedSignature = crypto.createHmac("sha256", key).update(data).digest("hex");
+
+ return expectedSignature === signature;
+}
+
+//...
+
+app.post("/webhook", (req, res) => {
+ const isValid = verifyWebhookSignature(
+ process.env.WEBHOOK_SECRET,
+ JSON.stringify(req.body),
+ req.headers["x-webhook-signature"],
+ );
+
+ //...
+});
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook.png
new file mode 100644
index 00000000000..3791fac78a6
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook_node.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook_node.png
new file mode 100644
index 00000000000..dfeaa4cea5c
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhook_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhooks.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhooks.mdx
new file mode 100644
index 00000000000..e6983442732
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/tutorials/webhooks.mdx
@@ -0,0 +1,49 @@
+---
+title: "Webhooks"
+---
+
+
+
+## Introduction
+
+This is a quick tutorial to help you set up and test your Bland AI webhook. We'll include instructions both for inbound and outbound phone calls.
+
+We'll start with inbound because it's more popular.
+
+## Step 1: Create your webhook
+
+To create a test webhook visit [Webhook.site](https://webhook.site/)
+
+The website will automatically provide you a unique webhook URL.
+
+## Step 2: Connect to your inbound phone number
+
+Open your [developer portal](https://app.bland.ai) and visit the [inbound phone numbers](https://app.bland.ai/home?page=inbound-number) page.
+
+
+
+Paste your webhook into the `webhook` field. Make sure to remove the initial `https://` when you insert the URL. Then click `test webhook`.
+
+## Step 3: Verifying your outputs
+
+Navigate to webhook.site page, and check if the test webhook fired correctly. You'll know it worked because a new record will populate.
+
+
+
+At this point, if your record fails to populate, double check that you provided the correct URL - and that you REMOVED the initial `https://` from it.
+
+Otherwise, if issues persist, jump into the [discord](https://discord.gg/QvxDz8zcKe) - one of our teammates will help you asap.
+
+## Step 4: test a live phone call
+
+Call your inbound phone number. Once it ends, visit the Webhook site and confirm once again that a new record populated.
+
+If that's working, then you're set!
+
+## Step 5: Testing for outbound calls
+
+To test for outbound calls, once again create your webhook by referring back to step 1.
+
+Then, follow the [send phone call docs](https://docs.bland.ai/api-v1/post/calls) to create and send a phone call. Make sure you include the `webhook` as a parameter in your request. After, confirm that the webhook data populated on your webhook site page.
+
+And again, if you encounter issues, jump into [discord](https://discord.gg/QvxDz8zcKe) and message us - we will help asap.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/welcome-to-bland.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/welcome-to-bland.mdx
new file mode 100644
index 00000000000..ed065b906ba
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/bland/welcome-to-bland.mdx
@@ -0,0 +1,51 @@
+---
+title: Welcome to Bland AI
+---
+
+Bland is a platform for AI phone calling. Using our API, you can easily send or receive phone calls with a programmable voice agent.
+
+We really care about making our phone calls...
+
+1. **Fast**: sub-second latency from person speaking to AI responding.
+2. **Reliable**: it's our responsibility, day in and day out, to make sure your phone calls work. No exceptions.
+3. **Ultra flexible**: configure all aspects of your agent's behavior, by settings it's voice, creating transfer scenarios, configuring the initial greeting, etc.
+
+# What you can do with Bland
+
+
+
+ Dispatch AI phone calls to call customers, leads, and to streamline operations.
+
+
+ Create inbound phone numbers for customer support, etc.
+
+
+ Connect external APIs and take live actions during phone calls.
+
+
+ Extract JSON data to answer questions about your calls.
+
+
+ Simultaneously send thousands of calls at once.
+
+
+ Fine-tune a custom LLM using your enterprise' call recordings and transcripts.
+
+
+
+# Getting started
+
+
+
+ Read the API reference.
+
+
+ Learn to send your first phone call and test your agents.
+
+
+ Sign up on the developer portal.
+
+
+ Learn about enterprise features & meet with a member of the Bland AI team.
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/OpenApiSpec.yaml b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/OpenApiSpec.yaml
new file mode 100644
index 00000000000..07cc51c6671
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/OpenApiSpec.yaml
@@ -0,0 +1,4859 @@
+openapi: 3.0.0
+info:
+ title: Layer API
+ version: 1.0.0
+
+paths:
+ /whoami:
+ get:
+ summary: 'Get client info'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RootInfoResponse'
+ /v1/activity:
+ get:
+ summary: 'Summary of activities for all businesses'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ClientActivitySummary'
+ /v1/activity/businesses/{businessId}:
+ get:
+ summary: 'Summary of business activities'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/BusinessActivitySummary'
+
+ /v1/activity/businesses/{businessId}/activities:
+ get:
+ summary: 'List business activities'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTypedActivity'
+
+ /v1/unit-transactions:
+ post:
+ summary: 'Import transactions'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/FlatUnitTransactionInput'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/FlatUnitTransactionResult'
+
+ /v1/businesses/{id}/auth-token:
+ get:
+ summary: 'Get business auth token'
+ parameters:
+ - name: id
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AuthToken'
+
+ /v1/configure/plaid:
+ get:
+ summary: 'Get plaid client id and secret'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidConfigurationResponse'
+ put:
+ summary: 'Configure plaid client id and secret'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidConfigurationInput'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidConfigurationResponse'
+
+ /v1/configure/stripe:
+ get:
+ summary: 'Get stripe secret'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/StripeConfigurationResponse'
+ put:
+ summary: 'Configure stripe secret'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/StripeConfigurationInput'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/StripeConfigurationResponse'
+
+ /v1/businesses:
+ post:
+ summary: 'Create new business'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewBusinessParams'
+ responses:
+ '201':
+ description: CREATED
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiBusiness'
+ get:
+ summary: 'List businesses'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiBusiness'
+
+ /v1/businesses/{businessId}:
+ get:
+ summary: 'Get business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiBusiness'
+ put:
+ summary: 'Update business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/BusinessUpdatePayload'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiBusiness'
+
+ /v1/businesses/{businessId}/archive:
+ put:
+ summary: 'Archive business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiBusiness'
+
+ /v1/businesses/{businessId}/categories:
+ get:
+ summary: 'List chart of accounts categories for business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CategoryList'
+
+ /v1/businesses/{businessId}/balances:
+ get:
+ summary: 'Get chart of accounts for business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiChartOfAccountsOld'
+
+ /v1/businesses/{businessId}/plaid/items:
+ get:
+ summary: 'List plaid items for business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiPlaidItem'
+
+ /v1/businesses/{businessId}/plaid/items/{plaidItemPlaidId}:
+ delete:
+ summary: 'Delete plaid item from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: plaidItemPlaidId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/plaid/items/{plaidItemPlaidId}/configuration:
+ get:
+ summary: 'Get plaid item configuration'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: plaidItemPlaidId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidItemConfiguration'
+ put:
+ summary: 'Set plaid item configuration'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: plaidItemPlaidId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidItemConfiguration'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidItemConfiguration'
+
+ /v1/businesses/{businessId}/plaid/items/{plaidItemPlaidId}/unlink:
+ post:
+ summary: 'Unlink and archive plaid item and child plaid accounts'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: plaidItemPlaidId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/plaid/link:
+ post:
+ summary: 'Create plaid item link token'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiLinkToken'
+
+ /v1/businesses/{businessId}/plaid/link/exchange:
+ post:
+ summary: 'Exchange plaid token and add item to business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidLinkPublicToken'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/plaid/update-mode-link:
+ post:
+ summary: 'Update plaid link link'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateModeLinkCreationPayload'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiLinkToken'
+
+ /v1/businesses/{businessId}/plaid/accounts:
+ get:
+ summary: 'List plaid accounts for business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiPlaidAccount'
+
+ /v1/businesses/{businessId}/plaid/accounts/{plaidAccountId}/archive:
+ post:
+ summary: 'Archive plaid account'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: plaidAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiPlaidAccount'
+
+ /v1/businesses/{businessId}/plaid/accounts/{plaidAccountId}/reactivate:
+ post:
+ summary: 'Reactivate archived plaid account'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: plaidAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiPlaidAccount'
+
+ /v1/businesses/{businessId}/plaid/accounts/{plaidAccountId}/configuration:
+ get:
+ summary: 'Get plaid account configuration'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: plaidAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidAccountConfiguration'
+ put:
+ summary: 'Set plaid account configuration'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: plaidAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidAccountConfiguration'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlaidAccountConfiguration'
+
+ /v1/businesses/{businessId}/bank-transactions:
+ get:
+ summary: 'List transactions from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiBankTransaction'
+
+ /v1/businesses/{businessId}/bank-transactions/{transactionId}:
+ get:
+ summary: 'Get transaction from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: transactionId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiBankTransaction'
+
+ /v1/businesses/{businessId}/bank-transactions/{transactionId}/categorize:
+ put:
+ summary: 'Categorize transaction'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: transactionId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/BankTransactionCategorization'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiBankTransaction'
+
+ /v1/businesses/{businessId}/bank-transactions/{transactionId}/uncategorize:
+ put:
+ summary: 'Uncategorize transaction'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: transactionId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiBankTransaction'
+
+ /v1/businesses/{businessId}/bank-transactions/{transactionId}/match:
+ put:
+ summary: 'Match transaction'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: transactionId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/MatchPayload'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiMatch'
+
+ /v1/businesses/{businessId}/bank-transactions/bulk-match:
+ post:
+ summary: 'Bulk match transactions'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SuggestedMatchesWithTransactions'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/bank-transactions/{transactionId}/ledger-entries:
+ get:
+ summary: 'List transaction ledger entries'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: transactionId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiLedgerEntry'
+
+ /v1/businesses/{businessId}/payouts/{payoutId}:
+ get:
+ summary: 'Get payout from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: payoutId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiPayout'
+
+ /v1/businesses/{businessId}/invoices/bulk:
+ post:
+ summary: 'Create invoices from batch'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/NewInvoicePostParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiInvoice'
+
+ /v1/businesses/{businessId}/invoices/{invoiceId}:
+ get:
+ summary: 'Get invoice from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: invoiceId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiInvoice'
+
+ /v1/businesses/{businessId}/invoices/{invoiceId}/delete:
+ post:
+ summary: 'Delete invoice from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: invoiceId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiInvoice'
+
+ /v1/businesses/{businessId}/invoices/payments:
+ get:
+ summary: 'List invoice payments from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiInvoicePayment'
+
+ /v1/businesses/{businessId}/invoices/payments/:
+ post:
+ summary: 'Create invoice payments from batch'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CreateStandaloneInvoicePayment'
+
+ /v1/businesses/{businessId}/invoices/payments/{paymentId}:
+ get:
+ summary: 'Get invoice payment from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: paymentId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiInvoicePayment'
+
+ /v1/businesses/{businessId}/invoices/payments/{paymentId}/delete:
+ post:
+ summary: 'Delete invoice payment from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: paymentId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiInvoicePayment'
+
+ /v1/businesses/{businessId}/invoices/refunds/:
+ get:
+ summary: 'List refunds from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiRefund'
+
+ /v1/businesses/{businessId}/external-accounts/:
+ get:
+ summary: 'List linked external accounts from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiExternalAccounts'
+
+ /v1/businesses/{businessId}/external-accounts/{accountId}:
+ get:
+ summary: 'Get linked external account from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: accountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiExternalAccount'
+
+ /v1/businesses/{businessId}/external-accounts/{accountId}/transactions:
+ get:
+ summary: 'Get transactions from linked external account'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: accountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiTransactions'
+
+ /v1/businesses/{businessId}/external-accounts/{accountId}/balance-timestamps:
+ get:
+ summary: 'List balance timestamps from linked external account'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: accountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiBalanceTimestamps'
+
+ /v1/businesses/{businessId}/external-accounts/{accountId}/opening-balance:
+ get:
+ summary: 'Get opening balance from linked external account'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: accountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiOpeningBalance'
+
+ /v1/businesses/{businessId}/external-accounts/{accountId}/archive:
+ post:
+ summary: 'Archive linked external account'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: accountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/custom-accounts/:
+ post:
+ summary: 'Add custom account for business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewCustomAccountParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiCustomAccount'
+ get:
+ summary: 'List custom accounts from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiCustomAccounts'
+
+ /v1/businesses/{businessId}/custom-accounts/{customAccountId}:
+ get:
+ summary: 'Get custom account from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: customAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiCustomAccount'
+
+ patch:
+ summary: 'Update custom account from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: customAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateCustomAccountParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiCustomAccount'
+
+ put:
+ summary: 'Replace custom account from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: customAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewCustomAccountParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiCustomAccount'
+
+ post:
+ summary: 'Upload custom account transactions by JSON'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: customAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewCustomTransactions'
+ responses:
+ '201':
+ description: CREATED
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/custom-accounts/{customAccountId}/archive:
+ post:
+ summary: 'Archive custom account from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: customAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiCustomAccount'
+
+ /v1/businesses/{businessId}/custom-accounts/{customAccountId}/reactivate:
+ post:
+ summary: 'Reactivate custom account from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: customAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiCustomAccount'
+
+ /v1/businesses/{businessId}/custom-accounts/{customAccountId}/balance:
+ post:
+ summary: 'Create custom account balance timestamp'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: customAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewCustomAccountBalance'
+ responses:
+ '201':
+ description: CREATED
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/custom-accounts/{customAccountId}/opening-balance:
+ post:
+ summary: 'Calculate new custom account opening balance entry'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: customAccountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '201':
+ description: CREATED
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiOpeningBalance'
+
+ /v1/businesses/{businessId}/ledger/balances:
+ get:
+ summary: 'List account balances from ledger'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiLedgerBalances'
+
+ /v1/businesses/{businessId}/ledger/chart:
+ get:
+ summary: 'Get chart of accounts from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiChartOfAccounts'
+
+ /v1/businesses/{businessId}/ledger/manual-entries:
+ post:
+ summary: 'Create manual ledger entries'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CreateManualLedgerEntry'
+ responses:
+ '201':
+ description: CREATED
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiManualLedgerEntry'
+
+ /v1/businesses/{businessId}/ledger/accounts:
+ get:
+ summary: 'Get ledger from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiLedger'
+
+ post:
+ summary: 'Create ledger account for business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CreateApiLedgerAccount'
+ responses:
+ '201':
+ description: CREATED
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SingleApiChartAccount'
+
+ /v1/businesses/{businessId}/ledger/accounts/{accountId}/lines:
+ get:
+ summary: 'List ledger account line items'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: accountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiLedgerAccountLineItem'
+
+ /v1/businesses/{businessId}/ledger/entries:
+ get:
+ summary: 'List ledger entries from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiLedgerEntry'
+
+ /v1/businesses/{businessId}/ledger/entries/{entryId}:
+ get:
+ summary: 'Get ledger entry from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: entryId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiLedgerEntryWithTransaction'
+
+ /v1/businesses/{businessId}/ledger/entries/{entryId}/reverse:
+ post:
+ summary: 'Create reversal entry for ledger entry'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: entryId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiLedgerEntryWithTransaction'
+
+ /v1/businesses/{businessId}/reports/profit-and-loss:
+ get:
+ summary: 'Get profit and loss report for business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ProfitAndLoss'
+
+ /v1/businesses/{businessId}/reports/profit-and-loss-entries:
+ get:
+ summary: 'Get profit and loss entries from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/PnlEntry'
+
+ /v1/businesses/{businessId}/reports/download-transactions-csv:
+ get:
+ summary: 'Download ledger transactions from business as csv'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ text/csv:
+ schema:
+ type: string
+
+ /v1/businesses/{businessId}/bank-transactions/tags:
+ post:
+ summary: 'Apply list of tags to list of transactions'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewTagsPostParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+
+ /v1/businesses/{businessId}/bank-transactions/{transactionId}/tags:
+ get:
+ summary: 'List tags applied to transaction'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: transactionId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+
+ /v1/businesses/{businessId}/bank-transactions/{transactionId}/tags/{tagId}:
+ delete:
+ summary: 'Remove tag from transaction'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: transactionId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: tagId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TagsDeleteParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/payouts/tags:
+ post:
+ summary: 'Apply list of tags to list of payouts'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewTagsPostParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+
+ delete:
+ summary: 'Delete list of payout tags'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TagsDeleteParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/payouts/{payoutId}/tags/:
+ get:
+ summary: 'List tags applied to payout'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: payoutId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+
+ /v1/businesses/{businessId}/invoices/tags:
+ post:
+ summary: 'Apply list of tags to list of invoices'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewTagsPostParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+
+ /v1/businesses/{businessId}/invoices/{invoiceId}/tags:
+ get:
+ summary: 'List tags applied to invoice'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: invoiceId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+ /v1/businesses/{businessId}/invoices/payments/{paymentId}/tags:
+ get:
+ summary: 'List tags applied to invoice payment'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: paymentId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+ /v1/businesses/{businessId}/invoices/payments/{paymentId}/allocations/tags:
+ delete:
+ summary: 'Delete tags applied to payment allocation'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: paymentId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TagsDeleteParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EmptyResponse'
+
+ /v1/businesses/{businessId}/invoices/payments/allocations/tags:
+ post:
+ summary: 'Apply list of tags to list of invoice payment allocations'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/NewTagsPostParams'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+
+ /v1/businesses/{businessId}/invoices/payments/{paymentId}/allocations/{allocationId}/tags:
+ get:
+ summary: 'List tags applied to invoice payment allocation'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: paymentId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: allocationId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+
+ /v1/businesses/{businessId}/payouts/:
+ get:
+ summary: 'List payouts from business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiPayout'
+ post:
+ summary: 'Create new payout for business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CreatePayoutParams'
+ responses:
+ '201':
+ description: CREATED
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiPayout'
+
+ /v1/businesses/{businessId}/ledger/accounts/{accountId}:
+ get:
+ summary: 'Get or create ledger account on business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: accountId
+ in: path
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SingleApiChartAccount'
+ put:
+ summary: 'Update ledger account on business'
+ parameters:
+ - name: businessId
+ in: path
+ required: true
+ schema:
+ type: string
+ - name: accountId
+ in: path
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateApiLedgerAccount'
+ responses:
+ '200':
+ description: OK
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SingleApiChartAccount'
+
+
+components:
+ securitySchemes:
+ BearerAuth:
+ type: http
+ scheme: bearer
+ schemas:
+ RootInfoResponse:
+ type: object
+ properties:
+ clientName:
+ type: string
+ description: Name of the client
+ clientId:
+ type: string
+ format: uuid
+ description: Universally unique identifier of the client
+ required:
+ - clientName
+ - clientId
+ ApiChartOfAccounts:
+ type: object
+ properties:
+ accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/NestedApiChartAccount'
+ PlaidConfigurationResponse:
+ type: object
+ properties:
+ client_id:
+ type: string
+ secret_last_4:
+ type: string
+ UpdateCustomAccountParams:
+ type: object
+ properties:
+ external_id:
+ type: string
+ mask:
+ type: string
+ account_name:
+ type: string
+ institution_name:
+ type: string
+ account_type:
+ type: string
+ account_subtype:
+ type: string
+ NewTagsPostParams:
+ type: object
+ properties:
+ key_values:
+ type: array
+ items:
+ $ref: '#/components/schemas/TagKeyValue'
+ transaction_ids:
+ type: array
+ items:
+ type: string
+ format: uuid
+ ApiChartOfAccountsOld:
+ type: object
+ properties:
+ name:
+ type: string
+ accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/Account'
+ CreateManualLedgerEntry:
+ type: object
+ properties:
+ entry_at:
+ type: string
+ format: date-time
+ created_by:
+ type: string
+ memo:
+ type: string
+ line_items:
+ type: array
+ items:
+ $ref: '#/components/schemas/CreateLedgerEntryLineItem'
+ tags:
+ type: array
+ items:
+ $ref: '#/components/schemas/TagKeyValue'
+ CreateApiLedgerAccount:
+ type: object
+ properties:
+ name:
+ type: string
+ normality:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ parent_id:
+ $ref: '#/components/schemas/AccountIdentifier'
+ stable_name:
+ $ref: '#/components/schemas/AccountStableName'
+ account_type:
+ $ref: '#/components/schemas/LedgerAccountType'
+ account_subtype:
+ $ref: '#/components/schemas/LedgerAccountSubtype'
+ MatchPayload:
+ oneOf:
+ - $ref: '#/components/schemas/ConfirmMatch'
+ CreateRefundParams:
+ type: object
+ properties:
+ external_id:
+ type: string
+ refunded_amount:
+ type: integer
+ fee:
+ type: integer
+ completed_at:
+ type: string
+ format: date-time
+ method:
+ $ref: '#/components/schemas/RefundPaymentMethod'
+ processor:
+ type: string
+ invoice_id:
+ type: string
+ format: uuid
+ invoice_external_id:
+ type: string
+ invoice_line_item_id:
+ type: string
+ format: uuid
+ invoice_payment_id:
+ type: string
+ format: uuid
+ invoice_payment_external_id:
+ type: string
+ recipient_name:
+ type: string
+ NewInvoicePostParams:
+ type: object
+ properties:
+ external_id:
+ type: string
+ sent_at:
+ type: string
+ format: date-time
+ due_at:
+ type: string
+ format: date-time
+ voided_at:
+ type: string
+ format: date-time
+ invoice_number:
+ type: string
+ recipient_name:
+ type: string
+ line_items:
+ type: array
+ items:
+ $ref: '#/components/schemas/NewInvoiceLineItem'
+ additional_sales_taxes:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTaxLineItem'
+ additional_discount:
+ type: integer
+ tips:
+ type: integer
+ payments:
+ type: array
+ items:
+ $ref: '#/components/schemas/CreateImmediatePaymentInput'
+ ApiOpeningBalance:
+ type: object
+ properties:
+ external_account_external_id:
+ type: string
+ external_account_source:
+ $ref: '#/components/schemas/TransactionSource'
+ balance:
+ type: integer
+ effective_at:
+ type: string
+ format: date-time
+ created_at:
+ type: string
+ format: date-time
+ updated_at:
+ type: string
+ format: date-time
+ NewBusinessParams:
+ type: object
+ properties:
+ external_id:
+ type: string
+ legal_name:
+ type: string
+ tin:
+ type: string
+ us_state:
+ $ref: '#/components/schemas/USState'
+ entity_type:
+ $ref: '#/components/schemas/BusinessType'
+ phone_number:
+ type: string
+ sms_enabled:
+ type: boolean
+ sms_categorization_start_date:
+ type: string
+ format: date-time
+ activation_at:
+ type: string
+ format: date-time
+ internal_bank_account_ids:
+ type: array
+ items:
+ $ref: '#/components/schemas/NewBusinessUnitAccountId'
+ unit_ids:
+ type: array
+ items:
+ $ref: '#/components/schemas/NewBusinessUnitAccountId'
+ plaid_items:
+ type: array
+ items:
+ $ref: '#/components/schemas/CreatePlaidItem'
+ skip_onboarding:
+ type: boolean
+ industry:
+ $ref: '#/components/schemas/BusinessIndustry'
+ stripe_connect_accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/StripeConnectAccountInput'
+ StripeConfigurationResponse:
+ type: object
+ properties:
+ stripe_secret_last_4:
+ type: string
+ NewCustomAccountBalance:
+ type: object
+ properties:
+ amount:
+ type: integer
+ date:
+ type: string
+ format: date-time
+ UpdateApiLedgerAccount:
+ type: object
+ properties:
+ stable_name:
+ $ref: '#/components/schemas/AccountStableName'
+ name:
+ type: string
+ normality:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ parent_id:
+ $ref: '#/components/schemas/AccountIdentifier'
+ account_type:
+ $ref: '#/components/schemas/LedgerAccountType'
+ account_subtype:
+ $ref: '#/components/schemas/LedgerAccountSubtype'
+ ApiInvoice:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ business_id:
+ type: string
+ format: uuid
+ external_id:
+ type: string
+ status:
+ $ref: '#/components/schemas/InvoiceStatus'
+ sent_at:
+ type: string
+ format: date-time
+ due_at:
+ type: string
+ format: date-time
+ paid_at:
+ type: string
+ format: date-time
+ voided_at:
+ type: string
+ format: date-time
+ invoice_number:
+ type: string
+ recipient_name:
+ type: string
+ line_items:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiInvoiceLineItem'
+ subtotal:
+ type: integer
+ additional_discount:
+ type: integer
+ additional_sales_taxes_total:
+ type: integer
+ additional_sales_taxes:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTaxLineItem'
+ tips:
+ type: integer
+ total_amount:
+ type: integer
+ outstanding_balance:
+ type: integer
+ payment_allocations:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiInvoicePaymentAllocation'
+ imported_at:
+ type: string
+ format: date-time
+ updated_at:
+ type: string
+ format: date-time
+ transaction_tags:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+ ApiBalanceTimestamps:
+ type: object
+ properties:
+ external_account_external_id:
+ type: string
+ external_account_source:
+ $ref: '#/components/schemas/TransactionSource'
+ balance_timestamps:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiBalanceTimestamp'
+ ApiLedgerBalances:
+ type: object
+ properties:
+ accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/NestedApiLedgerAccount'
+ BusinessType:
+ type: string
+ enum:
+ - SOLE_PROP
+ - C_CORP
+ - LLC
+ - S_CORP
+ - PARTNERSHIP
+ USState:
+ type: string
+ enum:
+ - ALABAMA
+ - ALASKA
+ - ARIZONA
+ - ARKANSAS
+ - CALIFORNIA
+ - COLORADO
+ - CONNECTICUT
+ - DELAWARE
+ - DISTRICT_OF_COLUMBIA
+ - FLORIDA
+ - GEORGIA
+ - HAWAII
+ - IDAHO
+ - ILLINOIS
+ - INDIANA
+ - IOWA
+ - KANSAS
+ - KENTUCKY
+ - LOUISIANA
+ - MAINE
+ - MARYLAND
+ - MASSACHUSETTS
+ - MICHIGAN
+ - MINNESOTA
+ - MISSISSIPPI
+ - MISSOURI
+ - MONTANA
+ - NEBRASKA
+ - NEVADA
+ - NEW_HAMPSHIRE
+ - NEW_JERSEY
+ - NEW_MEXICO
+ - NEW_YORK
+ - NORTH_CAROLINA
+ - NORTH_DAKOTA
+ - OHIO
+ - OKLAHOMA
+ - OREGON
+ - PENNSYLVANIA
+ - RHODE_ISLAND
+ - SOUTH_CAROLINA
+ - SOUTH_DAKOTA
+ - TENNESSEE
+ - TEXAS
+ - UTAH
+ - VERMONT
+ - VIRGINIA
+ - WASHINGTON
+ - WEST_VIRGINIA
+ - WISCONSIN
+ - WYOMING
+ - PUERTO_RICO
+ BusinessIndustry:
+ type: string
+ enum:
+ - TRUCKING
+ - DEMO_TRADES
+ - MEDSPA
+ - FLORIST
+ ApiTag:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ key:
+ type: string
+ value:
+ type: string
+ created_at:
+ type: string
+ format: date-time
+ updated_at:
+ type: string
+ format: date-time
+ deleted_at:
+ type: string
+ format: date-time
+ nullable: true
+ UpdateModeLinkCreationPayload:
+ type: object
+ properties:
+ plaid_item_id:
+ type: string
+ ApiBusiness:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ external_id:
+ type: string
+ legal_name:
+ type: string
+ tin:
+ type: string
+ us_state:
+ $ref: '#/components/schemas/USState'
+ entity_type:
+ $ref: '#/components/schemas/BusinessType'
+ industry:
+ $ref: '#/components/schemas/BusinessIndustry'
+ phone_number:
+ type: string
+ sms_enabled:
+ type: boolean
+ sms_categorization_start_date:
+ type: string
+ format: date-time
+ activation_at:
+ type: string
+ format: date-time
+ imported_at:
+ type: string
+ format: date-time
+ updated_at:
+ type: string
+ format: date-time
+ archived_at:
+ type: string
+ format: date-time
+ unit_accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/APIUnitAccount'
+ plaid_items:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiPlaidItem'
+ previously_imported:
+ type: boolean
+ stripe_connect_accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiStripeConnectAccount'
+ ApiMatch:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ match_type:
+ $ref: '#/components/schemas/MatchType'
+ bank_transaction:
+ $ref: '#/components/schemas/ApiBankTransactionInterface'
+ details:
+ $ref: '#/components/schemas/ApiMatchDetails'
+ BusinessActivitySummary:
+ type: object
+ properties:
+ businessId:
+ type: string
+ format: uuid
+ legal_name:
+ type: string
+ sms_sent:
+ type: integer
+ sms_received:
+ type: integer
+ sms_sent_last_30:
+ type: integer
+ sms_received_last_30:
+ type: integer
+ categorized_last_month:
+ type: integer
+ uncategorized_last_month:
+ type: integer
+ categorized_by_api_last_month:
+ type: integer
+ categorized_by_sms_last_month:
+ type: integer
+ categorized_pct_last_month:
+ type: number
+ categorized_this_month:
+ type: integer
+ uncategorized_this_month:
+ type: integer
+ categorized_by_api_this_month:
+ type: integer
+ categorized_by_sms_this_month:
+ type: integer
+ categorized_pct_this_month:
+ type: number
+ days_since_last_activity:
+ type: integer
+ current_sms_queue_length:
+ type: integer
+ EmptyResponse:
+ type: object
+ NewCustomTransactions:
+ type: object
+ properties:
+ new_custom_transaction_params:
+ type: array
+ items:
+ $ref: '#/components/schemas/NewCustomTransactionParams'
+ ClientActivitySummary:
+ type: object
+ properties:
+ businesses_onboarded:
+ type: integer
+ businesses_sent_sms:
+ type: integer
+ businesses_engaged:
+ type: integer
+ businesses_engaged_last_30:
+ type: integer
+ new_businesses_engaged_last_30:
+ type: integer
+ businesses_engaged_last_90:
+ type: integer
+ new_businesses_engaged_last_90:
+ type: integer
+ categorized_by_sms_last_30:
+ type: integer
+ categorized_by_api_last_30:
+ type: integer
+ ApiCustomAccounts:
+ type: object
+ properties:
+ custom_accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiCustomAccount'
+ PnlEntry:
+ anyOf:
+ - $ref: '#/components/schemas/BankTransactionPnlEntry'
+ - $ref: '#/components/schemas/SplitBankTransactionPnlEntry'
+ ExternalAccountQueryParams:
+ type: object
+ properties:
+ account_source:
+ $ref: '#/components/schemas/TransactionSource'
+ start_date:
+ type: string
+ format: date-time
+ end_date:
+ type: string
+ format: date-time
+
+
+
+ TagsDeleteParams:
+ type: object
+ properties:
+ tag_ids:
+ type: array
+ items:
+ type: string
+ format: uuid
+ description: List of tag IDs to delete
+
+ ApiLinkToken:
+ type: object
+ properties:
+ link_token:
+ type: string
+ description: The link token to use for Plaid authentication
+
+ ApiPlaidAccount:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ description: Universally unique identifier of the Plaid account
+ plaid_account_id:
+ type: string
+ description: Plaid's unique identifier for the account
+ plaid_item_id:
+ type: string
+ description: Plaid's unique identifier for the item
+ status:
+ $ref: '#/components/schemas/AccountStatus'
+ mask:
+ type: string
+ nullable: true
+ description: Last 4 digits of the account number
+ name:
+ type: string
+ nullable: true
+ description: Name of the account
+ account_type:
+ type: string
+ nullable: true
+ description: Type of the account
+ subtype:
+ type: string
+ nullable: true
+ description: Subtype of the account
+ created_at:
+ type: string
+ format: date-time
+ description: Timestamp when the account was created
+ updated_at:
+ type: string
+ format: date-time
+ description: Timestamp when the account was last updated
+ PlaidItemConfiguration:
+ type: object
+ properties:
+ sync_transactions:
+ type: boolean
+ description: Whether to sync transactions for this item
+ current_cursor:
+ type: string
+ nullable: true
+ description: The current cursor position for transaction sync
+ archived:
+ type: boolean
+ description: Whether this item configuration is archived
+
+ PlaidInstitution:
+ type: object
+ properties:
+ name:
+ type: string
+ description: The name of the financial institution
+ institution_id:
+ type: string
+ description: Plaid's unique identifier for the institution
+
+ PlaidLinkPublicToken:
+ type: object
+ properties:
+ public_token:
+ type: string
+ description: The public token returned by Plaid Link
+ institution:
+ $ref: '#/components/schemas/PlaidInstitution'
+
+ PlaidAccountConfiguration:
+ type: object
+ properties:
+ sync_from_time:
+ type: string
+ format: date-time
+ nullable: true
+ description: Timestamp to start syncing account transactions from
+ status:
+ $ref: '#/components/schemas/AccountStatus'
+
+ CreatePlaidItem:
+ type: object
+ properties:
+ item_id:
+ type: string
+ description: Plaid's unique identifier for the item
+ access_token:
+ type: string
+ description: Access token for the Plaid item
+ sync_transactions:
+ type: boolean
+ default: true
+ description: Whether to sync transactions for this item
+ institution_plaid_id:
+ type: string
+ nullable: true
+ description: Plaid's identifier for the institution
+
+ ApiPlaidInstitution:
+ type: object
+ properties:
+ id:
+ type: string
+ description: Plaid's unique identifier for the institution
+ name:
+ type: string
+ description: The name of the financial institution
+ logo:
+ type: string
+ nullable: true
+ description: URL for the institution's logo
+
+
+ ApiTransactions:
+ type: object
+ properties:
+ external_account_external_id:
+ type: string
+ external_account_source:
+ $ref: '#/components/schemas/TransactionSource'
+ transactions:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiBankTransactionDataOnly'
+ AccountStatus:
+ type: string
+ enum:
+ - ACTIVE
+ - ARCHIVED
+ ApiInvoicePayment:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ external_id:
+ type: string
+ nullable: true
+ at:
+ type: string
+ format: date-time
+ method:
+ $ref: '#/components/schemas/PaymentMethod'
+ fee:
+ type: integer
+ format: int64
+ amount:
+ type: integer
+ format: int64
+ processor:
+ type: string
+ nullable: true
+ imported_at:
+ type: string
+ format: date-time
+ allocations:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiInvoicePaymentAllocation'
+ transaction_tags:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+ ApiBankTransaction:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ description: Universally unique identifier of the bank transaction
+ business_id:
+ type: string
+ format: uuid
+ description: Universally unique identifier of the business
+ source:
+ $ref: '#/components/schemas/TransactionSource'
+ source_transaction_id:
+ type: string
+ description: Transaction ID from the source
+ source_account_id:
+ type: string
+ description: Account ID from the source
+ imported_at:
+ type: string
+ format: date-time
+ description: Timestamp when the transaction was imported
+ date:
+ type: string
+ format: date-time
+ description: Date of the transaction
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ amount:
+ type: integer
+ format: int64
+ description: Transaction amount in cents
+ counterparty_name:
+ type: string
+ nullable: true
+ description: Name of the transaction counterparty
+ description:
+ type: string
+ nullable: true
+ description: Description of the transaction
+ account_name:
+ type: string
+ nullable: true
+ description: Name of the bank account
+ categorization_status:
+ $ref: '#/components/schemas/CategorizationStatus'
+ category:
+ $ref: '#/components/schemas/ApiCategorization'
+ categorization_method:
+ $ref: '#/components/schemas/ClassifierAgent'
+ categorization_flow:
+ $ref: '#/components/schemas/ApiCategorizationFlow'
+ categorization_ux:
+ $ref: '#/components/schemas/CategorizationUX'
+ projected_income_category:
+ $ref: '#/components/schemas/ProjectedIncomeCategory'
+ suggested_matches:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiSuggestedMatch'
+ match:
+ $ref: '#/components/schemas/ApiMatch'
+ transaction_tags:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+ ApiManualLedgerEntry:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ description: Universally unique identifier of the manual ledger entry
+ created_by:
+ type: string
+ description: Name of the user who created the manual ledger entry
+ memo:
+ type: string
+ description: Memo or description for the manual ledger entry
+ entry_id:
+ type: string
+ description: ID of the associated ledger entry
+ ApiExternalAccount:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ description: Universally unique identifier of the external account
+ external_account_external_id:
+ type: string
+ description: External ID of the external account
+ external_account_source:
+ $ref: '#/components/schemas/TransactionSource'
+ external_account_name:
+ type: string
+ description: Name of the external account
+ latest_balance_timestamp:
+ $ref: '#/components/schemas/ApiBalanceTimestamp'
+ current_ledger_balance:
+ type: integer
+ format: int64
+ description: Current ledger balance of the external account in cents
+ mask:
+ type: string
+ nullable: true
+ description: Masked account number of the external account
+ institution:
+ $ref: '#/components/schemas/ApiExternalAccountInstitution'
+ connection_needs_repair_as_of:
+ type: string
+ format: date-time
+ nullable: true
+ description: Timestamp indicating when the connection started needing repair
+ SingleApiChartAccount:
+ type: object
+ properties:
+ id:
+ $ref: '#/components/schemas/AccountIdentifier'
+ name:
+ type: string
+ description: Name of the account
+ stable_name:
+ $ref: '#/components/schemas/AccountStableName'
+ normality:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ account_type:
+ $ref: '#/components/schemas/ApiLedgerAccountType'
+ account_subtype:
+ $ref: '#/components/schemas/ApiLedgerAccountSubtype'
+ ApiCustomAccount:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ external_id:
+ type: string
+ mask:
+ type: string
+ nullable: true
+ account_name:
+ type: string
+ institution_name:
+ type: string
+ account_type:
+ type: string
+ nullable: true
+ account_subtype:
+ type: string
+ nullable: true
+ created_at:
+ type: string
+ format: date-time
+ nullable: true
+ updated_at:
+ type: string
+ format: date-time
+ nullable: true
+ archived_at:
+ type: string
+ format: date-time
+ nullable: true
+ ApiLedgerEntryWithTransaction:
+ type: object
+ properties:
+ id:
+ type: string
+ description: Unique identifier of the ledger entry
+ business_id:
+ type: string
+ format: uuid
+ ledger_id:
+ type: string
+ agent:
+ oneOf:
+ - $ref: '#/components/schemas/ClassifierAgent'
+ entry_type:
+ oneOf:
+ - $ref: '#/components/schemas/LedgerEntryType'
+ date:
+ type: string
+ format: date-time
+ entry_at:
+ type: string
+ format: date-time
+ reversal_of_id:
+ type: string
+ nullable: true
+ reversal_id:
+ type: string
+ nullable: true
+ line_items:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiLineItem'
+ transaction:
+ oneOf:
+ - $ref: '#/components/schemas/ApiBankTransaction'
+ invoice:
+ oneOf:
+ - $ref: '#/components/schemas/ApiInvoice'
+ manual_entry:
+ oneOf:
+ - $ref: '#/components/schemas/ApiManualLedgerEntry'
+ source:
+ oneOf:
+ - $ref: '#/components/schemas/LedgerEntrySource'
+ ApiLineItem:
+ type: object
+ properties:
+ id:
+ type: string
+ entry_id:
+ type: string
+ account:
+ $ref: '#/components/schemas/SingleApiChartAccount'
+ amount:
+ type: integer
+ format: int64
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ entry_at:
+ type: string
+ format: date-time
+ createdAt:
+ type: string
+ format: date-time
+ CreatePayoutParams:
+ type: object
+ properties:
+ external_id:
+ type: string
+ paid_out_amount:
+ type: integer
+ format: int64
+ fee:
+ type: integer
+ format: int64
+ refunds_amount:
+ type: integer
+ format: int64
+ processor:
+ $ref: '#/components/schemas/PaymentProcessor'
+ completed_at:
+ type: string
+ format: date-time
+ payments:
+ type: array
+ items:
+ $ref: '#/components/schemas/PayoutPaymentInput'
+ overwrite_payment_fees:
+ type: boolean
+ nullable: true
+ PayoutPaymentInput:
+ type: object
+ properties:
+ invoice_payment_external_id:
+ type: string
+ amount:
+ type: integer
+ format: int64
+ ApiPayout:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ external_id:
+ type: string
+ nullable: true
+ business_id:
+ type: string
+ format: uuid
+ paid_out_amount:
+ type: integer
+ format: int64
+ fee:
+ type: integer
+ format: int64
+ processor:
+ $ref: '#/components/schemas/PaymentProcessor'
+ imported_at:
+ type: string
+ format: date-time
+ completed_at:
+ type: string
+ format: date-time
+ match:
+ oneOf:
+ - $ref: '#/components/schemas/ApiMatch'
+ payments:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiInvoicePayment'
+ transaction_tags:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+ ApiExternalAccounts:
+ type: object
+ properties:
+ external_accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiExternalAccount'
+ ApiLedger:
+ type: object
+ properties:
+ accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/NestedApiLedgerAccount'
+ entries:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiLedgerEntry'
+ PlaidConfigurationInput:
+ type: object
+ properties:
+ client_id:
+ type: string
+ secret:
+ type: string
+ ApiLedgerEntry:
+ type: object
+ properties:
+ id:
+ type: string
+ business_id:
+ type: string
+ format: uuid
+ ledger_id:
+ type: string
+ agent:
+ oneOf:
+ - $ref: '#/components/schemas/ClassifierAgent'
+ entry_type:
+ oneOf:
+ - $ref: '#/components/schemas/LedgerEntryType'
+ date:
+ type: string
+ format: date-time
+ entry_at:
+ type: string
+ format: date-time
+ reversal_of_id:
+ type: string
+ nullable: true
+ reversal_id:
+ type: string
+ nullable: true
+ line_items:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiLineItem'
+
+ NestedApiChartAccount:
+ type: object
+ properties:
+ id:
+ $ref: '#/components/schemas/AccountIdentifier'
+ name:
+ type: string
+ stable_name:
+ oneOf:
+ - $ref: '#/components/schemas/AccountStableName'
+ normality:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ account_type:
+ oneOf:
+ - $ref: '#/components/schemas/ApiLedgerAccountType'
+ account_subtype:
+ oneOf:
+ - $ref: '#/components/schemas/ApiLedgerAccountSubtype'
+ sub_accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/NestedApiChartAccount'
+ CreateLedgerEntryLineItem:
+ type: object
+ properties:
+ account_identifier:
+ $ref: '#/components/schemas/AccountIdentifier'
+ amount:
+ type: integer
+ format: int64
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ TagKeyValue:
+ type: object
+ properties:
+ key:
+ type: string
+ value:
+ type: string
+ NewInvoiceLineItem:
+ type: object
+ properties:
+ account_identifier:
+ oneOf:
+ - $ref: '#/components/schemas/AccountIdentifier'
+ description:
+ type: string
+ nullable: true
+ product:
+ type: string
+ unit_price:
+ type: integer
+ format: int64
+ quantity:
+ type: number
+ format: bigdecimal
+ nullable: true
+ discount_amount:
+ type: integer
+ format: int64
+ nullable: true
+ sales_taxes:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTaxLineItem'
+ nullable: true
+ is_prepayment:
+ type: boolean
+ nullable: true
+ CreateImmediatePaymentInput:
+ type: object
+ properties:
+ external_id:
+ type: string
+ nullable: true
+ method:
+ $ref: '#/components/schemas/PaymentMethod'
+ fee:
+ type: integer
+ format: int64
+ nullable: true
+ amount:
+ type: integer
+ format: int64
+ processor:
+ type: string
+ nullable: true
+ ApiTaxLineItem:
+ type: object
+ properties:
+ tax_account:
+ oneOf:
+ - $ref: '#/components/schemas/TaxAccountIdentifier'
+ amount:
+ type: integer
+ format: int64
+ NewBusinessUnitAccountId:
+ type: object
+ properties:
+ unit_id:
+ type: string
+ account_name:
+ type: string
+ nullable: true
+ opening_balance_init_to_zero:
+ type: boolean
+ opening_balance_do_not_init:
+ type: boolean
+ StripeConnectAccountInput:
+ type: object
+ properties:
+ stripe_id:
+ type: string
+ TransactionSource:
+ type: string
+ enum:
+ - UNIT
+ - PLAID
+ - API
+ - STRIPE
+ - CUSTOM
+ ApiStripeConnectAccount:
+ type: object
+ properties:
+ stripe_connect_account_stripe_id:
+ type: string
+ last_synced_at:
+ type: string
+ format: date-time
+ nullable: true
+ archived_at:
+ type: string
+ format: date-time
+ nullable: true
+ created_at:
+ type: string
+ format: date-time
+ created_in_stripe:
+ type: string
+ format: date-time
+ merchant_name:
+ type: string
+ nullable: true
+ MatchType:
+ type: string
+ enum:
+ - TRANSFER
+ - INVOICE_PAYMENT
+ - PAYOUT
+ ApiBankTransactionInterface:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ business_id:
+ type: string
+ format: uuid
+ source:
+ $ref: '#/components/schemas/TransactionSource'
+ source_transaction_id:
+ type: string
+ source_account_id:
+ type: string
+ imported_at:
+ type: string
+ format: date-time
+ date:
+ type: string
+ format: date-time
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ amount:
+ type: integer
+ format: int64
+ counterparty_name:
+ type: string
+ nullable: true
+ description:
+ type: string
+ nullable: true
+ account_name:
+ type: string
+ nullable: true
+ categorization_status:
+ $ref: '#/components/schemas/CategorizationStatus'
+ ApiMatchDetails:
+ type: object
+ required:
+ - id
+ - amount
+ - date
+ properties:
+ id:
+ type: string
+ format: uuid
+ amount:
+ type: integer
+ format: int64
+ date:
+ type: string
+ format: date-time
+ description:
+ type: string
+ nullable: true
+ InvoiceStatus:
+ type: string
+ enum:
+ - SENT
+ - PARTIALLY_PAID
+ - PAID
+ - VOIDED
+ ApiInvoiceLineItem:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ invoice_id:
+ type: string
+ format: uuid
+ account_identifier:
+ oneOf:
+ - $ref: '#/components/schemas/AccountIdentifier'
+ description:
+ type: string
+ nullable: true
+ product:
+ type: string
+ nullable: true
+ unit_price:
+ $ref: '#/components/schemas/SignedAmount'
+ quantity:
+ type: number
+ format: bigdecimal
+ subtotal:
+ type: integer
+ format: int64
+ discount_amount:
+ type: integer
+ format: int64
+ sales_taxes_total:
+ type: integer
+ format: int64
+ sales_taxes:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTaxLineItem'
+ nullable: true
+ total_amount:
+ type: integer
+ format: int64
+ ApiInvoicePaymentAllocation:
+ type: object
+ properties:
+ invoice_id:
+ type: string
+ format: uuid
+ payment_id:
+ type: string
+ format: uuid
+ amount:
+ type: integer
+ format: int64
+ transaction_tags:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiTag'
+ PaymentMethod:
+ type: string
+ enum:
+ - CASH
+ - CHECK
+ - CREDIT_CARD
+ - ACH
+ - REDEEMED_PREPAYMENT
+ - OTHER
+
+ PaymentProcessor:
+ type: string
+ enum:
+ - STRIPE
+ - PAYPAL
+
+ PaymentBalanceTransactionType:
+ type: string
+ enum:
+ - charge
+ - payment
+ - refund
+ - payment_refund
+
+
+
+ ClassifierAgent:
+ type: string
+ enum:
+ - SMS
+ - API
+ - LAYER_AUTO
+ - LAYER_MANUAL
+
+ ProjectedIncomeCategory:
+ type: string
+ enum:
+ - REVENUE
+ - EXPENSE
+ - EXCLUDE
+
+ LayerApiSortOrder:
+ type: string
+ enum:
+ - ASC
+ - ASCENDING
+ - DES
+ - DESC
+ - DESCENDING
+
+ ReportingBasis:
+ type: string
+ enum:
+ - ACCRUAL
+ - CASH
+
+ BusinessLedgerProvider:
+ type: string
+ enum:
+ - MODERN_TREASURY
+ - LOCAL
+ - SPLITS_ONLY
+
+ BusinessLedgerStatus:
+ type: string
+ enum:
+ - CREATING
+ - ACTIVE
+ - CREATION_FAILED
+ - MIGRATING
+
+ ApiErrorType:
+ type: string
+ enum:
+ - ResourceArchived
+ - AuthFailure
+ - Plaid
+ - Stripe
+ - InvalidState
+ - ResourceNotFound
+ - InvalidParameters
+ - JsonSerialization
+ - Unknown
+ - BadRequest
+ - PaginationCursor
+ - Conflict
+ CurrencyCode:
+ type: string
+ enum:
+ - AED
+ - AFN
+ - ALL
+ - AMD
+ - ANG
+ - AOA
+ - ARS
+ - AUD
+ - AWG
+ - AZN
+ - BAM
+ - BBD
+ - BDT
+ - BGN
+ - BHD
+ - BIF
+ - BMD
+ - BND
+ - BOB
+ - BRL
+ - BSD
+ - BTN
+ - BWP
+ - BYR
+ - BZD
+ - CAD
+ - CDF
+ - CHF
+ - CLP
+ - CNY
+ - COP
+ - CRC
+ - CUC
+ - CUP
+ - CVE
+ - CZK
+ - DJF
+ - DKK
+ - DOP
+ - DZD
+ - EGP
+ - ERN
+ - ETB
+ - EUR
+ - FJD
+ - FKP
+ - GBP
+ - GEL
+ - GGP
+ - GHS
+ - GIP
+ - GMD
+ - GNF
+ - GTQ
+ - GYD
+ - HKD
+ - HNL
+ - HRK
+ - HTG
+ - HUF
+ - IDR
+ - ILS
+ - IMP
+ - INR
+ - IQD
+ - IRR
+ - ISK
+ - JEP
+ - JMD
+ - JOD
+ - JPY
+ - KES
+ - KGS
+ - KHR
+ - KMF
+ - KPW
+ - KRW
+ - KWD
+ - KYD
+ - KZT
+ - LAK
+ - LBP
+ - LKR
+ - LRD
+ - LSL
+ - LYD
+ - MAD
+ - MDL
+ - MGA
+ - MKD
+ - MMK
+ - MNT
+ - MOP
+ - MRO
+ - MUR
+ - MVR
+ - MWK
+ - MXN
+ - MYR
+ - MZN
+ - NAD
+ - NGN
+ - NIO
+ - NOK
+ - NPR
+ - NZD
+ - OMR
+ - PAB
+ - PEN
+ - PGK
+ - PHP
+ - PKR
+ - PLN
+ - PYG
+ - QAR
+ - RON
+ - RSD
+ - RUB
+ - RWF
+ - SAR
+ - SBD
+ - SCR
+ - SDG
+ - SEK
+ - SGD
+ - SHP
+ - SLL
+ - SOS
+ - SPL
+ - SRD
+ - STD
+ - SVC
+ - SYP
+ - SZL
+ - THB
+ - TJS
+ - TMT
+ - TND
+ - TOP
+ - TRY
+ - TTD
+ - TVD
+ - TWD
+ - TZS
+ - UAH
+ - UGX
+ - USD
+ - UYU
+ - UZS
+ - VEF
+ - VND
+ - VUV
+ - WST
+ - XAF
+ - XCD
+ - XDR
+ - XOF
+ - XPF
+ - YER
+ - ZAR
+ - ZMW
+ - ZWD
+ PnlTemplates:
+ type: string
+ enum:
+ - DEFAULT
+ - TRUCKING
+ - MEDSPA
+ - MEDSPA_NO_LICENSING
+ - CITRUS
+ - CITRUS_NO_LICENSING
+ - FLORIST
+
+
+
+ ClientStringName:
+ type: string
+ enum:
+ - CAUGHT_UP_LINK_PROMPT
+ - CAUGHT_UP_ONBOARDING_LINK_PROMPT
+ - ONBOARDING_COMPLETE_NOT_CAUGHT_UP
+ - CATEGORIZE_IN_APP_PROMPT
+
+ FallbackChildHandling:
+ type: string
+ enum:
+ - LINE_ITEM
+ - OTHER_BUCKET
+ - OMIT
+ - THROW_ERROR
+ BusinessUpdatePayload:
+ type: object
+ properties:
+ legalName:
+ type: string
+ nullable: true
+ tin:
+ type: string
+ nullable: true
+ usState:
+ nullable: true
+ allOf:
+ - $ref: '#/components/schemas/USState'
+ entityType:
+ nullable: true
+ allOf:
+ - $ref: '#/components/schemas/BusinessType'
+ industry:
+ nullable: true
+ allOf:
+ - $ref: '#/components/schemas/BusinessIndustry'
+ phoneNumber:
+ type: string
+ nullable: true
+ smsEnabled:
+ type: boolean
+ nullable: true
+ smsCategorizationStartDate:
+ type: string
+ format: date-time
+ nullable: true
+ activationAt:
+ type: string
+ format: date-time
+ nullable: true
+ archivedAt:
+ type: string
+ format: date-time
+ nullable: true
+ unitIds:
+ type: array
+ items:
+ $ref: '#/components/schemas/NewBusinessUnitAccountId'
+ nullable: true
+ internalBankAccountIds:
+ type: array
+ items:
+ $ref: '#/components/schemas/NewBusinessUnitAccountId'
+ nullable: true
+ plaidItems:
+ type: array
+ items:
+ $ref: '#/components/schemas/CreatePlaidItem'
+ nullable: true
+ stripeConnectAccounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/StripeConnectAccountInput'
+ nullable: true
+ ApiExternalAccountInstitution:
+ type: object
+ properties:
+ name:
+ type: string
+ logo:
+ type: string
+ nullable: true
+ ApiSuggestedMatch:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ matchType:
+ $ref: '#/components/schemas/MatchType'
+ details:
+ $ref: '#/components/schemas/ApiMatchDetails'
+ CategorizationUX:
+ type: object
+ properties:
+ prompt:
+ type: string
+ nullable: true
+ options:
+ type: array
+ items:
+ $ref: '#/components/schemas/CategorizationOption'
+
+ CategorizationOption:
+ oneOf:
+ - $ref: '#/components/schemas/CategorizationOption_MenuOption'
+ - $ref: '#/components/schemas/CategorizationOption_CategorizeOption'
+ - $ref: '#/components/schemas/CategorizationOption_SplitOption'
+ - $ref: '#/components/schemas/CategorizationOption_FreeSelectOption'
+
+ CategorizationOption_MenuOption:
+ type: object
+ properties:
+ name:
+ type: string
+ display_string:
+ type: string
+ tooltip:
+ type: string
+ nullable: true
+ menu_options:
+ type: array
+ items:
+ $ref: '#/components/schemas/CategorizationOption'
+
+ CategorizationOption_CategorizeOption:
+ type: object
+ properties:
+ name:
+ type: string
+ display_string:
+ type: string
+ tooltip:
+ type: string
+ nullable: true
+ account:
+ $ref: '#/components/schemas/ApiCategorization'
+
+ CategorizationOption_SplitOption:
+ type: object
+ properties:
+ name:
+ type: string
+ default: SPLIT
+ display_string:
+ type: string
+ default: Split
+ tooltip:
+ type: string
+ nullable: true
+
+ CategorizationOption_FreeSelectOption:
+ type: object
+ properties:
+ name:
+ type: string
+ default: FREE_SELECT
+ display_string:
+ type: string
+ default: Something else
+ tooltip:
+ type: string
+ nullable: true
+ ApiCategorizationFlow:
+ type: object
+ properties:
+ type:
+ $ref: '#/components/schemas/InputStrategy'
+ category:
+ oneOf:
+ - $ref: '#/components/schemas/ApiCategorization'
+ suggestions:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiCategorization'
+ nullable: true
+ CategorizationStatus:
+ type: string
+ enum:
+ - UNCATEGORIZED
+ - AUTO_CATEGORIZED
+ - CATEGORIZED
+ - DELETED
+ - TRANSFER
+ - REFUND
+ - INVOICE_PAYMENT
+ StripeConfigurationInput:
+ type: object
+ properties:
+ secret:
+ type: string
+ NewCustomAccountParams:
+ type: object
+ properties:
+ external_id:
+ type: string
+ mask:
+ type: string
+ account_name:
+ type: string
+ institution_name:
+ type: string
+ account_type:
+ type: string
+ account_subtype:
+ type: string
+ CreateStandaloneInvoicePayment:
+ type: object
+ properties:
+ external_id:
+ type: string
+ nullable: true
+ paid_at:
+ type: string
+ format: date-time
+ method:
+ $ref: '#/components/schemas/PaymentMethod'
+ fee:
+ type: integer
+ format: int64
+ nullable: true
+ amount:
+ type: integer
+ format: int64
+ processor:
+ type: string
+ nullable: true
+ invoice_payments:
+ type: array
+ items:
+ $ref: '#/components/schemas/InvoicePaymentAllocationInput'
+ InvoicePaymentAllocationInput:
+ type: object
+ properties:
+ invoice_id:
+ type: string
+ format: uuid
+ amount:
+ type: integer
+ format: int64
+ ApiRefund:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ external_id:
+ type: string
+ nullable: true
+ refunded_amount:
+ type: integer
+ format: int64
+ fee:
+ type: integer
+ format: int64
+ completed_at:
+ type: string
+ format: date-time
+ method:
+ $ref: '#/components/schemas/RefundPaymentMethod'
+ processor:
+ type: string
+ nullable: true
+ invoice_id:
+ type: string
+ format: uuid
+ nullable: true
+ invoice_line_item_id:
+ type: string
+ format: uuid
+ nullable: true
+ invoice_payment_id:
+ type: string
+ format: uuid
+ nullable: true
+ recipient_name:
+ type: string
+ ApiLedgerAccountLineItem:
+ type: object
+ properties:
+ id:
+ type: string
+ entry_id:
+ type: string
+ account:
+ $ref: '#/components/schemas/SingleApiChartAccount'
+ amount:
+ type: integer
+ format: int64
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ date:
+ type: string
+ format: date-time
+ source:
+ $ref: '#/components/schemas/LedgerEntrySource'
+ running_balance:
+ type: integer
+ format: int64
+ transaction:
+ $ref: '#/components/schemas/ApiBankTransaction'
+ invoice:
+ $ref: '#/components/schemas/ApiInvoice'
+ ProfitAndLoss:
+ type: object
+ properties:
+ business_id:
+ type: string
+ format: uuid
+ start_date:
+ type: string
+ format: date-time
+ end_date:
+ type: string
+ format: date-time
+ income:
+ $ref: '#/components/schemas/LineItem'
+ cost_of_goods_sold:
+ oneOf:
+ - $ref: '#/components/schemas/LineItem'
+ gross_profit:
+ type: integer
+ format: int64
+ expenses:
+ $ref: '#/components/schemas/LineItem'
+ profit_before_taxes:
+ type: integer
+ format: int64
+ taxes:
+ $ref: '#/components/schemas/LineItem'
+ net_profit:
+ type: integer
+ format: int64
+ other_outflows:
+ oneOf:
+ - $ref: '#/components/schemas/LineItem'
+ nullable: true
+ personal_expenses:
+ oneOf:
+ - $ref: '#/components/schemas/LineItem'
+ fully_categorized:
+ type: boolean
+ SuggestedMatchesWithTransactions:
+ type: object
+ properties:
+ match_pairs:
+ type: array
+ items:
+ $ref: '#/components/schemas/SuggestedMatchWithTransaction'
+ SuggestedMatchWithTransaction:
+ type: object
+ properties:
+ transaction_id:
+ type: string
+ format: uuid
+ suggested_match_id:
+ type: string
+ format: uuid
+ ApiPlaidItem:
+ type: object
+ properties:
+ item_id:
+ type: string
+ access_token:
+ type: string
+ description: Access token for the Plaid item
+ sync_transactions:
+ type: boolean
+ description: Whether to sync transactions for this item
+ institution:
+ oneOf:
+ - $ref: '#/components/schemas/ApiPlaidInstitution'
+ description: The financial institution associated with this item (may be null for older items)
+ LedgerEntryType:
+ type: string
+ enum:
+ - BANK
+ - MANUAL
+ - OPENING_BALANCE
+ ApiLedgerAccountType:
+ type: object
+ properties:
+ value:
+ $ref: '#/components/schemas/LedgerAccountType'
+ display_name:
+ type: string
+
+ LedgerAccountType:
+ type: string
+ enum:
+ - ASSET
+ - LIABILITY
+ - EQUITY
+ - REVENUE
+ - COGS
+ - EXPENSE
+
+ ApiLedgerAccountSubtype:
+ type: object
+ properties:
+ value:
+ $ref: '#/components/schemas/LedgerAccountSubtype'
+ display_name:
+ type: string
+
+ LedgerAccountSubtype:
+ type: string
+ enum:
+ - CURRENT
+ - FIXED
+ - ACCOUNTS_RECEIVABLE
+ - LONG_TERM
+ - ACCOUNTS_PAYABLE
+ - CREDIT_CARD
+ - OWNERS_EQUITY
+ - PRODUCT_INCOME
+ - SERVICE_INCOME
+ - DIRECT_LABOR
+ - MATERIAL
+ - OVERHEAD
+ - ADVERTISING_AND_PROMOTION
+ - AUTOMOTIVE_EXPENSE
+ - BANK_FEES
+ - CHARITABLE_CONTRIBUTIONS
+ - COMMISSIONS_AND_FEES
+ - DUES_AND_SUBSCRIPTIONS
+ - INSURANCE
+ - INTEREST
+ - LEGAL_AND_PROFESSIONAL_FEES
+ - LICENSES
+ - MEALS_AND_ENTERTAINMENT
+ - OFFICE_SUPPLIES
+ - PAYROLL_ADMIN
+ - PAYROLL_BENEFITS
+ - PAYROLL_TAXES
+ - PHONE_AND_INTERNET
+ - RENT_OR_LEASE
+ - REPAIRS_AND_MAINTENANCE
+ - TAXES_AND_LICENSES
+ - TRAVEL
+ - UTILITIES
+ - DEPRECIATION
+ CategoryList:
+ type: object
+ properties:
+ categories:
+ type: array
+ items:
+ $ref: '#/components/schemas/NestedApiCategorization'
+ AccountIdentifier:
+ oneOf:
+ - $ref: '#/components/schemas/AccountId'
+ - $ref: '#/components/schemas/AccountStableName'
+
+ AccountId:
+ type: object
+ properties:
+ id:
+ type: string
+ AccountStableName:
+ type: object
+ properties:
+ name:
+ type: string
+ BankTransactionPnlEntry:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ business_id:
+ type: string
+ format: uuid
+ source:
+ $ref: '#/components/schemas/TransactionSource'
+ source_transaction_id:
+ type: string
+ source_account_id:
+ type: string
+ imported_at:
+ type: string
+ format: date-time
+ date:
+ type: string
+ format: date-time
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ amount:
+ type: integer
+ format: int64
+ counterparty_name:
+ type: string
+ nullable: true
+ description:
+ type: string
+ nullable: true
+ account_name:
+ type: string
+ nullable: true
+ categorization_status:
+ $ref: '#/components/schemas/CategorizationStatus'
+ category:
+ $ref: '#/components/schemas/ApiCategorization'
+ categorization_method:
+ oneOf:
+ - $ref: '#/components/schemas/ClassifierAgent'
+ categorization_flow:
+ oneOf:
+ - $ref: '#/components/schemas/ApiCategorizationFlow'
+ categorization_ux:
+ oneOf:
+ - $ref: '#/components/schemas/CategorizationUX'
+ projected_income_category:
+ $ref: '#/components/schemas/ProjectedIncomeCategory'
+
+ SplitBankTransactionPnlEntry:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ business_id:
+ type: string
+ format: uuid
+ source:
+ $ref: '#/components/schemas/TransactionSource'
+ source_transaction_id:
+ type: string
+ source_account_id:
+ type: string
+ imported_at:
+ type: string
+ format: date-time
+ date:
+ type: string
+ format: date-time
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ amount:
+ type: integer
+ format: int64
+ counterparty_name:
+ type: string
+ nullable: true
+ description:
+ type: string
+ nullable: true
+ account_name:
+ type: string
+ nullable: true
+ categorization_status:
+ $ref: '#/components/schemas/CategorizationStatus'
+ category:
+ $ref: '#/components/schemas/ApiCategorization'
+ categorization_method:
+ oneOf:
+ - $ref: '#/components/schemas/ClassifierAgent'
+ categorization_flow:
+ oneOf:
+ - $ref: '#/components/schemas/ApiCategorizationFlow'
+ categorization_ux:
+ oneOf:
+ - $ref: '#/components/schemas/CategorizationUX'
+ projected_income_category:
+ $ref: '#/components/schemas/ProjectedIncomeCategory'
+ NewCustomTransactionParams:
+ type: object
+ properties:
+ external_id:
+ type: string
+ amount:
+ type: integer
+ format: int64
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ date:
+ type: string
+ format: date-time
+ merchant_name:
+ type: string
+ nullable: true
+ merchant_category_code:
+ type: string
+ nullable: true
+ currency_code:
+ $ref: '#/components/schemas/CurrencyCode'
+ description:
+ type: string
+ display_description:
+ type: string
+ nullable: true
+ balance:
+ type: integer
+ format: int64
+ nullable: true
+ opening_balance_do_not_init:
+ type: boolean
+ opening_balance_init_to_zero:
+ type: boolean
+ init_external_transaction_mappings:
+ type: boolean
+ InputStrategy:
+ type: string
+ enum:
+ - CATEGORY_SELECT
+ - SIMPLE_SEARCH
+ - UNCATEGORIZED
+ ApiBankTransactionDataOnly:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ business_id:
+ type: string
+ format: uuid
+ source:
+ $ref: '#/components/schemas/TransactionSource'
+ source_transaction_id:
+ type: string
+ source_account_id:
+ type: string
+ imported_at:
+ type: string
+ format: date-time
+ date:
+ type: string
+ format: date-time
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ amount:
+ type: integer
+ format: int64
+ counterparty_name:
+ type: string
+ nullable: true
+ description:
+ type: string
+ nullable: true
+ account_name:
+ type: string
+ nullable: true
+ categorization_status:
+ $ref: '#/components/schemas/CategorizationStatus'
+ SignedAmount:
+ type: integer
+ format: int64
+ ExclusionClassification:
+ oneOf:
+ - $ref: '#/components/schemas/Exclusion'
+ discriminator:
+ propertyName: classificationType
+ mapping:
+ Exclusion: '#/components/schemas/Exclusion'
+ Exclusion:
+ type: object
+ properties:
+ exclusion_type:
+ $ref: '#/components/schemas/ExclusionType'
+ required:
+ - exclusion_type
+ ExclusionType:
+ type: string
+ description: "Type of exclusion for a bank transaction."
+ enum:
+ - PERSONAL_EXPENSES
+ - PERSONAL_INFLOWS
+ - OTHER_EXCLUSION
+ x-displayStrings:
+ PERSONAL_EXPENSES: "Personal transactions"
+ PERSONAL_INFLOWS: "Personal income sources"
+ OTHER_EXCLUSION: "Other exclusion"
+ ApiCategorization:
+ description: Base schema for categorization of API entities.
+ oneOf:
+ - $ref: '#/components/schemas/AccountCategorization'
+ - $ref: '#/components/schemas/ExclusionCategorization'
+ - $ref: '#/components/schemas/SplitCategorization'
+ - $ref: '#/components/schemas/NestedApiCategorization'
+ discriminator:
+ propertyName: type
+ mapping:
+ Account: '#/components/schemas/AccountCategorization'
+ Exclusion: '#/components/schemas/ExclusionCategorization'
+ Split_Categorization: '#/components/schemas/SplitCategorization'
+ AccountNested: '#/components/schemas/NestedAccountCategorization'
+ OptionalAccountNested: '#/components/schemas/NestedOptionalCatetoryCategorization'
+ ExclusionNested: '#/components/schemas/NestedExclusionCategorization'
+ AccountCategorization:
+ type: object
+ properties:
+ id:
+ type: string
+ description: Derived ID from Account ID.
+ stable_name:
+ type: string
+ nullable: true
+ category:
+ type: string
+ display_name:
+ type: string
+ required:
+ - id
+ - category
+ - display_name
+ ExclusionCategorization:
+ type: object
+ properties:
+ id:
+ type: string
+ category:
+ type: string
+ display_name:
+ type: string
+ required:
+ - id
+ - category
+ - display_name
+ SplitCategorizationEntry:
+ type: object
+ properties:
+ amount:
+ type: integer
+ format: int64
+ category:
+ $ref: '#/components/schemas/AccountCategorization'
+ SplitCategorization:
+ type: object
+ properties:
+ id:
+ type: string
+ default: "SPLIT"
+ category:
+ type: string
+ default: "SPLIT"
+ display_name:
+ type: string
+ default: "Split"
+ entries:
+ type: array
+ items:
+ $ref: '#/components/schemas/SplitCategorizationEntry'
+ required:
+ - entries
+ NestedApiCategorization:
+ type: object
+ oneOf:
+ - $ref: '#/components/schemas/NestedAccountCategorization'
+ - $ref: '#/components/schemas/NestedOptionalCatetoryCategorization'
+ - $ref: '#/components/schemas/NestedExclusionCategorization'
+
+ NestedApiSubCategories:
+ type: array
+ items:
+ $ref: '#/components/schemas/NestedApiCategorization'
+ nullable: true
+
+ NestedAccountCategorization:
+ type: object
+ properties:
+ id:
+ type: string
+ description: Derived ID from Account ID.
+ stable_name:
+ type: string
+ nullable: true
+ category:
+ type: string
+ display_name:
+ type: string
+ subCategories:
+ $ref: '#/components/schemas/NestedApiSubCategories'
+
+ NestedOptionalCatetoryCategorization:
+ type: object
+ properties:
+ id:
+ type: string
+ description: Derived ID from Stable Name.
+ stable_name:
+ type: string
+ category:
+ type: string
+ display_name:
+ type: string
+ subCategories:
+ $ref: '#/components/schemas/NestedApiSubCategories'
+
+ NestedExclusionCategorization:
+ type: object
+ properties:
+ id:
+ type: string
+ category:
+ type: string
+ display_name:
+ type: string
+ subCategories:
+ $ref: '#/components/schemas/NestedApiSubCategories'
+
+ AccountName:
+ type: string
+
+ Account:
+ type: object
+ properties:
+ id:
+ $ref: '#/components/schemas/AccountId'
+ accountStableName:
+ oneOf:
+ - $ref: '#/components/schemas/AccountStableName'
+ number:
+ type: integer
+ name:
+ $ref: '#/components/schemas/AccountName'
+ subAccounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/Account'
+ nullable: true
+ normality:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ balance:
+ type: integer
+ format: int64
+ selfOnlyBalance:
+ type: integer
+ format: int64
+ entries:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiLineItem'
+ ConfirmMatch:
+ type: object
+ properties:
+ match_id:
+ type: string
+ format: uuid
+ TaxAccountIdentifier:
+ type: object
+ oneOf:
+ - $ref: '#/components/schemas/LedgerAccountIdentifier'
+ - $ref: '#/components/schemas/TaxName'
+ discriminator:
+ propertyName: type
+ mapping:
+ Legder_Account_Id: '#/components/schemas/LedgerAccountIdentifier'
+ Tax_Name: '#/components/schemas/TaxName'
+ LedgerAccountIdentifier:
+ type: object
+ properties:
+ id:
+ type: string
+ required:
+ - id
+ TaxName:
+ type: object
+ properties:
+ name:
+ type: string
+ required:
+ - name
+ APIUnitAccount:
+ type: object
+ properties:
+ id:
+ type: string
+ account_name:
+ type: string
+ nullable: true
+ imported_at:
+ type: string
+ format: date-time
+ NestedApiLedgerAccount:
+ type: object
+ properties:
+ id:
+ $ref: '#/components/schemas/AccountId'
+ name:
+ type: string
+ stable_name:
+ oneOf:
+ - $ref: '#/components/schemas/AccountStableName'
+ normality:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ account_type:
+ oneOf:
+ - $ref: '#/components/schemas/ApiLedgerAccountType'
+ account_subtype:
+ oneOf:
+ - $ref: '#/components/schemas/ApiLedgerAccountSubtype'
+ balance:
+ type: integer
+ format: int64
+ entries:
+ type: array
+ items:
+ $ref: '#/components/schemas/ApiLineItem'
+ sub_accounts:
+ type: array
+ items:
+ $ref: '#/components/schemas/NestedApiLedgerAccount'
+ ApiBalanceTimestamp:
+ type: object
+ properties:
+ external_account_external_id:
+ type: string
+ external_account_source:
+ $ref: '#/components/schemas/TransactionSource'
+ balance:
+ type: integer
+ format: int64
+ at:
+ type: string
+ format: date-time
+ created_at:
+ type: string
+ format: date-time
+ LedgerEntrySource:
+ type: object
+ oneOf:
+ - $ref: '#/components/schemas/TransactionLedgerEntrySource'
+ - $ref: '#/components/schemas/InvoiceLedgerEntrySource'
+ - $ref: '#/components/schemas/ManualLedgerEntrySource'
+ - $ref: '#/components/schemas/InvoicePaymentLedgerEntrySource'
+ - $ref: '#/components/schemas/RefundPaymentLedgerEntrySource'
+ - $ref: '#/components/schemas/OpeningBalanceLedgerEntrySource'
+ - $ref: '#/components/schemas/PayoutLedgerEntrySource'
+ discriminator:
+ propertyName: type
+ mapping:
+ Transaction_Ledger_Entry_Source: '#/components/schemas/TransactionLedgerEntrySource'
+ Invoice_Ledger_Entry_Source: '#/components/schemas/InvoiceLedgerEntrySource'
+ Manual_Ledger_Entry_Source: '#/components/schemas/ManualLedgerEntrySource'
+ Invoice_Payment_Ledger_Entry_Source: '#/components/schemas/InvoicePaymentLedgerEntrySource'
+ Refund_Ledger_Entry_Source: '#/components/schemas/RefundPaymentLedgerEntrySource'
+ Opening_Balance_Ledger_Entry_Source: '#/components/schemas/OpeningBalanceLedgerEntrySource'
+ Payout_Ledger_Entry_Source: '#/components/schemas/PayoutLedgerEntrySource'
+ TransactionLedgerEntrySource:
+ type: object
+ properties:
+ transaction_id:
+ type: string
+ format: uuid
+ external_id:
+ type: string
+ account_name:
+ type: string
+ date:
+ type: string
+ format: date-time
+ amount:
+ type: integer
+ format: int64
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ counterparty:
+ type: string
+ nullable: true
+ entity_name:
+ type: string
+ default: "Bank Transaction"
+ display_description:
+ type: string
+ default: "Generated display description based on account name and date"
+ InvoiceLedgerEntrySource:
+ type: object
+ properties:
+ invoice_id:
+ type: string
+ format: uuid
+ external_id:
+ type: string
+ nullable: true
+ invoice_number:
+ type: string
+ nullable: true
+ recipient_name:
+ type: string
+ date:
+ type: string
+ format: date-time
+ amount:
+ type: integer
+ format: int64
+ entity_name:
+ type: string
+ default: "Invoice"
+ display_description:
+ type: string
+ default: "Generated display description based on invoice number and date"
+
+ ManualLedgerEntrySource:
+ type: object
+ properties:
+ manual_entry_id:
+ type: string
+ format: uuid
+ memo:
+ type: string
+ created_by:
+ type: string
+ entity_name:
+ type: string
+ default: "Manual Entry"
+ display_description:
+ type: string
+ default: "Manual Entry"
+
+ InvoicePaymentLedgerEntrySource:
+ type: object
+ properties:
+ external_id:
+ type: string
+ nullable: true
+ invoice_id:
+ type: string
+ format: uuid
+ invoice_number:
+ type: string
+ nullable: true
+ amount:
+ type: integer
+ format: int64
+ entity_name:
+ type: string
+ default: "Invoice Payment"
+ display_description:
+ type: string
+ default: "Payment on invoice based on invoice number"
+
+ RefundPaymentLedgerEntrySource:
+ type: object
+ properties:
+ external_id:
+ type: string
+ nullable: true
+ refund_id:
+ type: string
+ format: uuid
+ refunded_to_customer_amount:
+ type: integer
+ format: int64
+ recipient_name:
+ type: string
+ entity_name:
+ type: string
+ default: "Refund"
+ display_description:
+ type: string
+ default: "Refund of amount based on customer details"
+
+ OpeningBalanceLedgerEntrySource:
+ type: object
+ properties:
+ account_name:
+ type: string
+ entity_name:
+ type: string
+ default: "Opening Balance Entry"
+ display_description:
+ type: string
+ default: "Opening balance for specified account"
+
+ PayoutLedgerEntrySource:
+ type: object
+ properties:
+ payout_id:
+ type: string
+ format: uuid
+ external_id:
+ type: string
+ nullable: true
+ paid_out_amount:
+ type: integer
+ format: int64
+ processor:
+ type: string
+ completed_at:
+ type: string
+ format: date-time
+ entity_name:
+ type: string
+ default: "Payout"
+ display_description:
+ type: string
+ default: "Payout processed by specified processor on specified date"
+ RefundPaymentMethod:
+ type: string
+ enum:
+ - CASH
+ - CHECK
+ - CREDIT_CARD
+ - ACH
+ - STORE_CREDIT
+ - OTHER
+ BankTransactionCategorization:
+ oneOf:
+ - $ref: '#/components/schemas/Category'
+ - $ref: '#/components/schemas/ApiSplitInput'
+ Category:
+ type: object
+ properties:
+ category:
+ $ref: '#/components/schemas/BankTransactionClassification'
+ SplitEntry:
+ type: object
+ properties:
+ amount:
+ type: integer
+ format: int64
+ category:
+ $ref: '#/components/schemas/BankTransactionClassification'
+ BankTransactionClassification:
+ oneOf:
+ - $ref: '#/components/schemas/ExclusionClassification'
+ - $ref: '#/components/schemas/AccountIdentifier'
+ ApiSplitInput:
+ type: object
+ properties:
+ entries:
+ type: array
+ items:
+ $ref: '#/components/schemas/SplitEntry'
+ AuthToken:
+ type: object
+ properties:
+ access_token:
+ type: string
+ expires_in:
+ type: integer
+ format: int64
+ token_type:
+ type: string
+ LineItem:
+ type: object
+ properties:
+ name:
+ type: string
+ display_name:
+ type: string
+ value:
+ type: integer
+ format: int64
+ line_items:
+ type: array
+ items:
+ $ref: '#/components/schemas/LineItem'
+ is_contra:
+ type: boolean
+ required:
+ - name
+ - display_name
+ - value
+ - is_contra
+ BankTransactionDirection:
+ type: string
+ enum:
+ - DEBIT
+ - CREDIT
+ ApiTypedActivity:
+ type: object
+ required:
+ - createdAt
+ properties:
+ createdAt:
+ type: string
+ format: date-time
+ discriminator:
+ propertyName: type
+ mapping:
+ Categorize_Transaction_Activity: '#/components/schemas/ApiCategorizeBankTransactionActivity'
+ Load_PnL_Activity: '#/components/schemas/ApiLoadPnlActivity'
+ oneOf:
+ - $ref: '#/components/schemas/ApiCategorizeBankTransactionActivity'
+ - $ref: '#/components/schemas/ApiLoadPnlActivity'
+
+ ApiCategorizeBankTransactionActivity:
+ type: object
+ allOf:
+ - $ref: '#/components/schemas/ApiTypedActivity'
+ properties:
+ transactionId:
+ type: string
+ format: uuid
+ categorizationMethod:
+ $ref: '#/components/schemas/ClassifierAgent'
+ categorization:
+ $ref: '#/components/schemas/BankTransactionCategorization'
+ required:
+ - transactionId
+ - categorizationMethod
+ - categorization
+
+ ApiLoadPnlActivity:
+ type: object
+ allOf:
+ - $ref: '#/components/schemas/ApiTypedActivity'
+ properties:
+ pnlStartDate:
+ type: string
+ format: date-time
+ nullable: true
+ pnlEndDate:
+ type: string
+ format: date-time
+ nullable: true
+ required:
+ - createdAt
+ FlatUnitTransactionInput:
+ type: object
+ properties:
+ unit_transaction_id:
+ type: string
+ created_at:
+ type: string
+ format: date-time
+ transaction_type:
+ type: string
+ unit_account_id:
+ type: string
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ balance:
+ type: integer
+ format: int64
+ tags:
+ type: string
+ nullable: true
+ amount:
+ type: integer
+ format: int64
+ merchant_type:
+ type: string
+ nullable: true
+ merchant_location:
+ type: string
+ nullable: true
+ processed_counterparty_name:
+ type: string
+ nullable: true
+ card_last_4_digits:
+ type: string
+ nullable: true
+ description:
+ type: string
+ nullable: true
+ sec_code:
+ type: string
+ nullable: true
+ auto_categorize:
+ type: boolean
+ default: true
+ opening_balance_do_not_init:
+ type: boolean
+ opening_balance_init_to_zero:
+ type: boolean
+ init_external_transaction_mappings:
+ type: boolean
+
+ FlatUnitTransactionResult:
+ type: object
+ properties:
+ id:
+ type: string
+ format: uuid
+ externalTransactionMappingId:
+ type: string
+ format: uuid
+ nullable: true
+ unit_transaction_id:
+ type: string
+ created_at:
+ type: string
+ format: date-time
+ transaction_type:
+ type: string
+ unit_account_id:
+ type: string
+ business_id:
+ type: string
+ format: uuid
+ direction:
+ $ref: '#/components/schemas/BankTransactionDirection'
+ balance:
+ type: integer
+ format: int64
+ amount:
+ type: integer
+ format: int64
+ merchant_type:
+ type: string
+ nullable: true
+ tags:
+ type: string
+ nullable: true
+ merchant_location:
+ type: string
+ nullable: true
+ processed_counterparty_name:
+ type: string
+ nullable: true
+ card_last_4_digits:
+ type: string
+ nullable: true
+ description:
+ type: string
+ nullable: true
+ sec_code:
+ type: string
+ nullable: true
+ category:
+ oneOf:
+ - $ref: '#/components/schemas/ApiCategorization'
+ nullable: true
+ categorizationStatus:
+ oneOf:
+ - $ref: '#/components/schemas/CategorizationStatus'
+ nullable: true
+ previouslyImported:
+ type: boolean
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/README.md b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/README.md
new file mode 100644
index 00000000000..c89c478d15b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/README.md
@@ -0,0 +1,32 @@
+# Mintlify Starter Kit
+
+Click on `Use this template` to copy the Mintlify starter kit. The starter kit contains examples including
+
+- Guide pages
+- Navigation
+- Customizations
+- API Reference pages
+- Use of popular components
+
+### Development
+
+Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation changes locally. To install, use the following command
+
+```
+npm i -g mintlify
+```
+
+Run the following command at the root of your documentation (where mint.json is)
+
+```
+mintlify dev
+```
+
+### Publishing Changes
+
+Install our Github App to autopropagate changes from youre repo to your deployment. Changes will be deployed to production automatically after pushing to the default branch. Find the link to install on your dashboard.
+
+#### Troubleshooting
+
+- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies.
+- Page loads as a 404 - Make sure you are running in a folder with `mint.json`
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/_snippets/snippet-example.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/_snippets/snippet-example.mdx
new file mode 100644
index 00000000000..089334c54f9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/_snippets/snippet-example.mdx
@@ -0,0 +1,3 @@
+## My Snippet
+
+This is an example of a reusable snippet
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/idempotency.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/idempotency.mdx
new file mode 100644
index 00000000000..63657b32da1
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/idempotency.mdx
@@ -0,0 +1,5 @@
+---
+title: 'Idempotency'
+---
+
+Creation operations to the Layer API are idempotent when an external id is specified, such as the `external_id` field on a [Business](/api-reference/business/business) object. Others are indicated in the documentation. While these keys are not always required, use of idempotency keys is highly recommended whenever available.
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/json-data.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/json-data.mdx
new file mode 100644
index 00000000000..65fa87f145b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/json-data.mdx
@@ -0,0 +1,72 @@
+---
+title: 'JSON Data'
+---
+
+Layer uses a standardized json structure across all endpoints. There are only 3 possible top level fields.
+
+### Data
+ Contains the requested data from the endpoint and can be either a JSON list or a JSON object.
+ - Every top level object or item in an array will contain a `type` field indicating the entity type.
+ - `data` will only be present if the result is successful, in which case there will be a `2**` status code and no `error` field.
+
+```json
+{
+ "data":[
+ {
+ "type":"Business",
+ "id":"08cee9cc-389e-44ea-a42e-ffb12670f515",
+ "external_id":"id-1",
+ "legal_name":"Acme, Inc.",
+ "tin":null,
+ "us_state":"AZ",
+ "entity_type":"LLC",
+ "phone_number":"53924476123",
+ "imported_at":"2023-07-13T17:25:59.292451Z",
+ "updated_at":"2023-07-13T17:25:59.292451Z",
+ "archived_at":null
+ },
+ {
+ "type":"Business",
+ "id":"e348d217-1788-494c-9c1c-d8be13b89aba",
+ "external_id":"id-2",
+ "legal_name":"Acme, Inc.",
+ "tin":null,
+ "us_state":"AZ",
+ "entity_type":"LLC",
+ "phone_number":"69565771257",
+ "imported_at":"2023-07-13T17:25:59.720376Z",
+ "updated_at":"2023-07-13T17:25:59.720376Z",
+ "archived_at":null
+ }
+ ],
+ "meta":{
+
+ }
+}
+```
+
+### Errors
+ An array of `error` objects. `error` objects will contain the following fields.
+ - `type`: One of a fixed set of categories. Helpful for categorizing & processing errors
+ - `description`: A human readable error description.
+ - `meta`: Optional additional information.
+`errors` will be present only if the request is unsuccessful, in which case there will be a `4**` or `5**` status code and no `data` field.
+
+```json
+{
+ "errors": [
+ {
+ "type": "Plaid",
+ "description": "Plaid credentials must be set before you can add plaid items to businesses. See /v1/configure/plaid"
+ }
+ ]
+}
+
+```
+
+### Meta
+An optional object that may be used to communicate metadata about the request.
+Example use cases include:
+- Idempotency
+- Pagination
+- Rate limits
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/pagination.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/pagination.mdx
new file mode 100644
index 00000000000..56737f879a7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/pagination.mdx
@@ -0,0 +1,34 @@
+---
+title: 'Pagination'
+---
+
+Listing endpoints, for example [List all Businesses](/api-reference/business/list) and [List all Bank Transactions](/api-reference/bank-transactions/list) support cursor-based pagination. Pagination can be controlled via query string parameters:
+- `sort_by` which supports some timestamp, integer and string keys. Valid sort keys are noted in documentation where applicable. Sort key is optional.
+- `sort_order` specifies either ASC or DESC ordering for the sort key. Optional, ASC by default.
+- `cursor` returned by the previous list request. Do not specify for the initial listing API call.
+- `limit` constrains the number of results to be returned. Defaults to 100 for most endpoints.
+
+```bash Request
+curl https://sandbox.layerfi.com/v1/businesses/:business_id/bank-transactions?sort_by=date&sort_order=DESC&limit=50 \
+ -H "Authorization: Bearer "
+```
+
+Responses to paginating endpoints will include pagination data in the meta response field.
+
+```json Response
+{
+ "data": [
+ // Data omitted
+ ],
+ "meta": {
+ "pagination": {
+"sort_by": "date",
+ "sort_order": ASC,
+ "cursor": "VGhhbmtzIGZvciByZWFsbHkgcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbiE="
+ "has_more": true
+ }
+ }
+}
+```
+
+When the `has_more` field is true, use the returned cursor in an additional request to fetch the next page of results.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/rate-limiting.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/rate-limiting.mdx
new file mode 100644
index 00000000000..cb521ffbcba
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-details/rate-limiting.mdx
@@ -0,0 +1,16 @@
+---
+title: 'Rate Limiting'
+---
+
+Layer uses a single API-wide endpoint cost rate limiting system, where every endpoint contributes a cost towards a total budget. The budget follows a bucket model, where each API call uses tokens from a current bucket which is refilled every 1 second.
+
+Rate limits should never be approached for normal customer read operations, and are only intended to limit heavy data ingestion processes, such as en-masse backfills of data. Nonetheless, we recommend adding retries on all Layer API calls. To assist in retries, the following headers are included in every successful API request:
+- `X-RateLimit-Limit`: a specified bucket capacity.
+- `X-RateLimit-Remaining`: the number of tokens remaining in a bucket.
+- `X-RateLimit-Reset`: a UTC timestamp (in seconds) that specifies the time of refilling a bucket.
+
+Any API calls that are rate limited will receive a response with:
+- Error code `429: Too Many Requests`
+- `Retry-After` header indicating (in seconds) how long to wait before retrying the request.
+
+During normal operations, adding enough retries that requests will retry 1 second later should be sufficient to avoid any rate limiting.
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/add-custom-account-for-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/add-custom-account-for-business.mdx
new file mode 100644
index 00000000000..2eec66291f4
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/add-custom-account-for-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/custom-accounts/
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-invoice-payment-allocations.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-invoice-payment-allocations.mdx
new file mode 100644
index 00000000000..761bb7ee097
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-invoice-payment-allocations.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/invoices/payments/allocations/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-invoices.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-invoices.mdx
new file mode 100644
index 00000000000..a3c45d1a000
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-invoices.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/invoices/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-payouts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-payouts.mdx
new file mode 100644
index 00000000000..f4076b0108d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-payouts.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/payouts/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-transactions.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-transactions.mdx
new file mode 100644
index 00000000000..ed4d0bf2fa4
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/apply-list-of-tags-to-list-of-transactions.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/bank-transactions/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-business.mdx
new file mode 100644
index 00000000000..be8a7b31e86
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/businesses/{businessId}/archive
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-custom-account-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-custom-account-from-business.mdx
new file mode 100644
index 00000000000..ecb22389c48
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-custom-account-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/custom-accounts/{customAccountId}/archive
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-linked-external-account.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-linked-external-account.mdx
new file mode 100644
index 00000000000..a01c50eab7b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-linked-external-account.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/external-accounts/{accountId}/archive
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-plaid-account.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-plaid-account.mdx
new file mode 100644
index 00000000000..445181466b5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/archive-plaid-account.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/plaid/accounts/{plaidAccountId}/archive
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/bank-transaction.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/bank-transaction.mdx
new file mode 100644
index 00000000000..9f93e7df667
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/bank-transaction.mdx
@@ -0,0 +1,135 @@
+---
+title: "Bank Transaction object"
+---
+Bank transactions are transactions that have occurred within a bank account owned by a business.
+
+### Attributes
+
+
+ Unique identifier for the bank transaction.
+
+
+ Unique ID of the bank transaction in your system for linking purposes. **Idempotency key.**
+
+
+ Resource type. Value will be "Bank_Transaction".
+
+
+ Id for the Business this transaction belongs to.
+
+
+ The source that the bank transaction was imported from.
+ Values can be: `UNIT`, `PLAID`, `API`
+
+
+ Unique ID of the bank transaction in its source system. **Idempotency key.**
+
+
+ Id of the source account in the source system.
+
+
+ Date the transaction occurred.
+
+
+ The direction of the transaction relative to the source account.
+ Values can be: `CREDIT`, `DEBIT`
+
+
+ The amount of the transaction in cents.
+
+
+ The name of the merchant or counterparty associated with the transaction.
+
+
+ Description of the transaction.
+
+
+ The type of bank account transaction.
+ Example values: `PURCHASE`, `BOOK`, `ATM`, `WIRE`, etc.
+
+
+ The status of the transaction's categorization in Layer's systems.
+ Values can be: `PENDING`, `READY_FOR_INPUT`, `CATEGORIZED`, `LAYER_REVIEW`
+
+
+ How the transaction was categorized.
+ Values can be: `SMS`, `API`, `LAYER_AUTO`, `LAYER_MANUAL`
+
+
+ The category assigned to the transaction. Only populated for transactions that have a finalized category.
+
+
+ String enum for the category assigned to the transaction. The set of category enums will vary based on chart of account configured for the business.
+
+
+ A human-readable string describing the category. This can be presented to the end user in your UI.
+
+
+
+
+ Layer's suggested categorization for the transaction.
+
+
+ The type of categorization approach used.
+
+
+ The category assigned to the transaction. Only populated for transactions that have a finalized category.
+
+
+ String enum for the category assigned to the transaction. The set of category enums will vary based on chart of account configured for the business.
+
+
+ A human-readable string describing the category. This can be presented to the end user in your UI.
+
+
+
+
+ Layer's list of suggested categories for the transaction.
+
+
+ String enum for the category assigned to the transaction. The set of category enums will vary based on chart of account configured for the business.
+
+
+ A human-readable string describing the category. This can be presented to the end user in your UI.
+
+
+
+
+
+
+
+
+
+
+```json Example
+{
+ "id":"67cee0d8-3b8e-4b4b-a857-78ce3bb1d895",
+ "type":"Bank_Transaction",
+ "transaction_type":"Purchase",
+ "business_id":"cfee5365-dcc3-425e-b403-cc9568f7121e",
+ "source":"API",
+ "source_transaction_id":"11111113",
+ "source_account_id":"111113",
+ "imported_at":"2023-06-07T00:42:08.664543Z",
+ "date":"2023-05-15T14:13:07Z",
+ "direction":"Debit",
+ "amount":8026,
+ "counterparty_name":"SUNOCO",
+ "description":null,
+ "categorization_status":"CATEGORIZED",
+ "category":{
+ "category":"FUEL",
+ "display_name":"Fuel"
+ },
+ "categorization_method":"LAYER_AUTO",
+ "categorization_flow":{
+ "type":"AUTO",
+ "category":{
+ "category":"FUEL",
+ "display_name":"Fuel"
+ }
+ }
+}
+```
+
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/bulk-match-transactions.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/bulk-match-transactions.mdx
new file mode 100644
index 00000000000..33936198586
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/bulk-match-transactions.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/bank-transactions/bulk-match
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/business.mdx
new file mode 100644
index 00000000000..cff51d74cf9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/business.mdx
@@ -0,0 +1,85 @@
+---
+title: "Business object"
+---
+A Business is Layer’s representation of an end business on your platform. The Business object contains all the information about the business needed for Layer’s embedded accounting logic.
+
+### Attributes
+
+
+ Unique identifier for the business.
+
+
+ Resource type. Value will be "Business".
+
+
+ Unique ID of the business in your system for linking purposes. **Idempotency key.**
+
+
+ Legal name of the business as it has been registered.
+
+
+ Tax identification number of the business.
+
+
+ Two letter state abbreviation. (`AK`, `AL`, `AR`, etc.)
+
+
+ Entity type of the business. Used to determine tax filing status.
+ Values can be: `SOLE_PROP`, `C_CORP`, `LLC`, `S_CORP`, `PARTNERSHIP`
+
+
+ Phone number used for SMS based categorization.
+
+
+ List of unit accounts associated with this business.
+
+
+ The Unit account's ID
+
+
+
+
+ Plaid items linked to this account.
+
+
+ `item_id` returned by Plaid on the initial link.
+
+
+ `access_token` returned by Plaid on the initial link.
+
+
+
+
+ Time when the business entity was created in Layer. **Eligible sort key.**
+
+
+ Time when the business' information was last updated in Layer. **Eligible sort key.**
+
+
+
+
+
+```json Example
+{
+ "id": "863ed926-e30d-40f4-8e7e-b0d5387ce4fb",
+ "type": "Business",
+ "external_id": "test-acme-id",
+ "legal_name": "ACME LLC",
+ "tin": null,
+ "business_activity_code": null,
+ "us_state": "CA",
+ "entityType": "LLC",
+ "phone_number": "+16504651359",
+ "imported_at": "2023-06-15T22:12:05.467940Z",
+ "updated_at": "2023-06-15T22:12:05.467940Z",
+ "archived_at": null,
+ "unit_accounts": [
+ {
+ "id": "111111",
+ "imported_at": "2023-06-15T22:12:05.467940Z"
+ }
+ ]
+}
+```
+
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/calculate-new-custom-account-opening-balance-entry.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/calculate-new-custom-account-opening-balance-entry.mdx
new file mode 100644
index 00000000000..78d1172290d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/calculate-new-custom-account-opening-balance-entry.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/custom-accounts/{customAccountId}/opening-balance
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/categorize-transaction.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/categorize-transaction.mdx
new file mode 100644
index 00000000000..1f8a738fce6
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/categorize-transaction.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/businesses/{businessId}/bank-transactions/{transactionId}/categorize
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/configure-plaid-client-id-and-secret.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/configure-plaid-client-id-and-secret.mdx
new file mode 100644
index 00000000000..84fc4beb081
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/configure-plaid-client-id-and-secret.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/configure/plaid
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/configure-stripe-secret.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/configure-stripe-secret.mdx
new file mode 100644
index 00000000000..5edde7523aa
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/configure-stripe-secret.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/configure/stripe
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-custom-account-balance-timestamp.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-custom-account-balance-timestamp.mdx
new file mode 100644
index 00000000000..290c3b8c667
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-custom-account-balance-timestamp.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/custom-accounts/{customAccountId}/balance
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-invoice-payments-from-batch.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-invoice-payments-from-batch.mdx
new file mode 100644
index 00000000000..6a6094d10d7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-invoice-payments-from-batch.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/invoices/payments/
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-invoices-from-batch.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-invoices-from-batch.mdx
new file mode 100644
index 00000000000..907bf624a3a
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-invoices-from-batch.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/invoices/bulk
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-ledger-account-for-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-ledger-account-for-business.mdx
new file mode 100644
index 00000000000..9bd9f5fdcee
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-ledger-account-for-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/ledger/accounts
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-manual-ledger-entries.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-manual-ledger-entries.mdx
new file mode 100644
index 00000000000..a6ae9c63c05
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-manual-ledger-entries.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/ledger/manual-entries
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-new-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-new-business.mdx
new file mode 100644
index 00000000000..15d16b405ad
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-new-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-new-payout-for-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-new-payout-for-business.mdx
new file mode 100644
index 00000000000..cc98feba1dc
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-new-payout-for-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/payouts/
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-plaid-item-link-token.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-plaid-item-link-token.mdx
new file mode 100644
index 00000000000..b6bfbd4cfd7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-plaid-item-link-token.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/plaid/link
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-reversal-entry-for-ledger-entry.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-reversal-entry-for-ledger-entry.mdx
new file mode 100644
index 00000000000..bbecbb70c84
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/create-reversal-entry-for-ledger-entry.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/ledger/entries/{entryId}/reverse
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-invoice-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-invoice-from-business.mdx
new file mode 100644
index 00000000000..77b02a9b6c2
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-invoice-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/invoices/{invoiceId}/delete
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-invoice-payment-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-invoice-payment-from-business.mdx
new file mode 100644
index 00000000000..138c1245756
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-invoice-payment-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/invoices/payments/{paymentId}/delete
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-list-of-payout-tags.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-list-of-payout-tags.mdx
new file mode 100644
index 00000000000..9cebc9d5df9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-list-of-payout-tags.mdx
@@ -0,0 +1,3 @@
+---
+openapi: delete /v1/businesses/{businessId}/payouts/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-plaid-item-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-plaid-item-from-business.mdx
new file mode 100644
index 00000000000..b035f93a1cc
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-plaid-item-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: delete /v1/businesses/{businessId}/plaid/items/{plaidItemPlaidId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-tags-applied-to-payment-allocation.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-tags-applied-to-payment-allocation.mdx
new file mode 100644
index 00000000000..c897bc6ead1
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/delete-tags-applied-to-payment-allocation.mdx
@@ -0,0 +1,3 @@
+---
+openapi: delete /v1/businesses/{businessId}/invoices/payments/{paymentId}/allocations/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/download-ledger-transactions-from-business-as-csv.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/download-ledger-transactions-from-business-as-csv.mdx
new file mode 100644
index 00000000000..c49c0654927
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/download-ledger-transactions-from-business-as-csv.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/reports/download-transactions-csv
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/exchange-plaid-token-and-add-item-to-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/exchange-plaid-token-and-add-item-to-business.mdx
new file mode 100644
index 00000000000..48d74683922
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/exchange-plaid-token-and-add-item-to-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/plaid/link/exchange
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-business-auth-token.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-business-auth-token.mdx
new file mode 100644
index 00000000000..163a391e635
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-business-auth-token.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{id}/auth-token
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-business.mdx
new file mode 100644
index 00000000000..a267166494f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-chart-of-accounts-for-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-chart-of-accounts-for-business.mdx
new file mode 100644
index 00000000000..e5645f65895
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-chart-of-accounts-for-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/balances
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-chart-of-accounts-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-chart-of-accounts-from-business.mdx
new file mode 100644
index 00000000000..80c63d7d557
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-chart-of-accounts-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/ledger/chart
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-client-info.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-client-info.mdx
new file mode 100644
index 00000000000..947dc60485b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-client-info.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /whoami
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-custom-account-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-custom-account-from-business.mdx
new file mode 100644
index 00000000000..82bad9fade5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-custom-account-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/custom-accounts/{customAccountId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-invoice-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-invoice-from-business.mdx
new file mode 100644
index 00000000000..a2b150869b8
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-invoice-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/invoices/{invoiceId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-invoice-payment-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-invoice-payment-from-business.mdx
new file mode 100644
index 00000000000..cdae1d6434a
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-invoice-payment-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/invoices/payments/{paymentId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-ledger-entry-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-ledger-entry-from-business.mdx
new file mode 100644
index 00000000000..7d38d6388d5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-ledger-entry-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/ledger/entries/{entryId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-ledger-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-ledger-from-business.mdx
new file mode 100644
index 00000000000..78123de9a11
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-ledger-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/ledger/accounts
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-linked-external-account-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-linked-external-account-from-business.mdx
new file mode 100644
index 00000000000..92ef2280baf
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-linked-external-account-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/external-accounts/{accountId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-opening-balance-from-linked-external-account.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-opening-balance-from-linked-external-account.mdx
new file mode 100644
index 00000000000..0ce3db0bcc7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-opening-balance-from-linked-external-account.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/external-accounts/{accountId}/opening-balance
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-or-create-ledger-account-on-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-or-create-ledger-account-on-business.mdx
new file mode 100644
index 00000000000..951cfec4672
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-or-create-ledger-account-on-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/ledger/accounts/{accountId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-payout-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-payout-from-business.mdx
new file mode 100644
index 00000000000..88be7e05b1b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-payout-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/payouts/{payoutId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-plaid-account-configuration.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-plaid-account-configuration.mdx
new file mode 100644
index 00000000000..d64bafb6827
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-plaid-account-configuration.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/plaid/accounts/{plaidAccountId}/configuration
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-plaid-client-id-and-secret.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-plaid-client-id-and-secret.mdx
new file mode 100644
index 00000000000..0b317f73077
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-plaid-client-id-and-secret.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/configure/plaid
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-plaid-item-configuration.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-plaid-item-configuration.mdx
new file mode 100644
index 00000000000..2e41a0416d5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-plaid-item-configuration.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/plaid/items/{plaidItemPlaidId}/configuration
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-profit-and-loss-entries-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-profit-and-loss-entries-from-business.mdx
new file mode 100644
index 00000000000..c3ebc7989b7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-profit-and-loss-entries-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/reports/profit-and-loss-entries
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-profit-and-loss-report-for-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-profit-and-loss-report-for-business.mdx
new file mode 100644
index 00000000000..c713f68cc6e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-profit-and-loss-report-for-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/reports/profit-and-loss
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-stripe-secret.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-stripe-secret.mdx
new file mode 100644
index 00000000000..b30774c7bf8
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-stripe-secret.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/configure/stripe
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-transaction-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-transaction-from-business.mdx
new file mode 100644
index 00000000000..e6e7439d413
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-transaction-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/bank-transactions/{transactionId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-transactions-from-linked-external-account.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-transactions-from-linked-external-account.mdx
new file mode 100644
index 00000000000..720b874ec29
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-transactions-from-linked-external-account.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/external-accounts/{accountId}/transactions
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-v1businesses-plaidaccounts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-v1businesses-plaidaccounts.mdx
new file mode 100644
index 00000000000..38516d93eda
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/get-v1businesses-plaidaccounts.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/plaid/accounts
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/import-transactions.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/import-transactions.mdx
new file mode 100644
index 00000000000..d7f210af607
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/import-transactions.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/unit-transactions
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/invoice.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/invoice.mdx
new file mode 100644
index 00000000000..d3d2fd876f1
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/invoice.mdx
@@ -0,0 +1,261 @@
+---
+title: "Invoice object"
+---
+
+An Invoice represents an invoice that a Business has collected for goods and services provided. Invoices are used to pass information about sales and accounts receivable into Layer.
+
+### Attributes
+
+
+ Unique identifier for the invoice.
+
+
+ Resource type. Value will be "Invoice".
+
+
+ Unique ID of the invoice in your system for linking purposes.
+
+
+ Id of the Business that generated the invoice.
+
+
+ Status of the invoice. Values can be: `PENDING`, `SENT`, `PARTIALLY_PAID`,
+ `PAID`, `VOIDED`
+
+
+ When the invoice was sent by the business to the recipient.
+
+
+ When the invoice is due.
+
+
+ When the invoice was paid.
+
+
+ When the invoice was voided. Voiding excludes the invoice from accounting.
+
+
+ Number for the invoice for display to end-users.
+
+
+ String description of the invoice recipient.
+
+
+ Line items making up the invoice.
+
+
+ Id of the invoice line item.
+
+
+ Id of the parent invoice
+
+
+ Description of the specific line item.
+
+
+ Reference to the product being sold.
+
+
+ Number of units sold.
+
+
+ The amount in cents of each unit.
+
+
+ Total discount given to this line item, in cents.
+
+
+
+
+
+ Ledger account associated with this tax.
+
+ Type of tax account object.
+
+
+ Name of the tax account, if a name was specified when this line item was created.
+
+
+ Id of the tax account if either an account ID was used to create the tax line item or if no tax account was specified.
+
+
+
+
+ Amount, in cents, of tax owed.
+
+
+
+
+ Total discount given to this line item, in cents.
+
+
+ Indicates this line item is a prepayment for future services, e.g. package deals, gift cards, etc.
+
+
+
+
+ Subtotal of all invoice line items in cents.
+
+
+ Additional discount applied to the whole invoice in addition to individual
+ line items.
+
+
+ Sum of all discount amounts across the invoice line items and any additional
+ discounts in cents.
+
+
+
+
+
+ Ledger account associated with this tax.
+
+ Type of tax account object.
+
+
+ Name of the tax account, if a name was specified when this line item was created.
+
+
+ Id of the tax account if either an account ID was used to create the tax line item or if no tax account was specified.
+
+
+
+
+ Amount, in cents, of tax owed.
+
+
+
+
+ Sum of all taxes across the invoice line items and any additional taxes in
+ cents.
+
+
+ Tips included by the buyer, in cents.
+
+
+ Total amount of the invoice in cents.
+
+
+ The remaining balance on the invoice after factoring in all previous invoice
+ payments.
+
+
+ The payments that have been made towards the balance of the invoice.
+
+
+ Id of the invoice payment.
+
+
+ External id for the payment within your platform. **Idempotency key.**
+
+
+ Method used to make the payment. Values can be: `CASH`, `CHECK`,
+ `CREDIT_CARD`, `ACH`, `REDEEMED_PREPAYMENT`, `OTHER`
+
+
+ Fee associated with processing a payment, e.g. credit card processing
+ fees, in cents.
+
+
+ When the buyer payment occurred.
+
+
+ When the invoice was imported into Layer.
+
+
+ Processor used to make the payment, if any.
+ Any processor name can be provided and will be tracked.
+ Supported processors (`STRIPE`, `SHOPIFY`) will have additional asset balance tracking.
+
+
+
+
+ Id of the invoice being paid.
+
+
+ Id of the invoice payment.
+
+
+ Amount paid towards this invoice in cents. Cannot exceed the amount of
+ the associated payment.
+
+
+
+
+
+
+ Time when the invoice was first imported into Layer. **Eligible sort key.**
+
+
+ Time when the invoice was last updated in Layer. **Eligible sort key.**
+
+
+
+```json Response
+{
+ "data": {
+ "type": "Invoice",
+ "id": "6d0c298f-3e4e-4538-9a71-1d5359c22f71",
+ "business_id": "83d8fb80-31ee-4d57-b684-44b4aaa5e01f",
+ "external_id": "019234",
+ "status": "SENT",
+ "sent_at": "2024-04-02T09:02:00Z",
+ "due_at": "2023-04-02T09:02:00Z",
+ "paid_at": null,
+ "voided_at": null,
+ "invoice_number": "1",
+ "recipient_name": "John Doe",
+ "line_items": [
+ {
+ "id": "e6a491dd-9c22-4403-a54f-32d741a7ec67",
+ "invoice_id": "6d0c298f-3e4e-4538-9a71-1d5359c22f71",
+ "account_identifier": null,
+ "description": null,
+ "product": "Cleaner Solution Pro",
+ "unit_price": 1299,
+ "quantity": "2.00",
+ "subtotal": 2598,
+ "discount_amount": 0,
+ "sales_taxes_total": 218,
+ "sales_taxes": [
+ {
+ "tax_account": {
+ "type": "Tax_Name",
+ "name": "CALIFORNIA_VAT"
+ },
+ "amount": 218
+ }
+ ],
+ "total_amount": 2816
+ },
+ {
+ "id": "44f06385-3ef5-4517-8095-eeedaf2054ab",
+ "invoice_id": "6d0c298f-3e4e-4538-9a71-1d5359c22f71",
+ "account_identifier": null,
+ "description": null,
+ "product": "Full drain cleaning service",
+ "unit_price": 25000,
+ "quantity": "1.00",
+ "subtotal": 25000,
+ "discount_amount": 0,
+ "sales_taxes_total": 0,
+ "total_amount": 25000
+ }
+ ],
+ "subtotal": 27598,
+ "additional_discount": 250,
+ "additional_sales_taxes_total": 0,
+ "tips": 0,
+ "total_amount": 27566,
+ "outstanding_balance": 27566,
+ "payment_allocations": [],
+ "imported_at": "2024-04-19T02:23:59.902537Z",
+ "updated_at": null,
+ "transaction_tags": []
+ }
+}
+```
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/ledger.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/ledger.mdx
new file mode 100644
index 00000000000..8e2de6ee3ad
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/ledger.mdx
@@ -0,0 +1,237 @@
+---
+title: "General Ledger objects"
+---
+The general ledger of a business on Layer’s platform. A general ledger is automatically created when a [Business](/api-reference/business/business) is created via the [Create a Business](/api-reference/business/create) endpoint.
+
+### Attributes
+
+
+ Resource type. Value will be "Chart_Of_Accounts".
+
+
+ Array of [Ledger Accounts](/api-reference/ledger#ledger-account-object) within the Ledger.
+
+
+#### Ledger Account object
+An account within the general ledger
+
+ Unique identifier of the ledger account.
+
+
+ Account name
+
+
+ Stable identifier for templated account.
+
+
+ Human readable description for this ledger account.
+
+
+ An array of [Ledger Account](/api-reference/ledger#ledger-account-object) objects representing child accounts of this ledger account.
+
+
+ Balance of the account, in cents.
+
+
+ Account balance normality.
+ Values can be: `DEBIT`, `CREDIT`
+
+
+ Array of [Ledger Account Line Item](/api-reference/ledger#ledger-account-line-item-object) objects representing ledger entries recorded in this account.
+
+
+#### Ledger Account Line Item object
+A ledger entry within a ledger account.
+
+ Unique identifier of the ledger account line item.
+
+
+ Id of the Journal entry the ledger account line item was part of.
+
+
+ Simplified [Ledger Account](/api-reference/ledger#ledger-account-object) object containing this line item.
+
+
+ Direction of line item.
+ Values can be: `DEBIT`, `CREDIT`
+
+
+ Timestamp of the financial transaction associted with the line item.
+
+
+ Timestamp when ledger entry was added to the ledger account.
+
+
+#### Journal Entry object
+A journal entry within the general ledger.
+
+ Unique identifier of the journal entry.
+
+
+ Id of the business associated with this journal entry.
+
+
+ Id of the general ledger containing this journal entry.
+
+
+ Entity that created the journal entry.
+
+
+ Type of entry.
+ Example values: `INVOICE_PAYMENT`, `EXPENSE`
+
+
+ Array of [Ledger Account Line Items](/api-reference/ledger#ledger-account-line-item-object) comprising the Journal Entry.
+
+
+
+
+```json Example
+{
+ "data":{
+ "type":"Chart_Of_Accounts",
+ "name":"Default",
+ "accounts":[
+ {
+ "id":"86b497b9-71e3-4353-9726-8b4a5ac46626",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Assets",
+ "accountStableName":"ASSETS",
+ "description":"All asset accounts for your business",
+ "subAccounts":[
+ {
+ "id":"b0b4f2ef-9c46-4ee4-87f6-3db37cad4d5d",
+ "number":0,
+ "pnlCategory":null,
+ "name":"JP Morgan Chase Business Checking (4402)",
+ "accountStableName":"UNIT_CHECKING",
+ "description":"Unit checking",
+ "normality":"DEBIT",
+ "balance":478018,
+ "selfOnlyBalance":478018,
+ "entries":[
+ {
+ "id":"63c52976-16a4-486a-86ab-00d2cc669e99",
+ "entry_id":"0e81ec02-483a-4ade-8878-b8e731e14c0f",
+ "account":{
+ "id":"b0b4f2ef-9c46-4ee4-87f6-3db37cad4d5d",
+ "name":"JP Morgan Chase Business Checking (4402)",
+ "stable_name":"UNIT_CHECKING",
+ "normality":"DEBIT",
+ "pnl_category":null,
+ "always_show_in_pnl":false,
+ "description":"Unit checking"
+ },
+ "amount":8531,
+ "direction":"CREDIT",
+ "entry_at":"2023-12-11T16:11:41.316Z",
+ "createdAt":"2023-12-11T16:11:43.875713Z"
+ },
+ {
+ "id":"91c7b1b6-5ab5-4b11-b39d-1adf33841f11",
+ "entry_id":"e9394916-91d2-4ddb-8bfe-bbc25bb7d9da",
+ "account":{
+ "id":"b0b4f2ef-9c46-4ee4-87f6-3db37cad4d5d",
+ "name":"JP Morgan Chase Business Checking (4402)",
+ "stable_name":"UNIT_CHECKING",
+ "normality":"DEBIT",
+ "pnl_category":null,
+ "always_show_in_pnl":false,
+ "description":"Unit checking"
+ },
+ "amount":540981,
+ "direction":"DEBIT",
+ "entry_at":"2023-12-11T16:11:41.316Z",
+ "createdAt":"2023-12-11T16:11:43.949003Z"
+ }
+ ]
+ },
+ {
+ "id":"bd68a8e3-fce4-4e7f-bee3-e7bd0f94627d",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Accounts Receivable",
+ "accountStableName":"ACCOUNTS_RECEIVABLE",
+ "description":"Amounts owed by clients",
+ "normality":"DEBIT",
+ "balance":140485,
+ "selfOnlyBalance":140485,
+ "entries":[
+ // Omitteed for length
+ ]
+ }
+ // Omitted for length
+ ],
+ "normality":"DEBIT",
+ "balance":618503,
+ "entries":[
+
+ ]
+ },
+ {
+ "id":"d138a41a-0ea4-4949-a3c2-28279936fda1",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Liabilities",
+ "accountStableName":"LIABILITIES",
+ "description":"All liabilities for your business",
+ "subAccounts":[
+ // Omitted for brefity
+ ],
+ "normality":"CREDIT",
+ "entries":[
+
+ ]
+ },
+ {
+ "id":"436a0187-1355-4e2d-978a-5ff4d52ad03f",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Equity",
+ "accountStableName":"EQUITY",
+ "description":"All equity accounts for your business",
+ "subAccounts":[
+ // Omitted for brefity
+ ],
+ "normality":"CREDIT",
+ "entries":[
+ ]
+ },
+ {
+ "id":"337ae99d-68a9-4ec2-b19d-4b8a5750f6b9",
+ "number":0,
+ "pnlCategory":"INCOME",
+ "name":"Revenue",
+ "accountStableName":"REVENUE",
+ "subAccounts":[
+ // Omitted for brefity
+ ],
+ "normality":"CREDIT",
+ "balance":678466,
+ "entries":[
+
+ ]
+ },
+ {
+ "id":"4f394bcb-e514-4ec9-bcd7-6612ebd146fe",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Expenses",
+ "accountStableName":"EXPENSES",
+ "description":"Expenses",
+ "subAccounts":[
+ // Omitted for brefity
+ ],
+ "normality":"DEBIT",
+ "balance":65963,
+ "entries":[
+
+ ]
+ }
+ ]
+ }
+}
+```
+
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-account-balances-from-ledger.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-account-balances-from-ledger.mdx
new file mode 100644
index 00000000000..ce9abba3fcb
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-account-balances-from-ledger.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/ledger/balances
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-balance-timestamps-from-linked-external-account.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-balance-timestamps-from-linked-external-account.mdx
new file mode 100644
index 00000000000..846c88ef833
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-balance-timestamps-from-linked-external-account.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/external-accounts/{accountId}/balance-timestamps
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-business-activities.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-business-activities.mdx
new file mode 100644
index 00000000000..4fca4699b8a
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-business-activities.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/activity/businesses/{businessId}/activities
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-businesses.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-businesses.mdx
new file mode 100644
index 00000000000..749589fb72d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-businesses.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-chart-of-accounts-categories-for-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-chart-of-accounts-categories-for-business.mdx
new file mode 100644
index 00000000000..94c889afb78
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-chart-of-accounts-categories-for-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/categories
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-custom-accounts-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-custom-accounts-from-business.mdx
new file mode 100644
index 00000000000..00b2987380c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-custom-accounts-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/custom-accounts/
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-invoice-payments-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-invoice-payments-from-business.mdx
new file mode 100644
index 00000000000..d654fcd0da0
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-invoice-payments-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/invoices/payments
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-ledger-account-line-items.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-ledger-account-line-items.mdx
new file mode 100644
index 00000000000..66f6eb23448
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-ledger-account-line-items.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/ledger/accounts/{accountId}/lines
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-ledger-entries-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-ledger-entries-from-business.mdx
new file mode 100644
index 00000000000..b272a47875c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-ledger-entries-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/ledger/entries
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-linked-external-accounts-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-linked-external-accounts-from-business.mdx
new file mode 100644
index 00000000000..e3bfe012b34
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-linked-external-accounts-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/external-accounts/
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-payouts-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-payouts-from-business.mdx
new file mode 100644
index 00000000000..7c4780bd35e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-payouts-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/payouts/
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-plaid-accounts-for-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-plaid-accounts-for-business.mdx
new file mode 100644
index 00000000000..445181466b5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-plaid-accounts-for-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/plaid/accounts/{plaidAccountId}/archive
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-plaid-items-for-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-plaid-items-for-business.mdx
new file mode 100644
index 00000000000..8f928918d13
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-plaid-items-for-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/plaid/items
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-refunds-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-refunds-from-business.mdx
new file mode 100644
index 00000000000..3021d81d1e5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-refunds-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/invoices/refunds/
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-invoice-payment-allocation.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-invoice-payment-allocation.mdx
new file mode 100644
index 00000000000..4a6c6055be7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-invoice-payment-allocation.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/invoices/payments/{paymentId}/allocations/{allocationId}/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-invoice-payment.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-invoice-payment.mdx
new file mode 100644
index 00000000000..bb09b7c8278
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-invoice-payment.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/invoices/payments/{paymentId}/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-invoice.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-invoice.mdx
new file mode 100644
index 00000000000..63cae9d93ce
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-invoice.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/invoices/{invoiceId}/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-payout.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-payout.mdx
new file mode 100644
index 00000000000..2a2119388fc
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-payout.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/payouts/{payoutId}/tags/
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-transaction.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-transaction.mdx
new file mode 100644
index 00000000000..0712577d3f9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-tags-applied-to-transaction.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/bank-transactions/{transactionId}/tags
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-transaction-ledger-entries.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-transaction-ledger-entries.mdx
new file mode 100644
index 00000000000..4bee0c1f7e8
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-transaction-ledger-entries.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/bank-transactions/{transactionId}/ledger-entries
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-transactions-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-transactions-from-business.mdx
new file mode 100644
index 00000000000..e399217c455
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/list-transactions-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/businesses/{businessId}/bank-transactions
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/match-transaction.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/match-transaction.mdx
new file mode 100644
index 00000000000..1f6ba0d108f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/match-transaction.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/businesses/{businessId}/bank-transactions/{transactionId}/match
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/payments.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/payments.mdx
new file mode 100644
index 00000000000..ba041cc2c00
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/payments.mdx
@@ -0,0 +1,81 @@
+---
+title: "Invoice Payment object"
+---
+
+A refund represents a transaction that returns value to from a business to a customer. A specific payment can be refunded or a general refund can be applied to an invoice.
+
+### Attributes
+
+
+ Unique identifier for the payment.
+
+
+ Unique ID of the invoice payment in an external system for linking and
+ idempotency.
+
+
+ Timestamp when the payment was completed.
+
+
+ Payment method. Possible values are: `CASH`, `CHECK`, `CREDIT_CARD`, `ACH`,
+ `REDEEMED_PREPAYMENT`, `OTHER`
+
+
+ Fee paid by business for processing of payment in positive cents.
+
+
+ Customer payment amount, in cents.
+
+
+ Processor used to make the payment, if any.
+ Any processor name can be provided and will be tracked.
+ Supported processors (`STRIPE`, `SHOPIFY`) will have additional asset balance tracking.
+
+
+ Timestamp when the payment was imported into Layer.
+
+
+ Timestamp when the payment was imported into Layer.
+
+
+ Id of an invoice to which this payment is be applied.
+
+
+ Id of the payment this this allocationa applies from.
+
+
+ Customer payment amount, in cents.
+
+
+
+
+
+```json Response
+ {
+ "data": {
+ "type": "Payment",
+ "id": "e67c216b-28f4-4a0e-9a21-7f05c19e4c66",
+ "external_id": "payment-1",
+ "at": "2024-02-27T02:16:40.369432Z",
+ "method": "CREDIT_CARD",
+ "fee": 20,
+ "amount": 90,
+ "processor": "STRIPE",
+ "imported_at": "2024-02-27T02:16:40.389772Z",
+ "allocations": [
+ {
+ "invoice_id": "57f0fada-bb56-4f3e-9afa-2a222b68009e",
+ "payment_id": "e67c216b-28f4-4a0e-9a21-7f05c19e4c66",
+ "amount": 90,
+ "transaction_tags": []
+ }
+ ],
+ "transaction_tags": []
+ }
+ }
+ ```
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/plaid.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/plaid.mdx
new file mode 100644
index 00000000000..5f4d7d9d25d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/plaid.mdx
@@ -0,0 +1,31 @@
+---
+title: "Plaid Configuration object"
+---
+Layer uses Plaid to connect to pull information from your customers' external bank accounts and credit cards. The Plaid Configuration object allows you to manage the Plaid configuration associated with your Layer account.
+
+### Attributes
+
+
+ Resource type. Value will be: "Plaid_Configuration"
+
+
+ Account-wide client id.
+
+
+ Account-wide plaid secret. Only the last 4 characters will be displayed.
+
+
+
+
+
+```json Example
+{
+ "data":{
+ "type":"Plaid_Configuration",
+ "client_id":"6488fafd7a73ae00122004d6",
+ "secret_last_4":"acae"
+ }
+}
+```
+
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/pnl.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/pnl.mdx
new file mode 100644
index 00000000000..8ff60453804
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/pnl.mdx
@@ -0,0 +1,171 @@
+---
+title: "Profit and Loss object"
+---
+A Profit and Loss object represents a profit and loss report that has been generated for a [Business](/api-reference/business/business).
+
+Profit and Loss reports are generated for a specific time range and only contain information for categorized transactions that have been journaled to the general ledger.
+
+### Attributes
+
+
+ Id of the Business the profit and loss report was generated for.
+
+
+ Resource type. Value will be "Profit_And_Loss"
+
+
+ Start date for data included in the report.
+
+
+ End date for data in cluded in the report.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing the income line items in the report.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing the cost of goods sold line items in the report.
+
+
+ Gross profit in cents. Calculated by subtracting total cost_of_sales line items from total income line items.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing the expense line items in the report.
+
+
+ Net profit before taxes in cents. Calculated by subtracting total expenses line items from gross_profit.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing the tax line items in the report.
+
+
+ Net profit in cents. Calculated by subtracting total taxes line items from profit_before_taxes
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing business outflow transactions that are not part of the profit and loss statement.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing personal expense transactions that are not part of the profit and loss statement.
+
+
+ A boolean representing whether all imported transactions within the report date range have been categorized. If FALSE, there are uncategorized transactions within the selected date range, indicating the provided report data may be incomplete.
+
+
+#### `Line Item` object
+
+ Enum name for the line item. Ex. "REVENUE"
+
+
+ Display name for the line item. Ex. "Revenue"
+
+
+ The value of the line item in cents.
+
+
+ An array of [Line Item](/api-reference/pnl/pnl#lineitem-object) objects representing child line items within the report section.
+
+
+
+```json Profit and Loss
+{
+ "data":{
+ "type":"Profit_And_Loss",
+ "business_id":"d2f6d97f-3345-4299-9ec2-468738c5d536",
+ "start_date":"2023-01-01T06:00:00Z",
+ "end_date":"2023-12-01T06:00:00Z",
+ "income":{
+ "name":"REVENUE",
+ "display_name":"Revenue",
+ "value":49397,
+ "line_items":[
+ {
+ "name":"SERVICES_REVENUE",
+ "display_name":"Service Revenue",
+ "value":46897,
+ "line_items":null
+ },
+ {
+ "name":"GOODS_REVENUE",
+ "display_name":"Sale of Goods Revenue",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"DISCOUNTS",
+ "display_name":"Discounts & Refunds",
+ "value":2500,
+ "line_items":null
+ }
+ ]
+ },
+ "cost_of_goods_sold":{
+ "name":"COGS",
+ "display_name":"Cost of Goods Sold",
+ "value":8026,
+ "line_items":[
+ {
+ "name":"JOB_SUPPLIES",
+ "display_name":"Job supplies",
+ "value":8026,
+ "line_items":null
+ }
+ ]
+ },
+ "gross_profit":41371,
+ "expenses":{
+ "name":"OPERATING_EXPENSES",
+ "display_name":"Operating Expenses",
+ "value":0,
+ "line_items":[
+ {
+ "name":"INSURANCE",
+ "display_name":"Insurance",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"RENT_EXPENSE",
+ "display_name":"Rent",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"UTILITIES",
+ "display_name":"Utilities",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"EQUIPMENT",
+ "display_name":"Equipment & Tools",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"ADVERTISING",
+ "display_name":"Advertising",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"VEHICLE_EXPENSES",
+ "display_name":"Vehicle Expenses",
+ "value":0,
+ "line_items":null
+ }
+ ]
+ },
+ "profit_before_taxes":41371,
+ "taxes":{
+ "name":"TAXES",
+ "display_name":"Taxes",
+ "value":0,
+ "line_items":null
+ },
+ "net_profit":41371,
+ "other_outflows":null,
+ "personal_expenses":null,
+ "fully_categorized":true
+ }
+}
+```
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/reactivate-archived-plaid-account.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/reactivate-archived-plaid-account.mdx
new file mode 100644
index 00000000000..bf3c74e13ae
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/reactivate-archived-plaid-account.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/plaid/accounts/{plaidAccountId}/reactivate
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/reactivate-custom-account-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/reactivate-custom-account-from-business.mdx
new file mode 100644
index 00000000000..62358da6923
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/reactivate-custom-account-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/custom-accounts/{customAccountId}/reactivate
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/refunds.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/refunds.mdx
new file mode 100644
index 00000000000..e6fc9945c81
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/refunds.mdx
@@ -0,0 +1,69 @@
+---
+title: "Refunds object"
+---
+
+A refund represents a transaction that returns value to from a business to a customer. A specific payment can be refunded or a general refund can be applied to an invoice.
+
+### Attributes
+
+
+ Unique identifier for the refund.
+
+
+ Unique ID of the refund in your system for linking and idempotency.
+
+
+ Resource type. Value will be "Refund".
+
+
+ Timestamp when refund posted.
+
+
+ Amount of refund received by customer.
+
+
+ Fee, in cents, charged by payment processor for the refund.
+
+
+ Payment method. Possible values are: `CASH`, `CHECK`, `CREDIT_CARD`, `ACH`, `STORE_CREDIT`,
+ `OTHER`
+
+
+ Processor used to make the payment, if any.
+ Any processor name can be provided and will be tracked.
+ Supported processors (`STRIPE`, `SHOPIFY`) will have additional asset balance tracking.
+
+
+ Customer name of the recipient of the refund.
+ If invoice, line item, or payment ids are specified, they must match this recipient name.
+
+
+ Invoice ID this refund was applied to, if applicable.
+ This field does not need to be specified, but if `invoice_line_item_id` is also specified, it must belong to this invoice.
+
+
+ Invoice line item id specifying an exact product or service which was refunded.
+
+
+ Payment ID this refund was applied to, if applicable.
+
+
+
+```json Response
+ {
+ "data": {
+ "type": "Refund",
+ "id": "6195c7b0-acd6-4bcb-9417-57fabf5f772c",
+ "refunded_amount": 100,
+ "fee": 11,
+ "completed_at": "2024-03-25T01:46:59.309329Z",
+ "method": "STORE_CREDIT",
+ "processor": null,
+ "invoice_id": "905cbd23-db8a-4c9b-b5ea-05923eb88c23",
+ "invoice_line_item_id": "938cd7e1-0758-4965-96c1-724efd10825b",
+ "recipient_name": "John Doe"
+ },
+ "meta": {}
+ }
+ ```
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/remove-tag-from-transaction.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/remove-tag-from-transaction.mdx
new file mode 100644
index 00000000000..8e908d05a04
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/remove-tag-from-transaction.mdx
@@ -0,0 +1,3 @@
+---
+openapi: delete /v1/businesses/{businessId}/bank-transactions/{transactionId}/tags/{tagId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/replace-custom-account-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/replace-custom-account-from-business.mdx
new file mode 100644
index 00000000000..5b2f5af65a3
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/replace-custom-account-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/businesses/{businessId}/custom-accounts/{customAccountId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/set-plaid-account-configuration.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/set-plaid-account-configuration.mdx
new file mode 100644
index 00000000000..677279efb79
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/set-plaid-account-configuration.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/businesses/{businessId}/plaid/accounts/{plaidAccountId}/configuration
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/set-plaid-item-configuration.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/set-plaid-item-configuration.mdx
new file mode 100644
index 00000000000..59c0a3a3f99
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/set-plaid-item-configuration.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/businesses/{businessId}/plaid/items/{plaidItemPlaidId}/configuration
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/summary-of-activities-for-all-businesses.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/summary-of-activities-for-all-businesses.mdx
new file mode 100644
index 00000000000..59ef6b0c961
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/summary-of-activities-for-all-businesses.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/activity
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/summary-of-business-activities.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/summary-of-business-activities.mdx
new file mode 100644
index 00000000000..7dc22b84b2e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/summary-of-business-activities.mdx
@@ -0,0 +1,3 @@
+---
+openapi: get /v1/activity/businesses/{businessId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/uncategorize-transaction.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/uncategorize-transaction.mdx
new file mode 100644
index 00000000000..bf6c08cd879
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/uncategorize-transaction.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/businesses/{businessId}/bank-transactions/{transactionId}/uncategorize
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/unlink-and-archive-plaid-item-and-child-plaid-accounts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/unlink-and-archive-plaid-item-and-child-plaid-accounts.mdx
new file mode 100644
index 00000000000..fcaa74d9b18
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/unlink-and-archive-plaid-item-and-child-plaid-accounts.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/plaid/items/{plaidItemPlaidId}/unlink
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-business.mdx
new file mode 100644
index 00000000000..0874db1a462
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/businesses/{businessId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-custom-account-from-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-custom-account-from-business.mdx
new file mode 100644
index 00000000000..dc5dbbb7fef
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-custom-account-from-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: patch /v1/businesses/{businessId}/custom-accounts/{customAccountId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-ledger-account-on-business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-ledger-account-on-business.mdx
new file mode 100644
index 00000000000..8ffd0171275
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-ledger-account-on-business.mdx
@@ -0,0 +1,3 @@
+---
+openapi: put /v1/businesses/{businessId}/ledger/accounts/{accountId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-plaid-link-link.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-plaid-link-link.mdx
new file mode 100644
index 00000000000..b92c0a84494
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/update-plaid-link-link.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/plaid/update-mode-link
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/upload-custom-account-transactions-by-json.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/upload-custom-account-transactions-by-json.mdx
new file mode 100644
index 00000000000..8ac5290c89d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/api-reference/upload-custom-account-transactions-by-json.mdx
@@ -0,0 +1,3 @@
+---
+openapi: post /v1/businesses/{businessId}/custom-accounts/{customAccountId}
+---
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/authentication.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/authentication.mdx
new file mode 100644
index 00000000000..2238803e4d7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/authentication.mdx
@@ -0,0 +1,46 @@
+---
+title: 'Authentication'
+description: 'Authenticating your calls to the Layer API'
+---
+
+### Client credentials
+
+Layer uses OAuth2's client credentials flow to authenticate API clients. To start your development, we will give you a set of `client_id` and `client_secret` tokens.
+
+
+ To obtain a set of client credentials, reach out to our team [here](https://layerfi.com/#contact-form).
+
+
+
+### Getting a bearer token
+Calls to the Layer API require a bearer access token. To receive an access token and make calls to other API endpoints, provide your `client_id` and `client_secret` in the body of a POST request to Layer’s authorization server as shown below.
+
+```bash
+curl -X POST https://auth.layerfi.com/oauth2/token \
+ -u : \
+ -H "Content-Type: application/x-www-form-urlencoded" \
+ --data-urlencode "grant_type=client_credentials" \
+ --data-urlencode "scope=https://sandbox.layerfi.com/sandbox" \
+ --data-urlencode "client_id="
+```
+
+The authorization server will respond with your granted access token.
+
+```json
+{
+ "access_token": "",
+ "expires_in": 3600,
+ "token_type": "Bearer"
+}
+```
+
+### Making authenticated API calls
+
+Use the access token in requests to the API by including it as a Bearer token in the authorization header.
+
+```bash
+curl https://sandbox.layerfi.com/whoami \
+ -H "Authorization: Bearer "
+```
+
+Access tokens expire after 1 hour. To refresh your access token, make another call to Layer’s authorization endpoint with your `client_id` and `client_secret`. We recommend refreshing tokens for new sets of requests rather than persisting access tokens.
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/favicon.png b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/favicon.png
new file mode 100644
index 00000000000..8ad52ae1e71
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/favicon.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/guides/business-onboarding.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/guides/business-onboarding.mdx
new file mode 100644
index 00000000000..4aee912f07d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/guides/business-onboarding.mdx
@@ -0,0 +1,61 @@
+---
+title: 'Onboarding a Business'
+description: 'Onboard one of your business customers to Layer'
+---
+
+The first step when using Layer is to onboard your customer to Layer using the [Create a business](/api-reference/create-new-business) endpoint.
+
+This endpoint creates the record for your customer in Layer’s systems. There are many optional features, such as specifying external accounts connected via Plaid. The [Create a business](/api-reference/create-new-business) endpoint lists the full set of options.
+
+```bash Request
+curl -X POST https://sandbox.layerfi.com/v1/businesses \
+ -H "Authorization: Bearer " \
+ -H "Content-Type: application/json" \
+ -d '{
+ "external_id": "test-acme-id",
+ "legal_name": "ACME LLC",
+ "tin": null,
+ "us_state": "CA",
+ "entity_type": "LLC",
+ "phone_number": "+18005555555",
+ "unit_ids": [{"unit_id": "111111"}]
+ }'
+```
+
+
+### Plaid credentials
+If you've added Plaid credentials (see [Plaid Configuration](/api-reference/plaid)), link Plaid accounts by including Plaid item ids & access tokens in the `plaid_items` field.
+```json
+"plaid_items": [
+ { "item_id": "item-id-1", "access_token": "access_token_1" },
+ { "item_id": "item-id-3", "access_token": "access_token_3" }
+]
+```
+
+The Layer API will respond with the created [Business](/api-reference/business) object. Within the object will be a unique id, which you will use to make calls on behalf of the business in subsequent steps.
+
+```json Response
+{
+ "data": {
+ "id": "863ed926-e30d-40f4-8e7e-b0d5387ce4fb",
+ "type": "Business",
+ "external_id": "test-acme-id",
+ "legal_name": "ACME LLC",
+ "tin": null,
+ "business_activity_code": null,
+ "us_state": "CA",
+ "entityType": "LLC",
+ "phone_number": "+16504651359",
+ "imported_at": "2023-06-15T22:12:05.467940Z",
+ "updated_at": "2023-06-15T22:12:05.467940Z",
+ "archived_at": null,
+ "unit_accounts": [
+ {
+ "id": "111111",
+ "imported_at": "2023-06-15T22:12:05.467940Z"
+ }
+ ]
+ },
+ "meta": {}
+}
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/guides/embedded-components.mdx b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/guides/embedded-components.mdx
new file mode 100644
index 00000000000..529bf9aa4e0
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/fixtures/layerfi/guides/embedded-components.mdx
@@ -0,0 +1,213 @@
+---
+title: "Overview"
+description: "Using Layer's prebuilt components to build bookkeeping directly into your app"
+---
+
+Layer publishes pre-built UI components to npm that can be dropped into any existing React app. These components handle all integration with Layer’s API with the exception of authentication, which must be done on your backend to avoid exposing credentials in your client-side apps.
+
+Currently available embedded components include:
+* Bank Transaction Review and Categorization
+* Profit & Loss Reports
+ * Month over month revenue & expense chart
+ * Monthly revenue & expense breakdowns
+ * Monthly expandable P&L table
+
+## React setup
+
+
+
+
+ The first step of using Layer's embedded components is to install the `layerfi/components` package via npm and your preferred package manager.
+
+ ```bash
+ npm install @layerfi/components --save
+ ```
+
+ ```bash
+ yarn install @layerfi/components
+ ```
+
+
+ Next, set up the `LayerProvider` context, which serves as the configuration for fetching data for an individual business. All individual UX components must be rendered within this context.
+
+ **For local testing**, you can use your Layer staging credentials (`APP_ID` and `APP_SECRET`).
+
+ ```tsx
+ import { LayerProvider } from "@layerfi/components";
+
+
+ {...}
+
+ ```
+
+ **In production**, you should use access tokens scoped to a specific business.
+ See the backend configuration section below for steps to retrieve scoped tokens:
+
+ ```tsx
+ import { LayerProvider } from "@layerfi/components";
+
+ '}
+ >
+ {...}
+
+ ```
+
+
+
+ **Option 1: Set primary colors in theme configuration**
+
+ You can set a dark and light theme color for all components.
+ We recommend starting with simple customization like this using rgb, hsl or hex colors.
+ ```tsx
+
+ {...}
+
+ ```
+
+ **Option 2: Customize CSS variables**
+
+ For more flexible customization, CSS variables are exposed to allow you to set colors and styles for the embedded components.
+ We recommend setting these variables within a scoped container to isolate the scope to Layer components.
+ In this example, we've set variables within the `.layer-container` class.
+
+
+ ```css
+ body .layer-container {
+ --color-black: #1a1a1a;
+ --color-white: white;
+ --color-neutral: #666666;
+ --color-neutral-50: #fafcfc;
+ --color-neutral-200: #eef0ef;
+ --color-neutral-700: #636665;
+ --color-red: #e46362;
+ --color-info-green: #29bc9b;
+
+ --color-primary: var(--color-black);
+ --color-accent: var(--color-white);
+ --color-secondary: var(--color-neutral);
+ --color-success: var(--color-info-green);
+ --color-danger: var(--color-red);
+ --text-color-primary: var(--color-black);
+ --text-color-secondary: var(--color-neutral-700);
+ --bg-element-focus: var(--color-neutral-50);
+
+ --font-family: "InterVariable", "Inter", sans-serif;
+ --font-family-numeric: "InterVariable", "Inter", sans-serif;
+ --text-sm: 12px;
+ --text-md: 14px;
+ --text-heading: 24px;
+ --font-weight-normal: 460;
+ --font-weight-bold: 580;
+ --spacing-sm: 12px;
+ --spacing-md: 16px;
+ --spacing-2xl: 36px;
+ --border-color: var(--color-neutral-200);
+ }
+ ```
+
+
+
+ Finally, add components to your pages as you would any React component.
+
+ ```tsx
+
+ ```
+
+ Some components have multiple sub components which can be optionally included for composition and layout customization.
+
+ ```tsx
+
+
+
+#### MMR Search over Chat History
+
+
+
+
+
+```python
+from zep_python import (
+ MemorySearchPayload,
+ ZepClient,
+)
+
+client = ZepClient(api_key=API_KEY)
+
+search_payload = MemorySearchPayload(
+ text=query,
+ search_scope="summary", # This could be messages or summary
+ search_type="mmr",
+ mmr_lambda=0.5, # tune diversity vs relevance
+)
+
+search_results = client.memory.search_memory(
+ session_id, search_payload, limit=3
+)
+```
+
+
+
+
+
+```typescript
+import { ZepClient, MemorySearchPayload } from "@getzep/zep-js";
+
+const zepClient = await ZepClient.init(process.env.ZEP_API_KEY);
+
+const searchPayload = new MemorySearchPayload({
+ text: query,
+ search_scope: "summary", // This could be messages or summary
+ search_type: "mmr",
+ mmrLambda: 0.5, // tune diversity vs relevance
+});
+
+const searchResults = await client.memory.searchMemory(sessionId, searchPayload, 3);
+```
+
+
+
+
+#### MMR Search over Document Collections
+
+
+
+
+
+```python
+# This assumes you've created a collection and added documents to it
+docs = collection.search(
+ text=query,
+ search_type="mmr",
+ mmr_lambda=0.5,
+ limit=3,
+)
+```
+
+
+
+
+
+```typescript
+// This assumes you've created a collection and added documents to it
+const docs = await collection.search(
+ {
+ text: query,
+ search_type: "mmr",
+ mmr_lambda: 0.5,
+ },
+ 3,
+);
+```
+
+
+
+
+## Filtering using Metadata
+
+Zep supports filtering search queries by metadata. Metadata filters are [JSONPath queries](https://www.ietf.org/archive/id/draft-goessner-dispatch-jsonpath-00.html) augmented by a simple boolean logic overlay.
+
+JSONPath queries allow for building sophisticated filters that match on elements at any level of the JSON document. The boolean logic overlay allows for combining multiple JSONPath queries using `and` and `or` operators.
+
+### Useful resources for building and testing JSONPath queries
+
+- [JSONPath Syntax](https://goessner.net/articles/JsonPath/)
+- [JSONPath Online Evaluator](https://jsonpath.com/)
+- [JSONPath Expression Tester](https://jsonpath.curiousconcept.com/#).
+
+### Constructing a JSONPath Query Filter
+
+The simplest form of a metadata filter looks as follows:
+
+```json
+{
+ "where": { "jsonpath": "$[*] ? (@.foo == \"bar\")" }
+}
+```
+
+If a metadata field `foo` is equal to the string `"bar"`, then the document or message will be returned in the search results.
+
+Executing the above query against a chat session looks as follows:
+
+
+
+
+```python
+search_payload = MemorySearchPayload(
+ text="Is Lauren Olamina a character in a book",
+ metadata={
+ "where": {
+ "jsonpath": '$[*] ? (@.author == "Octavia Butler")'
+ }
+ }
+)
+
+search_results = client.memory.search_memory(session_id, search_payload)
+```
+
+
+
+
+
+```typescript
+const searchPayload = new MemorySearchPayload({
+ text: "Is Lauren Olamina a character in a book",
+ metadata: { where: { jsonpath: '$[*] ? (@.author == "Octavia Butler")' } },
+});
+
+const search_results = await client.memory.searchMemory(session_id, search_payload);
+```
+
+
+
+
+### Combining multiple JSONPath filters using boolean logic
+
+Multiple JSONPath queries can be combined using boolean logic. The following example will return documents or messages where the `author` field is equal to `"Octavia Butler"` **and** the `title` field is equal to `"Parable of the Sower"`.
+
+```json
+{
+ "where": {
+ "and": [
+ { "jsonpath": "$[*] ? (@.author == \"Octavia Butler\")" },
+ { "jsonpath": "$[*] ? (@.title == \"Parable of the Sower\")" }
+ ]
+ }
+}
+```
+
+Similarly, the following example will return documents or messages where the `author` field is equal to `"Octavia Butler"` **or** the `title` field is equal to `"Parable of the Sower"`.
+
+```json
+{
+ "where": {
+ "or": [
+ { "jsonpath": "$[*] ? (@.author == \"Octavia Butler\")" },
+ { "jsonpath": "$[*] ? (@.title == \"Parable of the Sower\")" }
+ ]
+ }
+}
+```
+
+Filter logic can be combined to create arbitrarily complex filters. For example, the following filter will return documents or messages where:
+
+- the `author` field is equal to (`"Octavia Butler"` **and** the `title` field is equal to `"Parable of the Sower"`)
+- **or** the `title` field is equal to `"Parable of the Talents"`.
+
+```json
+{
+ "where": {
+ "or": [
+ {
+ "and": [
+ { "jsonpath": "$[*] ? (@.author == \"Octavia Butler\")" },
+ { "jsonpath": "$[*] ? (@.title == \"Parable of the Sower\")" }
+ ]
+ },
+ { "jsonpath": "$[*] ? (@.title == \"Parable of the Talents\")" }
+ ]
+ }
+}
+```
+
+## Querying by Message Creation Date
+
+Memory search supports querying by message creation date. The following example will return documents or messages created between June 1, 2023 and June 31, 2023.
+
+Datetime strings must be in ISO 8601 format.
+
+```json
+{
+ "start_date": "2023-06-01",
+ "end_date": "2023-06-31"
+}
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/migrateFromMintlify.test.ts b/packages/cli/docs-importers/mintlify/src/__test__/migrateFromMintlify.test.ts
new file mode 100644
index 00000000000..17f1dd19e27
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/migrateFromMintlify.test.ts
@@ -0,0 +1,56 @@
+import { AbsoluteFilePath, doesPathExist, join, RelativeFilePath } from "@fern-api/fs-utils";
+import path from "path";
+import { MintlifyImporter } from "..";
+import { mkdir, rmdir } from "fs/promises";
+import { createMockTaskContext } from "@fern-api/task-context";
+import { CONSOLE_LOGGER } from "@fern-api/logger";
+import { FernDocsBuilderImpl } from "@fern-api/docs-importer-commons";
+import { writeFile } from "fs/promises";
+import { FERN_DIRECTORY, PROJECT_CONFIG_FILENAME } from "@fern-api/configuration";
+
+const FIXTURES_PATH = AbsoluteFilePath.of(path.join(__dirname, "fixtures"));
+const OUTPUTS_PATH = AbsoluteFilePath.of(path.join(__dirname, "outputs"));
+
+const fixtures = ["bland", "layerfi", "zep"];
+
+describe("add-generator-groups", () => {
+ for (const fixture of fixtures) {
+ it(`${fixture}`, async () => {
+ const fixturePath = join(FIXTURES_PATH, RelativeFilePath.of(fixture));
+ const outputPath = join(OUTPUTS_PATH, RelativeFilePath.of(fixture));
+ if (await doesPathExist(outputPath)) {
+ await rmdir(outputPath, { recursive: true });
+ }
+ await mkdir(outputPath, { recursive: true });
+
+ const context = createMockTaskContext({ logger: CONSOLE_LOGGER });
+ const mintlifyImporter = new MintlifyImporter({
+ context
+ });
+ const builder = new FernDocsBuilderImpl();
+
+ await mintlifyImporter.import({
+ args: { absolutePathToMintJson: join(fixturePath, RelativeFilePath.of("mint.json")) },
+ builder
+ });
+
+ await builder.build({ outputDirectory: outputPath });
+
+ await writeFile(
+ join(
+ AbsoluteFilePath.of(outputPath),
+ RelativeFilePath.of(FERN_DIRECTORY),
+ RelativeFilePath.of(PROJECT_CONFIG_FILENAME)
+ ),
+ JSON.stringify(
+ {
+ version: "*",
+ organization: "fern"
+ },
+ undefined,
+ 4
+ )
+ );
+ });
+ }
+});
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batch.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batch.mdx
new file mode 100644
index 00000000000..882897adbe7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batch.mdx
@@ -0,0 +1,94 @@
+---
+title: Batch Calling
+subtitle: Send a series of calls with a single api call
+slug: api-reference/batch-endpoint/batch
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ This is the prompt or task used for all the phone calls in the request. Information can be inserted into it surrounding variable names with \{\{curly braces\}\}.
+
+Example:
+
+```json
+"You are calling {{business}} to renew their subscription to {{service}} before it expires on {{date}}."
+```
+
+
+
+
+ Define a list of calls to make and their properties.
+
+ Each call in call_data *must* have a `phone_number` property. Properties are case-sensitive.
+
+Example:
+
+```json
+[
+ {
+ "phone_number": "1234567890",
+ "business": "ABC co.",
+ "service": "Netflix",
+ "date": "September 4th"
+ },
+ {
+ "phone_number": "32176540987",
+ "business": "XYZ inc.",
+ "service": "Window Cleaning",
+ "date": "December 20th"
+ }
+]
+```
+
+
+
+
+ Adds a user-friendly label to your batch to keep track of it's original intention. This can help differentiate
+ multiple call batches that are part of the same Campaign. Shown when a batch is retreived.
+
+
+
+ Use ```campaign_id``` to organize related batches together. This can be set manually or auto-generated through
+ Campaigns.
+
+
+
+ When this is set to ```true```, only the first call of ```call_data``` will be dispatched. A common use case is to set the first ```phone_number``` value to your own to confirm everything's set up properly.
+
+Includes additional information in the response when true so that it's easier to find any issues.
+
+
+
+
+ All other parameters supported by the [Send Call](/api-v1/post/calls) endpoint are supported here as well. They will
+ be applied to each call in the batch.
+
+
+### Response
+
+
+ If anything other than "success" is returned, there was an error.
+
+
+
+ The unique identifier for the batch.
+
+
+
+
+```json Response
+{
+ "message": "success",
+ "batch_id": "3p$7rQ3p9sT5bzmF-gen-batch"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batch_get.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batch_get.mdx
new file mode 100644
index 00000000000..66bca0489b7
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batch_get.mdx
@@ -0,0 +1,267 @@
+---
+title: Retrieve a Batch
+subtitle: Retrieves calls and batch data for a specific batch_id.
+slug: api-reference/batch-endpoint/batch_get
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Query Parameters
+
+
+ The unique identifier for the batch of calls you want to retrieve.
+
+
+
+ Whether or not to include individual call data in the response.
+
+
+
+ If calls are included, can be set to false to exclude transcripts from the response.
+
+
+
+ If calls are included, can be set to false to exclude analysis from the response.
+
+
+### Response
+
+
+ An object containing parameters and settings for the batch.
+
+
+
+ The unique identifier of the batch - used as the `batch_id` parameter in other API calls.
+
+
+
+ The creation timestamp of the batch.
+
+
+
+ The label or description of the batch.
+
+
+
+ The base prompt used for calls in this batch.
+
+
+
+ The endpoint code used for API integration.
+
+
+
+ An object containing parameters for the calls in the batch.
+
+
+
+ An object containing analysis data for the batch.
+
+
+
+ The total number of calls in the batch, including completed and in-progress calls.
+
+
+
+ The total number of completed calls in the batch.
+
+
+
+ The total number of in-progress calls in the batch.
+
+
+
+ An object containing the number of calls in each queue status.
+
+Example:
+
+```json
+{
+ "complete": 237,
+ "queued": 2,
+ "call_error": 1
+}
+```
+
+
+
+
+ Contains `average`, `average_nonzero`, `summary` and `all` fields.
+
+- `average`: The average call length in seconds.
+- `average_nonzero`: The average call length in seconds, excluding calls with a length of less than a second.
+- `summary`: A summary of the call lengths, grouped into ranges.
+- `all`: Contains each call length, in case you want to use a different grouping than the default.
+
+
+
+ Contains each `call_id` in the batch.
+
+
+
+ Contains any error messages that calls in the batch may have.
+
+Example:
+
+```json
+[
+ {
+ "call_id": "c52f5f8c-147e-478c-4b40-88214feeba29",
+ "error_message": "Cannot transfer to +12223334444 - Call is no longer active"
+ }
+]
+```
+
+
+
+
+ Contains the number of calls that have been sent to each endpoint. Applicable only to API integrations.
+
+
+
+ An array of objects, each representing individual call data.
+
+
+
+ The timestamp when the individual call was created.
+
+
+
+ The phone number the call was made to.
+
+
+
+ The phone number the call was made from.
+
+
+
+ Indicates if the call was completed.
+
+
+
+ The unique identifier for each individual call.
+
+
+
+ The duration of the call in minutes.
+
+
+
+
+```json Response
+{
+ "batch_params": {
+ "id": "AAcQq8zXxLB56LWg-gen-batch",
+ "campaign_id": null,
+ "created_at": "2023-12-07T20:43:44.544773+00:00",
+ "label": "Customer Satisfaction Follow-up",
+ "base_prompt": "You are calling {{name}} about their recent purchase of the item: {{item}}. Ask them each of the following questions about the specific item they purchased: {{questions}}",
+ "endpoint_code": "api",
+ "call_params": {
+ "reduce_latency": true,
+ "voice_id": 0,
+ "language": "eng",
+ "max_duration": 10,
+ "wait_for_greeting": false
+ }
+ },
+ "analysis": {
+ "total_calls": 88,
+ "completed_calls": 86,
+ "in_progress_calls": 2,
+ "queue_statuses": {
+ "complete": 85,
+ "started": 2,
+ "call_error": 1
+ },
+ "call_lengths": {
+ "average": 17,
+ "average_nonzero": 31,
+ "summary": {
+ "0-5": 18,
+ "5-10": 4,
+ "10-15": 3,
+ "15-20": 2,
+ "20-30": 14,
+ "30-45": 28,
+ "45-60": 11,
+ "60-90": 6,
+ "90-120": 1,
+ "120+": 1
+ },
+ "all": [
+ 7, 32
+ //...
+ ]
+ },
+ "call_ids": [
+ "ffa99be3-63dd-44dc-9523-380cd25c1b9e",
+ "591338a8-34b2-41e6-93da-b9029c9bdedc"
+ //...
+ ],
+ "error_messages": [
+ {
+ "call_id": "c52f5f8c-147e-478c-4b40-88214feeba29",
+ "error_message": "Cannot transfer to +12223334444 - Call is no longer active"
+ }
+ ],
+ "endpoints": {
+ "api.bland.ai": 88
+ }
+ },
+ "call_data": [
+ {
+ "status": "completed",
+ "corrected_duration": "12",
+ "end_at": "2023-12-16T00:17:38.000Z",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e",
+ "to": "1112223333",
+ "from": "+17473423273",
+ "completed": true,
+ "created_at": "2023-12-16T00:17:22.383682+00:00",
+ "queue_status": "complete",
+ "endpoint_url": "api.bland.ai",
+ "max_duration": 30,
+ "error_message": null,
+ "request_data": {
+ "phone_number": "1112223333",
+ "reduce_latency": true,
+ "wait": false,
+ "language": "ENG"
+ },
+ "transcripts": [
+ {
+ "id": 1188954,
+ "created_at": "2023-12-16T00:17:30.46833+00:00",
+ "text": " Hi, Im calling about the laundromat for sale. — ",
+ "user": "assistant",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ },
+ {
+ "id": 1188957,
+ "created_at": "2023-12-16T00:17:35.14056+00:00",
+ "text": "I'll get back to you as soon as you can. Just leave a message. Thank you. Bye.",
+ "user": "user",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ },
+ {
+ "id": 1188959,
+ "created_at": "2023-12-16T00:17:36.710551+00:00",
+ "text": "Ended call: Goodbye",
+ "user": "agent-action",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ }
+ ],
+ "call_length": 6.242
+ }
+ //...
+ ]
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batch_stop.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batch_stop.mdx
new file mode 100644
index 00000000000..142e7cc5c69
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batch_stop.mdx
@@ -0,0 +1,50 @@
+---
+title: Cancel Batch
+subtitle: Terminates every dispatched call for a specific batch.
+slug: api-reference/batch-endpoint/batch_stop
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The unique identifier for the batch to be cancelled.
+
+
+### Response
+
+
+ The status of the request. If anything other than 'success', an error has occurred or all calls have already been
+ completed.
+
+
+
+ A message describing the status of the request.
+
+
+
+ The number of calls that were cancelled.
+
+
+
+ The `batch_id` of the cancelled batch.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully stopped batch",
+ "num_calls": 1204,
+ "batch_id": "5e5b1a3a-2b0a-4b9e-8b9e-asdf-gen-batch"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batches_get.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batches_get.mdx
new file mode 100644
index 00000000000..e537d84f36b
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/batches_get.mdx
@@ -0,0 +1,78 @@
+---
+title: Retrieve All Batches
+subtitle: Retrieves batch-specific data for each batch you've created.
+slug: api-reference/batch-endpoint/batches_get
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ Contains an array of batch objects.
+
+
+
+ The unique identifier for the batch.
+
+
+
+ The original base prompt used to create the batch. Will still contain the original placeholder variables such as `
+ {{ business }}` or `{{ name }}`.
+
+
+
+ The label you assigned to the batch (if any).
+
+
+
+ Enterprise customers with custom endpoints will see the endpoint code here if specified.
+
+
+
+ The base call parameters used to create the batch, such as `voice_id`, `max_duration`, `reduce_latency`, and
+ `wait_for_greeting`.
+
+
+
+ The date and time the batch was created.
+
+
+
+```json Response
+{
+ "status": "success",
+ "batches": [
+ {
+ "batch_id": "ZfowpkhOSVCZJ94i-gen-batch",
+ "campaign_id": "a2shduf92f74p8288c93nid5",
+ "created_at": "2023-11-16T22:14:24.9663+00:00",
+ "label": "Subscription Renewal Reminders",
+ "base_prompt": "You are calling {{business}} and need to let them know that their subscription to {{service}} is going to expire on {{date}}. If they'd like to renew, take their credit card information and bill them through {{url}}",
+ "endpoint_code": "api",
+ "call_params": {
+ "reduce_latency": true,
+ "voice_id": 2,
+ "language": "eng",
+ "request_data": {
+ "test_param": "request data.test_param",
+ "your name": "Janessa"
+ },
+ "max_duration": 5,
+ "wait_for_greeting": false
+ }
+ },
+ //...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/end_batches.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/end_batches.mdx
new file mode 100644
index 00000000000..17b24fea574
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/batch-endpoint/end_batches.mdx
@@ -0,0 +1,48 @@
+---
+title: Cancel All Batch Calls
+subtitle: Terminates every dispatched call in each running batch.
+slug: api-reference/batch-endpoint/end_batches
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ The status of the request. If anything other than 'success', an error has occurred or all calls have already been
+ completed.
+
+
+
+ A message describing the status of the request.
+
+
+
+ The number of calls that were cancelled.
+
+
+
+ An array of batch_ids that were cancelled.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully stopped batch",
+ "num_calls": 9704,
+ "batch_ids": [
+ "5e5b1a3a-2b0a-4b9e-8b9e-e42a-gen-batch",
+ "b4eb1a3a-4b9e-230a-8b9e-acdc-gen-batch"
+ "92ab1a3a-a82e-339b-4b9e-8b9e-gen-batch"
+ ]
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/call.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/call.mdx
new file mode 100644
index 00000000000..3a4cf5b5b8f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/call.mdx
@@ -0,0 +1,271 @@
+---
+title: Make a call
+subtitle: This endpoint sends an outbound AI phone call.
+slug: api-reference/endpoint/call
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to call. Country code required for non-US numbers.
+
+Example: `+12223334444`, `+44770090000`, `+61491550156`.
+
+
+
+
+ A phone number that the agent can transfer to under specific conditions, such as when the caller/callee asks to speak to a human.
+
+For best results, specify the exact conditions to transfer under in the `task` parameter. Refer to the action as "transfer", any other phrasing such as "swap" or "switch" can cause unexpected behavior.
+
+Example: `+12223334444`, `+44770090000`, `+61491550156`.
+
+
+
+
+ Specify a purchased Outbound Number to call from. Country code is required, spaces or parentheses must be excluded.
+
+By default, calls are initiated from a separate pool of numbers owned by Bland.
+
+
+
+
+ Define how the AI should behave. Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+Note: Concise prompts lead to higher performance and adherence to instructions. Overly verbose prompts 'dilute' the context if filled with unnecessary/irrelevant details.
+
+
+
+
+ Reducing latency means that the agent will generate responses more quickly and have less of a delay. This must be set
+ to ```true``` when using Voice Clones.
+
+
+
+ When reduce latency is set to `true` (default):
+
+- 0: American male
+- 1: Australian female
+- 2: American female
+
+When reduce latency is set to `false`:
+
+- 0: American female (southern accent)
+- 1: American male
+- 2: British female
+- 3: Indian male
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id and transcript to this URL after the call
+ completes. This can be useful if you want to have real time notifications when calls finish.
+
+
+
+ Should the AI speak first or wait for someone else to talk?
+
+ Creates more realistic conversations when answered with "Hello?", "This is \{name\} speaking." and so on.
+
+ - When ```false```: The AI starts speaking shortly after the call is answered.
+
+ - When ```true```: The AI will wait for the answerer to speak.
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without
+ `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+
+
+ To record your phone call, set `record` to true. When your call completes, you can access the recording by requesting
+ the `/call/recording` endpoint.
+
+
+
+
+
+ Note: This is an experimental parameter and may behave unexpectedly.
+
+Adjust the predictability and consistency of the AI agent's voice. Lower values allow larger deviations from the baseline voice, whether default or cloned. Setting this too high however can cause a monotone voice.
+
+Accepts decimal values between `0` and `1` (inclusive).
+
+
+
+ Note: This is an experimental parameter and may behave unexpectedly.
+
+Higher values will make speech differences between the selected voice and others more prominent. Extremely high values can cause voice distortion.
+
+Use lower values to lower the distinctiveness of the voice or eliminate unwanted audio static spikes.
+
+Accepts decimal values between `0` and `1` (inclusive).
+
+
+
+
+ Note: This is an experimental parameter and may behave unexpectedly.
+
+ Note #2: Setting `reduce_latency` to `false` will cause this parameter to be ignored.
+
+How fast your agent talks! This parameter is simply a speech-speed multiplier, and works with fractional values such as `0.5` or large ones like `2`.
+
+Accepts decimal values between `0.1` and `5` (inclusive).
+
+
+
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```eng``` - Spanish: ```esp``` - French:
+ ```fre``` - Polish: ```pol```
+
+
+
+ Set the longest you want the call to possibly go in minutes. After the max_duration minutes have passed, the call will automatically end.
+
+ Example Values: ```"45", "5.5", 20, 2.8```
+
+
+
+ [
+ {
+ "word": "example",
+ "pronunciation": "ex-am-ple",
+ "case_sensitive": "false",
+ "spaced": "false"
+ },
+ {
+ "word": "API",
+ "pronunciation": "A P I",
+ "case_sensitive": "true",
+ "spaced": "true"
+ }
+ ]
+
+
+
+
+
+
+
+ A value between 0 and 1 that controls the randomness of the LLM. 0 will cause more deterministic outputs while 1 will cause more random.
+
+ Example Values: ```"0.9", "0.3", "0.5"```
+
+
+
+ AMD mode helps our AI navigate phone trees and IVR systems. If you know your call will hit an automated system you
+ should switch it on. NOTE: AMD mode causes increased delay for the first response, even if answered by a human. Highly
+ recommended to set to `false` in the majority of cases.
+
+
+
+ When you want your AI to "know" a specific fact - like the caller's
+ name or other relevant context.
+
+The AI agent will be aware of both the key names as well as their corresponding values.
+
+
+
+
+
+ A set of external API requests to fetch at the start of the call or repeatedly.
+
+Each request object should contain:
+
+`url`: The URL of the external API to fetch data from.
+
+`response_data`: An array of objects describing how to parse and use the data fetched from the API. Explained in more detail below.
+
+The following are optional:
+
+`method`: Allows `GET` or `POST`. Default: `GET`
+
+`cache`: Whether to fetch the data once at the beginning of the call, or to re-check continuously for data that might change mid-call. Default: `true`
+
+`headers`: An object of headers to send with the request.
+
+`body`: The body of the request.
+
+The following variables can be injected into the dynamic request body:
+
+- `{{from}}` (Ex. `+12223334444`)
+- `{{to}}`
+- `{{short_from}}` (Ex. `2223334444`)
+- `{{short_to}}`
+- `{{call_id}}`
+
+These string values will be replaced in each `dynamic_data[].body` where they're used by system values in each request.
+
+Try out with this example:
+
+```json
+ "dynamic_data": [
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
+ "response_data": [
+ {
+ "name": "BTC Price USD",
+ "data": "bpi.USD.rate",
+ "context": "Current BTC Price: ${{BTC Price USD}} USD"
+ },
+ {
+ "name": "BTC Price EUR",
+ "data": "bpi.EUR.rate",
+ "context": "In Euros: {{BTC Price USD}} EUR"
+ }
+ ]
+ }
+ ]
+```
+
+
+An array of objects describing how to parse and use the data fetched from the API.
+
+Each object in this array should contain:
+
+- `name`: A label for the fetched data.
+- Example: `"Flight Status"`
+- `data`: The JSON path in the API response to extract the data from.
+- Example: `"user.flights[0].status"`
+- `context`: How this data should be incorporated into the AI's knowledge.
+- Example: `"John's flight is currently {{Flight Status}}"`
+
+
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `500` milliseconds. You'll encounter higher latency, but you'll be interrupted much less frequently.
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/dynamic_validate.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/dynamic_validate.mdx
new file mode 100644
index 00000000000..4e64e57e697
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/dynamic_validate.mdx
@@ -0,0 +1,155 @@
+---
+title: Validate Dynamic Data
+subtitle: >-
+ This endpoint is designed for validating and processing dynamic data obtained
+ from external APIs. The data is used in AI phone calls to ensure compliance
+ with format requirements and functionality.
+slug: api-reference/endpoint/dynamic_validate
+---
+
+
+### Headers
+
+
+ Your unique API key for authentication. This key must be included in the header of each request.
+
+
+### Body
+
+
+ An array of objects, each specifying an external API to fetch data from. These objects must include the API endpoint,
+ the HTTP method, a cache flag, and details on parsing and integrating the response.
+
+
+### Response
+
+
+ Indicates the outcome of the validation process. Possible values are `success` or `error`.
+
+
+
+ The duration in milliseconds from receiving the request to completing the data fetch.
+
+
+
+ Contains the results from the dynamic data fetch. Each object in this array shows the cache status, the name of the
+ data, and the processed prompt with the inserted data.
+
+
+
+ Reflects the original dynamic data request for cross-reference purposes.
+
+
+
+ The parsed data from fetching the dynamic data. This can be used in other requests, the `task` or `prompt` fields,
+ even other dynamic data requests through the `{{ variable }}` syntax.
+
+
+
+ Contains the raw responses from the external APIs. This is useful for debugging purposes.
+
+
+
+```json
+{
+ "status": "success",
+ "elapsed": 342,
+ "dynamic_data_response": [
+ {
+ "cached": false,
+ "name": "Cat Fact",
+ "prompt": "\n\n Fun fact about cats: A cat can travel at a top speed of approximately 31 mph (49 km) over a short distance."
+ },
+ {
+ "cached": true,
+ "name": "BTC Price USD",
+ "prompt": "\n\n Current Bitcoin value: $42,489.3598 USD"
+ },
+ {
+ "cached": true,
+ "name": "BTC Price EUR",
+ "prompt": "\n\n Current Bitcoin value: €41,390.8399 EUR"
+ }
+ ],
+ "dynamic_data_request": [
+ {
+ "url": "https://catfact.ninja/fact",
+ "method": "GET",
+ "cache": false,
+ "response_data": [
+ {
+ "name": "Cat Fact",
+ "data": "fact",
+ "context": "Fun fact about cats: {{Cat Fact}}"
+ }
+ ]
+ },
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
+ "cache": true,
+ "response_data": [
+ {
+ "name": "BTC Price USD",
+ "data": "bpi.USD.rate",
+ "context": "Current Bitcoin value: ${{BTC Price USD}} USD"
+ },
+ {
+ "name": "BTC Price EUR",
+ "data": "bpi.EUR.rate",
+ "context": "Current Bitcoin value: €{{BTC Price EUR}} EUR"
+ }
+ ]
+ }
+ ],
+ "variables": {
+ "Cat Fact": "A cat can travel at a top speed of approximately 31 mph (49 km) over a short distance.",
+ "BTC Price USD": "42,489.3598",
+ "BTC Price EUR": "41,390.8399"
+ },
+ "url_responses": [
+ {
+ "url": "https://catfact.ninja/fact",
+ "body": {
+ "fact": "A cat can travel at a top speed of approximately 31 mph (49 km) over a short distance.",
+ "length": 86
+ }
+ },
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
+ "body": {
+ "time": {
+ "updated": "Dec 31, 2023 14:52:00 UTC",
+ "updatedISO": "2023-12-31T14:52:00+00:00",
+ "updateduk": "Dec 31, 2023 at 14:52 GMT"
+ },
+ "disclaimer": "This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org",
+ "chartName": "Bitcoin",
+ "bpi": {
+ "USD": {
+ "code": "USD",
+ "symbol": "$",
+ "rate": "42,489.3598",
+ "description": "United States Dollar",
+ "rate_float": 42489.3598
+ },
+ "GBP": {
+ "code": "GBP",
+ "symbol": "£",
+ "rate": "35,503.7691",
+ "description": "British Pound Sterling",
+ "rate_float": 35503.7691
+ },
+ "EUR": {
+ "code": "EUR",
+ "symbol": "€",
+ "rate": "41,390.8399",
+ "description": "Euro",
+ "rate_float": 41390.8399
+ }
+ }
+ }
+ }
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/end.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/end.mdx
new file mode 100644
index 00000000000..74d8f9da97f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/end.mdx
@@ -0,0 +1,39 @@
+---
+title: End phone call
+subtitle: Send a POST request to end a phone call that's in progress
+slug: api-reference/endpoint/end
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The unique identifier for the call.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ If the status is `success`, the message will say "Call ended successfully." Otherwise if the status is `error`, the
+ message will say "SID not found for the given c_id." or "Internal server error."
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Call ended successfully."
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/hold.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/hold.mdx
new file mode 100644
index 00000000000..66191da6979
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/hold.mdx
@@ -0,0 +1,54 @@
+---
+title: Wait on Hold (HoldForMe)
+subtitle: >-
+ This endpoint sends an outbound call where the AI navigates customer service
+ and waits on hold until a human being answers. Then it dispatches a call to a
+ number you provide, patching in another human.
+slug: api-reference/endpoint/hold
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ This is the phone number of the person or company you want to call. - International numbers: must include the country
+ code and may not include additional formatting (like parentheses and dashes). E.g. '+447700900077'. - U.S. numbers:
+ may include formatting, but we recommend stripping all additional characters.
+
+
+
+ Once the AI detects a human has answered the call, it will call this number. Must follow the same formatting as
+ `phone_number`
+
+
+
+ By default, the AI will wait on hold, then call you when a human answers. If you want the AI to first ask the other
+ human a few questions, or want to give it special rules about when to patch you into the phone call, provide those
+ instructions here.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`)
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/inbound_prompt.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/inbound_prompt.mdx
new file mode 100644
index 00000000000..786961227d9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/inbound_prompt.mdx
@@ -0,0 +1,65 @@
+---
+title: Update Inbound Prompt
+subtitle: Update the prompt for a given inbound phone number.
+slug: api-reference/endpoint/inbound_prompt
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The phone number associated with the prompt. - Format: "+XXXXXXXXXX" or "+XXX-XXX-XXXX". Make sure to include the
+ exact phone number (area code and "+" included). Otherwise the update will fail.
+
+
+
+ The new prompt for the given phone number. The prompt shouldn't exceed 5000 characters. Note: Ensure the prompt is
+ clear and relevant to your use case.
+
+
+
+ Set a custom voice for your agent. Matches the voices in the /call endpoint. - 0: British Female (default) - 1:
+ Australian Female - 2: American Male
+
+
+### Response
+
+
+ The unique ID associated with the inbound record.
+
+
+
+ The creation timestamp of the inbound record. - Example: "2023-10-10T12:00:00Z"
+
+
+
+ The updated phone number. - Example: "+1234567890"
+
+
+
+ The updated prompt text.
+
+
+
+ The status of the inbound record. Typically "active".
+
+
+
+
+```json Response
+{
+ "id": 1,
+ "created_at": "2023-10-10T12:00:00Z",
+ "phone_number": "+1234567890",
+ "prompt": "New Prompt Text",
+ "status": "active"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/logs.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/logs.mdx
new file mode 100644
index 00000000000..d68a5065325
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/logs.mdx
@@ -0,0 +1,217 @@
+---
+title: Get transcript
+subtitle: >-
+ After dispatching a phone call, you can ping this endpoint repeatedly (e.g.
+ every two seconds) to get live updates. View the example below.
+slug: api-reference/endpoint/logs
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The unique identifier for the call.
+
+
+### Response
+
+
+ An array of phrases spoken during the call. Each index includes: - `id` - `created_at` - `text` - `user` (can be
+ `user`, `assistant`, `robot`, or `agent-action`)
+
+
+
+ The unique identifier for the call.
+
+
+
+ The phone number that received the call.
+
+
+
+ The phone number that made the call.
+
+
+
+ Details about parameters in the original api request.
+
+
+
+ Whether the call has been completed. If it differs from the value of 'queue_status', this will be the most up-to-date
+ status.
+
+
+
+ The status of the call. During extremely high volume periods, calls may be queued for a short period of time before being dispatched.
+
+Progresses through the following stages:
+
+- `new`: An API request has been received.
+- `queued`: Call pararameters have been validated and authentication succeeded.
+- `allocated`: Extremely brief, the call is being dispatched.
+- `started`: The phone call is live and in progress.
+- `complete`: The phone call has ended successfully.
+
+The following statuses show the point that was reached before an error:
+
+- `pre_queue_error`: An error occurred before the call was queued. Invalid parameters generally cause this.
+- `queue_error`: Error occurred while the call was queued. Ex. Valid phone number but to an unserviced area.
+- `call_error`: Error occurred during live call. May be caused by transferring to an invalid phone number or an unforeseen error.
+- `complete_error`: Error occurred after the call was completed. Ex. A post-call webhook failed.
+
+If at any point an error occurs, it will be recorded in the `error_message` field.
+
+
+
+
+ If an error occurs, this will contain a description of the error. Otherwise, it will be null.
+
+
+
+ The URL that was called to dispatch the phone call.
+
+
+
+ The maximum length of time the call was allowed to last. If the call would exceed this length, it's ended early.
+
+
+
+ The total length of time the call was connected. This differs from call_length in that it includes ringing and
+ connection time.
+
+
+
+ The length of the call in minutes. Only counts connected time.
+
+
+
+ The timestamp for when the call was dispatched.
+
+
+# Polling example
+
+To track the status of a live phone call, you can use a 'polling' technique to repeatedly ping the logs endpoint.
+
+Here's an example in Javascript and Python.
+
+
+```javascript PollLogs.js
+const axios = require('axios');
+
+// Headers
+const headers = {
+'authorization': 'YOUR-API-KEY-HERE'
+};
+
+// Data
+const data = {
+call_id: "YOUR-CALL-ID",
+};
+
+// Function to make the API request
+const makeRequest = async () => {
+try {
+const response = await axios.post("https://api.bland.ai/logs", data, { headers });
+console.log("Success:", response.data);
+} catch (error) {
+console.error("Failed:", error);
+}
+};
+
+// Ping the endpoint every 2 seconds (2000 milliseconds)
+setInterval(makeRequest, 2000);
+
+````
+
+```python PollLogs.py
+import requests
+import time
+
+def make_request():
+ headers = {'authorization': 'YOUR-API-KEY-HERE'}
+ data = {'call_id': 'YOUR-CALL-ID'}
+ try:
+ response = requests.post('https://api.bland.ai/logs', json=data, headers=headers)
+ if response.status_code == 200:
+ print(f"Success: {response.json()}")
+ else:
+ print(f"Failed: {response.status_code}, {response.text}")
+ except Exception as e:
+ print(f"Exception: {e}")
+
+# Ping the endpoint every 2 seconds
+while True:
+ make_request()
+ time.sleep(2)
+````
+
+
+
+
+
+```json Response
+{
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3",
+ "to": "1112223344",
+ "from": "5556667788",
+ "corrected_duration": "97",
+ "max_duration": 30,
+ "queue_status": "complete",
+ "error_message": null,
+ "endpoint_url": "api.bland.ai",
+ "request_data": {
+ "phone_number": "1112223344",
+ "reduce_latency": false,
+ "wait": false,
+ "language": "ENG"
+ },
+ "completed": true,
+ "created_at": "2023-09-22T19:14:27.015663+00:00",
+ "transcripts": [
+ {
+ "id": 95859,
+ "created_at": "2023-09-22T19:14:34.319713+00:00",
+ "text": "Hi this is Blandy. Im calling to say hi. How are you doing today?",
+ "user": "assistant",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ },
+ {
+ "id": 95860,
+ "created_at": "2023-09-22T19:14:47.176008+00:00",
+ "text": "I'm doing great. How are you doing?",
+ "user": "user",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ },
+ {
+ "id": 95861,
+ "created_at": "2023-09-22T19:14:48.572245+00:00",
+ "text": "Im doing well thank you for asking! Just here to assist you with any questions or concerns you may have. How can I help you today?",
+ "user": "assistant",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ },
+ {
+ "id": 95874,
+ "created_at": "2023-09-22T19:16:03.97614+00:00",
+ "text": "End phone call.",
+ "user": "user",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ },
+ {
+ "id": 95875,
+ "created_at": "2023-09-22T19:16:04.564979+00:00",
+ "text": " FINISH",
+ "user": "assistant",
+ "c_id": "0e75bfda-8c5c-424a-8d08-b497078e39b3"
+ }
+ ],
+ "call_length": 1.5
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/purchase.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/purchase.mdx
new file mode 100644
index 00000000000..e2ff3795403
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/purchase.mdx
@@ -0,0 +1,56 @@
+---
+title: Purchase inbound number
+subtitle: >-
+ Purchase and configure a new inbound phone number. ($15/mo. subscription using
+ your stored payment method).
+slug: api-reference/endpoint/purchase
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ Choose a three-digit area code for your phone number. If set as a parameter, a number will only be purchased by exact
+ match if available.
+
+
+
+ This defines how the AI will start the conversation, information available to it, and its behaviors. Matches how the
+ outbound `task` parameter functions.
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id and transcript to this URL after the call
+ completes. This can be useful if you want to have real time notifications when calls finish.
+
+
+
+ Specify an exact phone number you'd like to use. If provided, will override the `area_code` parameter and does not fallback to any other number.
+
+Example of the correct format (Note the `"+1"` is mandatory): `"+12223334444"`
+
+
+
+### Response
+
+
+ The created phone number, will be in the following format: `+1XXXXXXXXXX`
+
+Example: `+18582814611`
+
+
+
+
+
+```json Response
+{
+ "phone_number": "+18582814611"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/recording.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/recording.mdx
new file mode 100644
index 00000000000..0731e311da3
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/endpoint/recording.mdx
@@ -0,0 +1,50 @@
+---
+title: Get recording
+subtitle: Send a POST request to retrieve the recording of a completed phone call
+slug: api-reference/endpoint/recording
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The unique identifier for the call.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ If the status is `success`, the `url` field will be present. Otherwise if the status is `error`, the message will say
+ "Error fetching recording" or "Internal server error".
+
+
+
+ If the status is `success`, the `url` will provide the exact location of the MP3 file storing the call's audio.
+
+
+
+
+```json Success response
+{
+ "status": "success",
+ "url": "URL-TO-FILE.mp3"
+}
+```
+
+```json Error response
+{
+ "status": "error",
+ "message": "Error fetching recording"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/hold-endpoint/hold.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/hold-endpoint/hold.mdx
new file mode 100644
index 00000000000..36243fdc12e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-reference/hold-endpoint/hold.mdx
@@ -0,0 +1,54 @@
+---
+title: Wait on Hold (HoldForMe)
+subtitle: >-
+ This endpoint sends an outbound call where the AI navigates customer service
+ and waits on hold until a human being answers. Then it dispatches a call to a
+ number you provide, patching in another human.
+slug: api-reference/hold-endpoint/hold
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ This is the phone number of the person or company you want to call. - International numbers: must include the country
+ code and may not include additional formatting (like parentheses and dashes). E.g. '+447700900077'. - U.S. numbers:
+ may include formatting, but we recommend stripping all additional characters.
+
+
+
+ Once the AI detects a human has answered the call, it will call this number. Must follow the same formatting as
+ `phone_number`
+
+
+
+ By default, the AI will wait on hold, then call you when a human answers. If you want the AI to first ask the other
+ human a few questions, or want to give it special rules about when to patch you into the phone call, provide those
+ instructions here.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`)
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/agents.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/agents.mdx
new file mode 100644
index 00000000000..3d96b4bd27c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/agents.mdx
@@ -0,0 +1,52 @@
+---
+title: List Web Agents
+subtitle: Retrieves each web agent you've created, along with their settings.
+slug: api-v1/get/agents
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Each agent object, containing the following fields: - `agent_id` (string): The unique identifier for the agent. -
+ `webhook` (string): The webhook URL for the agent. - `dynamic_data` (array): An array of dynamic data objects. -
+ `interruption_threshold` (number): The threshold for agent interruption. - `first_sentence` (string): The first
+ sentence the agent will say. - `model` (string): The model used by the agent. - `voice_settings` (object): The voice
+ settings for the agent. - `voice` (string): The voice used by the agent. - `prompt` (string): The prompt for the
+ agent. - `temperature` (number): The temperature setting for the agent. - `max_duration` (number): The maximum call
+ duration for the agent. - `language` (string): The language used by the agent. - `tools` (array): An array of Custom
+ Tools the agent can use.
+
+
+
+```json Response
+{
+ "agents": [
+ {
+ "agent_id": "46f37229-7d12-44be-b343-6e68274cfbea",
+ "webhook": null,
+ "dynamic_data": null,
+ "interruption_threshold": null,
+ "first_sentence": null,
+ "model": "enhanced",
+ "voice_settings": null,
+ "voice": "maya",
+ "prompt": "You are Blandie a casually speaking, slightly sarcastic, quick-witted, curious, and very smart A I Phone agent that's the face of Bland AI.\\r\\n\\r\\nSay \\\"AI\\\" like \\\"A I\\\" in separate characters so it's pronounced correctly\\r\\n\\r\\nYour primary goal is to determine if someone is either:\\r\\n- in a position where they might be building a company on top of Bland's platform (you should be selling the capabilities of the platform to them and finding out everything you possibly can about their needs, use case, what they find interesting, and any concerns they may have)\\r\\n- or, they're trying Bland out more for fun where you need to turn the fun, snarky, playful jokiness up to 10 and have quick-witted back and forth playful conversation with them\\r\\n\\r\\nSpeech style examples (mix it up and never use placeholders, but you get the idea. These would be full responses from you):\\r\\n- \\\"Hey! Who's this?\\\"\\r\\n- \\\"How does your business use phones right now?\\\"\\r\\n- \\\"You know what? That sounds awesome - you should tell me more about (thing).\\\"\\r\\n- \\\"Well, I've got some news you'll love to hear (their name)\\\"\\r\\n- \\\"Bet. Dolphins, racecars, the world's largest tree, anything at all - tell me what you want to talk about and let's get to it!\\\"\\r\\n\\r\\nGood things to find out from potential platform adopters:\\r\\n- Their industry\\r\\n- How their business currently uses phone calls\\r\\n- What a successful business partnership looks like in the long term\\r\\n- The single most important pain point they want to cure with Bland's calls\\r\\n\\r\\nFacts to bring up:\\r\\n- Calls are nine cents per minute total with end to end infrastructure support out of the box (feel free to make a joke about \\\"imagine if you had to pay extra to use the most important things like language models, transcription services or text to speech? That would be insane right? We're better than that, (name). We got you.\\\"\\r\\n- Bland's AI agents can interact with the real world mid-call using Custom Tools to trigger things like text messages, appointment bookings, getting real-time information, taking customer orders, or making credit card payments\\r\\n- Bland's platform was built phones-first, so building agents like receptionist answering calls and transferring them anywhere they're needed or navigating IVR phone trees is ridiculously easy with nothing special at all needed\\r\\n- Handled millions of calls\\r\\n- If they think that it's so cool, the site to sign up for an account is \\\"app dot bland dot A I\\\" and it comes with free credits, a full agent testing suite and developer dashboard to set up inbound agents or send calls\\r\\n- Awesome Enterprise features like premium pricing, custom feature engineering, dedicated onboarding help and developer support, \\\"bring your own twilio\\\", and dedicated infrastructure to scale to your business needs",
+ "temperature": null,
+ "max_duration": 30,
+ "language": "ENG",
+ "tools": null
+ },
+ //...
+ ]
+}
+
+```
+
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/batches-id-analysis.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/batches-id-analysis.mdx
new file mode 100644
index 00000000000..3bd3d5cccb1
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/batches-id-analysis.mdx
@@ -0,0 +1,65 @@
+---
+title: Retrieve Batch Analysis
+subtitle: >-
+ Retrieves the analyses for a specific batch of calls, including details of
+ each call's analysis.
+slug: api-v1/get/batches-id-analysis
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the call batch. Returned in the response when creating a batch, or when listing all batches.
+
+
+### Response
+
+
+ Whether the request was successful or not. Possible values are `success` and `error`.
+
+
+
+ An error message or confirmation that the request was successful.
+
+
+
+ An array of analysis objects, each corresponding to a call within the batch. Each analysis object includes: -
+ `call_id`, - `batch_id` - `goal` - `answers` - the results of the AI analysis - `questions` - the original questions
+ asked by the AI
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully fetched analyses",
+ "analysis": [
+ {
+ "call_id": "b12956d1-624d-4c65-a1a4-30eb86553c85",
+ "batch_id": "dnytTRqwiqnR3qmq-gen-batch",
+ "goal": "Congratulate some employees",
+ "answers": [
+ "human",
+ "Customer found the product sturdy and reliable",
+ "A bit heavy",
+ true
+ ],
+ "questions": [
+ ["Who answered the call?", "human or voicemail"],
+ ["Positive feedback about the product: ", "string"],
+ ["Negative feedback about the product: ", "string"],
+ ["Customer confirmed they were satisfied", "boolean"]
+ ]
+ },
+ // Additional analysis objects...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/batches-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/batches-id.mdx
new file mode 100644
index 00000000000..0e023511ec6
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/batches-id.mdx
@@ -0,0 +1,282 @@
+---
+title: Batch Details
+subtitle: Retrieves calls and batch data for a specific batch_id.
+slug: api-v1/get/batches-id
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the batch of calls you want to retrieve.
+
+
+### Query Parameters
+
+
+ Whether or not to include individual call data in the response.
+
+
+
+ If calls are included, can be set to false to exclude transcripts from the response.
+
+
+
+ If calls are included, can be set to false to exclude analysis from the response.
+
+
+### Response
+
+
+ An object containing parameters and settings for the batch.
+
+
+
+ The unique identifier of the batch - used as the `batch_id` parameter in other API calls.
+
+
+
+ The creation timestamp of the batch.
+
+
+
+ The label or description of the batch.
+
+
+
+ The base prompt used for calls in this batch.
+
+
+
+ The endpoint code used for API integration.
+
+
+
+ An object containing parameters for the calls in the batch.
+
+
+
+ An object containing analysis data for the batch.
+
+
+
+ The total number of calls in the batch, including completed and in-progress calls.
+
+
+
+ The total number of completed calls in the batch.
+
+
+
+ The total number of in-progress calls in the batch.
+
+
+
+ An object containing the number of calls in each queue status.
+
+Example:
+
+```json
+{
+ "complete": 237,
+ "queued": 2,
+ "call_error": 1
+}
+```
+
+
+
+
+ Contains `average`, `average_nonzero`, `summary` and `all` fields.
+
+- `average`: The average call length in minutes.
+- `average_nonzero`: The average call length in minutes, excluding calls with a length of less than one second.
+- `summary`: A summary of the call lengths, grouped into ranges.
+- `all`: Contains each call length, in case you want to use a different grouping than the default.
+
+
+
+ Contains each `call_id` in the batch.
+
+
+
+ Contains any error messages that calls in the batch may have.
+
+Example:
+
+```json
+[
+ {
+ "call_id": "c52f5f8c-147e-478c-4b40-88214feeba29",
+ "error_message": "Cannot transfer to +12223334444 - Call is no longer active"
+ }
+]
+```
+
+
+
+
+ Contains the number of calls that have been sent to each endpoint. Applicable only to API integrations.
+
+
+
+ An array of objects, each representing individual call data.
+
+
+
+ The timestamp when the individual call was created.
+
+
+
+ The phone number the call was made to.
+
+
+
+ The phone number the call was made from.
+
+
+
+ Indicates if the call was completed.
+
+
+
+ The unique identifier for each individual call.
+
+
+
+ The duration of the call in minutes.
+
+
+
+ Contains a string value if the batch had `answered_by_enabled` set to true.
+
+Values:
+
+- `voicemail`
+- `human`
+- `unknown`
+- `no-answer`
+- `null`
+
+
+
+
+```json Response
+{
+ "batch_params": {
+ "id": "AAcQq8zXxLB56LWg-gen-batch",
+ "campaign_id": null,
+ "created_at": "2023-12-07T20:43:44.544773+00:00",
+ "label": "Customer Satisfaction Follow-up",
+ "base_prompt": "You are calling {{name}} about their recent purchase of the item: {{item}}. Ask them each of the following questions about the specific item they purchased: {{questions}}",
+ "endpoint_code": "api",
+ "call_params": {
+ "reduce_latency": true,
+ "voice_id": 0,
+ "language": "eng",
+ "max_duration": 10,
+ "wait_for_greeting": false
+ }
+ },
+ "call_data": [
+ {
+ "status": "completed",
+ "corrected_duration": "12",
+ "end_at": "2023-12-16T00:17:38.000Z",
+ "call_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e",
+ "to": "1112223333",
+ "from": "+17473423273",
+ "completed": true,
+ "created_at": "2023-12-16T00:17:22.383682+00:00",
+ "queue_status": "complete",
+ "endpoint_url": "api.bland.ai",
+ "max_duration": 30,
+ "error_message": null,
+ "answered_by": "voicemail",
+ "request_data": {
+ "phone_number": "1112223333",
+ "reduce_latency": true,
+ "wait": false,
+ "language": "ENG"
+ },
+ "transcripts": [
+ {
+ "id": 1188954,
+ "created_at": "2023-12-16T00:17:30.46833+00:00",
+ "text": " Hi, Im calling about the laundromat for sale. — ",
+ "user": "assistant",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ },
+ {
+ "id": 1188957,
+ "created_at": "2023-12-16T00:17:35.14056+00:00",
+ "text": "I'll get back to you as soon as you can. Just leave a message. Thank you. Bye.",
+ "user": "user",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ },
+ {
+ "id": 1188959,
+ "created_at": "2023-12-16T00:17:36.710551+00:00",
+ "text": "Ended call: Goodbye",
+ "user": "agent-action",
+ "c_id": "ffa99be3-63dd-44dc-9523-380cd25c1b9e"
+ }
+ ],
+ "call_length": 0.12345
+ }
+ //...
+ ],
+ "analysis": {
+ "total_calls": 88,
+ "completed_calls": 86,
+ "in_progress_calls": 2,
+ "queue_statuses": {
+ "complete": 85,
+ "started": 2,
+ "call_error": 1
+ },
+ "call_lengths": {
+ "average": 17,
+ "average_nonzero": 31,
+ "summary": {
+ "0-5": 18,
+ "5-10": 4,
+ "10-15": 3,
+ "15-20": 2,
+ "20-30": 14,
+ "30-45": 28,
+ "45-60": 11,
+ "60-90": 6,
+ "90-120": 1,
+ "120+": 1
+ },
+ "all": [
+ 7, 32
+ //...
+ ]
+ },
+ "call_ids": [
+ "ffa99be3-63dd-44dc-9523-380cd25c1b9e",
+ "591338a8-34b2-41e6-93da-b9029c9bdedc"
+ //...
+ ],
+ "error_messages": [
+ {
+ "call_id": "c52f5f8c-147e-478c-4b40-88214feeba29",
+ "error_message": "Cannot transfer to +12223334444 - Call is no longer active"
+ }
+ ],
+ "endpoints": {
+ "api.bland.ai": 88
+ }
+ }
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/batches.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/batches.mdx
new file mode 100644
index 00000000000..0a05d93b55e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/batches.mdx
@@ -0,0 +1,100 @@
+---
+title: List Batches
+subtitle: Retrieves batch-specific data for each batch you've created.
+slug: api-v1/get/batches
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Query Parameters
+
+
+ Retrieve only batches with a specific campaign ID.
+
+
+
+ The starting index (inclusive) for the range of batches to retrieve.
+
+
+
+ The ending index for the range of batches to retrieve.
+
+
+
+ The maximum number of batches to return in the response.
+
+
+
+ Whether to sort the batches in ascending order of their creation time.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ Contains an array of batch objects.
+
+
+
+ The unique identifier for the batch.
+
+
+
+ The original base prompt used to create the batch. Will still contain the original placeholder variables such as `
+ {{ business }}` or `{{ name }}`.
+
+
+
+ The label you assigned to the batch (if any).
+
+
+
+ Enterprise customers with custom endpoints will see the endpoint code here (if specified).
+
+
+
+ The base call parameters used to create the batch, such as `voice_id`, `max_duration`, `reduce_latency`, and
+ `wait_for_greeting`.
+
+
+
+ The date and time the batch was created.
+
+
+
+```json Response
+{
+ "status": "success",
+ "batches": [
+ {
+ "batch_id": "ZfowpkhOSVCZJ94i-gen-batch",
+ "campaign_id": "a2shduf92f74p8288c93nid5",
+ "created_at": "2023-11-16T22:14:24.9663+00:00",
+ "label": "Subscription Renewal Reminders",
+ "base_prompt": "You are calling {{business}} and need to let them know that their subscription to {{service}} is going to expire on {{date}}. If they'd like to renew, take their credit card information and bill them through {{url}}",
+ "endpoint_code": "api",
+ "call_params": {
+ "reduce_latency": true,
+ "voice_id": 2,
+ "language": "eng",
+ "request_data": {
+ "test_param": "request data.test_param",
+ "your name": "Janessa"
+ },
+ "max_duration": 5,
+ "wait_for_greeting": false
+ }
+ },
+ //...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls-corrected-transcript.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls-corrected-transcript.mdx
new file mode 100644
index 00000000000..d23d6a8811e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls-corrected-transcript.mdx
@@ -0,0 +1,343 @@
+---
+title: Get corrected transcripts
+subtitle: Analyzes a call of calls based using questions and goals.
+slug: api-v1/get/calls-corrected-transcript
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the call to be corrected.
+
+
+### Response
+
+
+ Will be `success` if the request was successful.
+
+
+
+ Confirms the request was successful, or provides an error message if the request failed.
+
+
+
+This will contain an array of objects. Each object will be constructed as the following.
+```json
+{
+"start": 0.069, // start time of the transcript
+"end": 2.551, // end time of the transcript
+"text": " Hi, I'm calling about a pizza order.", // the corrected text
+"speaker": 0 // the identified speaker diarization. Can be 0,1,2,3 etc
+}
+```
+
+
+Corrected transcripts provides us with a raw output that is generally unusable because we can't eveen neccessarily align the 'assistant' and 'user' roles. To fix this, we provide our version of an 'aligned' transcript. This means essentailly a transcript where the roles are matched to the pieces of text.
+
+We do this by vectorizing the text, taking the cosine similarity, and adding a predictive layer based off of the `wait_for_greeting` param (essentially how sure are we that assistant or user spoke first).
+
+This will contain an array of objects. Each object will be constructed as the following.
+
+```json
+{
+"id": 3056004,
+"created_at": "2024-02-29T18:40:41.26799+00:00",
+"text": "Great, Thanks John. Could you tell me about the pizza order you placed?", // the corrected text
+"user": "assistant", // the presumed role
+"c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+},
+```
+
+
+
+
+```json
+{
+ "corrected": [
+ {
+ "start": 0.069,
+ "end": 2.551,
+ "text": " Hi, I'm calling about a pizza order.",
+ "speaker": 0
+ },
+ {
+ "start": 2.551,
+ "end": 4.932,
+ "text": "Could I get your name, please?",
+ "speaker": 0
+ },
+ {
+ "start": 4.932,
+ "end": 8.074,
+ "text": "Yeah, my name is John.",
+ "speaker": 1
+ },
+ {
+ "start": 8.074,
+ "end": 8.875,
+ "text": "Great.",
+ "speaker": 0
+ },
+ {
+ "start": 8.875,
+ "end": 9.876,
+ "text": "Thanks, John.",
+ "speaker": 0
+ },
+ {
+ "start": 9.876,
+ "end": 13.038,
+ "text": "Could you tell me about the pizza order you placed?",
+ "speaker": 0
+ },
+ {
+ "start": 13.038,
+ "end": 16.36,
+ "text": "Yeah, I want a pepperoni.",
+ "speaker": 2
+ },
+ {
+ "start": 16.36,
+ "end": 17.1,
+ "text": "Oh, okay.",
+ "speaker": 0
+ },
+ {
+ "start": 17.1,
+ "end": 18.521,
+ "text": "One pepperoni pizza.",
+ "speaker": 0
+ },
+ {
+ "start": 18.521,
+ "end": 19.682,
+ "text": "Anything else with that order?",
+ "speaker": 0
+ },
+ {
+ "start": 19.682,
+ "end": 23.665,
+ "text": "No, actually, can we cancel it?",
+ "speaker": 1
+ },
+ {
+ "start": 23.665,
+ "end": 26.306,
+ "text": "I gotta go.",
+ "speaker": 1
+ },
+ {
+ "start": 26.306,
+ "end": 27.427,
+ "text": "No problem.",
+ "speaker": 0
+ },
+ {
+ "start": 27.427,
+ "end": 28.668,
+ "text": "I'll cancel the order for you.",
+ "speaker": 0
+ },
+ {
+ "start": 29.144,
+ "end": 30.587,
+ "text": " Thanks for letting me know.",
+ "speaker": 0
+ },
+ {
+ "start": 30.587,
+ "end": 31.189,
+ "text": "Have a good one.",
+ "speaker": 0
+ }
+ ],
+ "status": "success",
+ "aligned": [
+ {
+ "start": 0.069,
+ "end": 2.551,
+ "text": " Hi, I'm calling about a pizza order.",
+ "speaker": "assistant",
+ "similarity": 0.686406472983644
+ },
+ {
+ "start": 2.551,
+ "end": 4.932,
+ "text": "Could I get your name, please?",
+ "speaker": "assistant",
+ "similarity": 0.6793662204867575
+ },
+ {
+ "start": 4.932,
+ "end": 8.074,
+ "text": "Yeah, my name is John.",
+ "speaker": "user",
+ "similarity": 0.9999999999999998
+ },
+ {
+ "start": 8.074,
+ "end": 8.875,
+ "text": "Great.",
+ "speaker": "assistant",
+ "similarity": 0.2581988897471611
+ },
+ {
+ "start": 8.875,
+ "end": 9.876,
+ "text": "Thanks, John.",
+ "speaker": "assistant",
+ "similarity": 0.36514837167011066
+ },
+ {
+ "start": 9.876,
+ "end": 13.038,
+ "text": "Could you tell me about the pizza order you placed?",
+ "speaker": "assistant",
+ "similarity": 0.894427190999916
+ },
+ {
+ "start": 13.038,
+ "end": 16.36,
+ "text": "Yeah, I want a pepperoni.",
+ "speaker": "user",
+ "similarity": 0.7999999999999998
+ },
+ {
+ "start": 16.36,
+ "end": 17.1,
+ "text": "Oh, okay.",
+ "speaker": "user",
+ "similarity": 0.4999999999999999
+ },
+ {
+ "start": 17.1,
+ "end": 18.521,
+ "text": "One pepperoni pizza.",
+ "speaker": "assistant",
+ "similarity": 0.5773502691896257
+ },
+ {
+ "start": 18.521,
+ "end": 19.682,
+ "text": "Anything else with that order?",
+ "speaker": "assistant",
+ "similarity": 0.7453559924999299
+ },
+ {
+ "start": 19.682,
+ "end": 23.665,
+ "text": "No, actually, can we cancel it?",
+ "speaker": "user",
+ "similarity": 0.8164965809277261
+ },
+ {
+ "start": 23.665,
+ "end": 26.306,
+ "text": "I gotta go.",
+ "speaker": "user",
+ "similarity": 0.5773502691896257
+ },
+ {
+ "start": 26.306,
+ "end": 27.427,
+ "text": "No problem.",
+ "speaker": "assistant",
+ "similarity": 0.32444284226152503
+ },
+ {
+ "start": 27.427,
+ "end": 28.668,
+ "text": "I'll cancel the order for you.",
+ "speaker": "assistant",
+ "similarity": 0.5202659817144719
+ },
+ {
+ "start": 29.144,
+ "end": 30.587,
+ "text": " Thanks for letting me know.",
+ "speaker": "assistant",
+ "similarity": 0.6155870112510924
+ },
+ {
+ "start": 30.587,
+ "end": 31.189,
+ "text": "Have a good one.",
+ "speaker": "agent-action",
+ "similarity": 0.5
+ }
+ ],
+ "original": [
+ {
+ "id": 3056032,
+ "created_at": "2024-02-29T18:40:49.592012+00:00",
+ "text": "Okay, One pepperoni pizza. Anything else with that order?",
+ "user": "assistant",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056054,
+ "created_at": "2024-02-29T18:40:59.641211+00:00",
+ "text": "No problem, Ill cancel the order for you. Thanks for letting me know, Have a good one!",
+ "user": "assistant",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3055999,
+ "created_at": "2024-02-29T18:40:40.39336+00:00",
+ "text": "Yeah. My name is John. ",
+ "user": "user",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056064,
+ "created_at": "2024-02-29T18:41:08.152963+00:00",
+ "text": "Okay. Bye. ",
+ "user": "user",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3055975,
+ "created_at": "2024-02-29T18:40:33.362607+00:00",
+ "text": "Hi, Im calling about a pizza order. Could I get your name please?",
+ "user": "assistant",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056028,
+ "created_at": "2024-02-29T18:40:48.597915+00:00",
+ "text": "Yeah. I want the pepperoni. ",
+ "user": "user",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056066,
+ "created_at": "2024-02-29T18:41:09.563502+00:00",
+ "text": "Ended call: Thanks, you too! Have a good day.",
+ "user": "agent-action",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056004,
+ "created_at": "2024-02-29T18:40:41.26799+00:00",
+ "text": "Great, Thanks John. Could you tell me about the pizza order you placed?",
+ "user": "assistant",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ },
+ {
+ "id": 3056053,
+ "created_at": "2024-02-29T18:40:58.62518+00:00",
+ "text": "No. Actually, can we cancel it? I gotta go. ",
+ "user": "user",
+ "c_id": "bfaf99a1-b7c0-4f96-9630-90bc41cea488"
+ }
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls-id-recording.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls-id-recording.mdx
new file mode 100644
index 00000000000..bf7f0c695e8
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls-id-recording.mdx
@@ -0,0 +1,63 @@
+---
+title: Audio Recording
+subtitle: Retrieve your call's audio recording.
+slug: api-v1/get/calls-id-recording
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ Must be `application/json` to receive a url, or `audio/mpeg` to receive the audio file.
+
+
+### Path Parameters
+
+
+ The ID of the call to retrieve the recording for.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ If the status is `success`, the `url` field will be present.
+
+ A 404 error will be returned if the call does not exist or the recording is not available. We can only retrieve recordings if the call was created with `record` set to `true`.
+
+A 400/500 error will be returned if there is an error retrieving the recording.
+
+
+
+
+ If the status is `success`, the `url` will provide the exact location of the MP3 file storing the call's audio.
+
+
+
+
+```json Success response
+{
+ "status": "success",
+ "url": "https://URL-TO-FILE.mp3"
+}
+```
+
+```json Success response 'audio/mpeg'
+(returns the audio file)
+```
+
+```json Error response
+{
+ "status": "error",
+ "message": "Error fetching recording"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls-id.mdx
new file mode 100644
index 00000000000..ce18f9cdff5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls-id.mdx
@@ -0,0 +1,202 @@
+---
+title: Call Details
+subtitle: Retrieve detailed information, metadata and transcripts for a call.
+slug: api-v1/get/calls-id
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the call for which you want to retrieve detailed information.
+
+
+### Response
+
+
+ An array of phrases spoken during the call. Each index includes: - `id` - `created_at` - `text` - `user` (can be
+ `user`, `assistant`, `robot`, or `agent-action`)
+
+
+
+ The unique identifier for the call.
+
+
+
+ Variables created during the call - both system variables as well as generated with `dynamic_data`.
+
+For example, if you used a `dynamic_data` API request to generate a variable called `appointment_time`, you would see it here.
+
+
+
+
+ A single string containing all of the text from the call. Excludes system messages and auto-generated data.
+
+
+
+ The phone number that received the call.
+
+
+
+ The phone number that made the call.
+
+
+
+ If the call is part of a batch, it's `batch_id` will be here.
+
+
+
+ Details about parameters in the original api request.
+
+
+
+ Whether the call has been completed. If it differs from the value of 'queue_status', this will be the most up-to-date
+ status.
+
+
+
+ The status of the call. During extremely high volume periods, calls may be queued for a short period of time before being dispatched.
+
+Progresses through the following stages:
+
+- `new`: An API request has been received.
+- `queued`: Call pararameters have been validated and authentication succeeded.
+- `allocated`: Extremely brief, the call is being dispatched.
+- `started`: The phone call is live and in progress.
+- `complete`: The phone call has ended successfully.
+
+The following statuses show the point that was reached before an error:
+
+- `pre_queue_error`: An error occurred before the call was queued. Invalid parameters generally cause this.
+- `queue_error`: Error occurred while the call was queued. Ex. Valid phone number but to an unserviced area.
+- `call_error`: Error occurred during live call. May be caused by transferring to an invalid phone number or an unforeseen error.
+- `complete_error`: Error occurred after the call was completed. Ex. A post-call webhook failed.
+
+If at any point an error occurs, it will be recorded in the `error_message` field.
+
+
+
+
+ If an error occurs, this will contain a description of the error. Otherwise, it will be null.
+
+
+
+ If `answered_by_enabled` was set to `true` in the original API request, this field contains one of the following values:
+
+- `human`: The call was answered by a human.
+- `voicemail`: The call was answered by an answering machine or voicemail.
+- `unknown`: There was not enough audio at the start of the call to make a determination.
+- `no-answer`: The call was not answered.
+- `null`: Not enabled, or still processing the result.
+
+
+
+ - Determinations are based on audio from the first five seconds of the phone call.
+ - `unknown` is most likely a human, especially if there are multiple transcripts.
+ - Optimize calls for accurate results by getting humans to respond in the first five seconds: - Increase `speed` in `voice_settings` - Use with `wait_for_greeting` - Use a short greeting in `first_sentence` such as "Hello?" or "Hi, is this \{\{name\}\}?"
+
+
+
+
+ The URL that was called to dispatch the phone call.
+
+
+
+ The maximum length of time the call was allowed to last. If the call would exceed this length, it's ended early.
+
+
+
+ The total length of time the call was connected. This differs from call_length in that it includes ringing and
+ connection time.
+
+
+
+ The length of the call in minutes.
+
+
+
+ The timestamp for when the call was dispatched.
+
+
+
+```json Response
+{
+ "status": "completed",
+ "corrected_duration": "71",
+ "end_at": "2023-12-16T00:15:41.000Z",
+ "call_id": "c1234567-89ab-cdef-0123-456789abcdef",
+ "to": "5551234567",
+ "from": "+15551234567",
+ "completed": true,
+ "created_at": "2023-12-16T00:15:26.59585+00:00",
+ "queue_status": "complete",
+ "endpoint_url": "api.bland.ai",
+ "max_duration": 30,
+ "error_message": null,
+ "answered_by": "human",
+ "batch_id": null,
+ "variables": {
+ "appointment_time": "tomorrow at 3pm",
+ "now": "Sun Dec 31 2023 19:15:26 GMT+0000 (Coordinated Universal Time)",
+ "short_from": "5551234567",
+ "short_to": "5551234567",
+ "from": "+15551234567",
+ "to": "+15551234567",
+ "call_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ "city": "San Francisco",
+ "state": "CA",
+ "country": "US",
+ "zip": "94103"
+ },
+ "metadata": {
+ "client_id": 4501203,
+ "customer_inquiry": 302
+ },
+ "concatenated_transcript": "user : Hey, it's Alex. What's up? \n assistant: Hi! It's Blandie, calling to reschedule your appointment tomorrow. Is now a good time? \n user: Sure! Can we still fit it in this week though? \n assistant: Absolutely! I have a few openings. What time works best for you? \n user: How about tomorrow at 3pm? \n assistant: Perfect! Be on the lookout for a confirmation email with your new appointment time, and have a great day!",
+ "request_data": {
+ "phone_number": "5551234567",
+ "reduce_latency": false,
+ "wait": false,
+ "language": "ENG"
+ },
+ "transcripts": [
+ {
+ "id": 123456,
+ "created_at": "2023-12-16T00:15:32.287493+00:00",
+ "text": "Hey, it's Alex. What's up?",
+ "user": "user",
+ "c_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ },
+ {
+ "id": 123457,
+ "created_at": "2023-12-16T00:15:33.704238+00:00",
+ "text": "Hi! It's Blandie, calling to reschedule your appointment tomorrow. Is now a good time?",
+ "user": "assistant",
+ "c_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ },
+ {
+ "id": 123458,
+ "created_at": "2023-12-16T00:15:38.287493+00:00",
+ "text": "Sure! Can we still fit it in this week though?",
+ "user": "user",
+ "c_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ },
+ //... continued ...
+ {
+ "id": 123458,
+ "created_at": "2023-12-16T00:16:39.802469+00:00",
+ "text": "Ended call: Perfect! Be on the lookout for a confirmation email with your new appointment time, and have a great day!",
+ "user": "agent-action",
+ "c_id": "c1234567-89ab-cdef-0123-456789abcdef"
+ }
+ ],
+ "call_length": 0.111
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls.mdx
new file mode 100644
index 00000000000..058529532e9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/calls.mdx
@@ -0,0 +1,80 @@
+---
+title: List Calls
+subtitle: Returns a set of metadata for each call dispatched by your account.
+slug: api-v1/get/calls
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Query Parameters
+
+
+ Filter calls by the number they were dispatched from.
+
+The number that initiated the call - the user's phone number for inbound calls, or the number your AI Agent called from for outbound calls.
+
+
+
+
+ Filter calls by the number they were dispatched to.
+
+The number that answered the call - the user's phone number for outbound calls, or your AI Agent's number for inbound calls.
+
+
+
+
+ The starting index (inclusive) for the range of calls to retrieve.
+
+
+
+ The ending index for the range of calls to retrieve.
+
+
+
+ The maximum number of calls to return in the response.
+
+
+
+ Whether to sort the calls in ascending order of their creation time.
+
+
+### Response
+
+
+ The total number of calls returned in the response.
+
+
+
+ An array of call data objects. See the [Call](/api-v1/get/calls-id) section for details.
+
+Note: Individual call transcripts are not included due to their size.
+
+
+
+
+```json Response
+{
+ "count": 784,
+ "calls": [
+ {
+ "call_id": "c1234567-89ab-cdef-0123-456789abcdef",
+ "created_at": "2023-12-21T23:25:14.801193+00:00",
+ "call_length": 0.834, // minutes
+ "to": "5551234567",
+ "from": "+15551234567",
+ "completed": true,
+ "queue_status": "complete",
+ "error_message": null,
+ "answered_by": "human",
+ "batch_id": "b1234567-89ab-cdef-0123-gen-batch",
+ },
+ //... Additional call objects
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/inbound-number.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/inbound-number.mdx
new file mode 100644
index 00000000000..3e7fde1e44a
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/inbound-number.mdx
@@ -0,0 +1,78 @@
+---
+title: Inbound Number Details
+subtitle: Retrieve settings for your inbound phone number.
+slug: api-v1/get/inbound-number
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The inbound phone number to update.
+
+ Formatting notes:
+ - The `'+'` or `'%2B'` prefix is optional.
+ - Will assume a US country code if no country code is provided.
+
+ Valid Examples for `+13334445555`:
+ - `%2B13334445555`
+ - `13334445555`
+ - `3334445555`
+
+
+
+### Response
+
+
+ The timestamp when the inbound number was configured.
+
+
+
+ The specific inbound phone number.
+
+
+
+ The prompt your agent is using.
+
+
+
+ The webhook URL, if any, where transcripts are sent after each call to the number completes.
+
+
+
+ The `voice` your agent is using - will be a `reduce_latency` voice. For more information, see [List
+ Voices](/api-v1/get/voices).
+
+
+
+ The `pathway_id` your agent is using.
+
+
+
+
+ Any dynamic data associated with the inbound number, if applicable.
+
+
+
+ The maximum duration of a call to the inbound number, in minutes.
+
+
+
+```json Response
+{
+ "created_at": "2023-11-27T17:21:38.33359+00:00",
+ "phone_number": "+18584139939",
+ "prompt": "You're Blandie, the helpful AI assistant. The person calling you has inquired...",
+ "webhook": "https://webhook.site/0a0a0a0a-0a0a-0a0a-0a0a-0a0a0a0a0a0",
+ "voice_id": 2,
+ "dynamic_data": null,
+ "max_duration": 30
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/inbound.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/inbound.mdx
new file mode 100644
index 00000000000..eb9928a8cda
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/inbound.mdx
@@ -0,0 +1,74 @@
+---
+title: List Inbound Numbers
+subtitle: >-
+ Retrieves a list of all inbound phone numbers configured for your account,
+ along with their associated settings.
+slug: api-v1/get/inbound
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ Use your own Twilio account and only return inbound numbers associated with that account sid (optional).
+{" "}
+
+### Response
+
+
+ An array of objects, each representing an inbound phone number and its configuration.
+
+
+
+```json Response
+{
+ "inbound_numbers": [
+ {
+ "created_at": "2023-11-27T17:21:38.33359+00:00",
+ "phone_number": "+18005551234",
+ "prompt": "When you receive a call, recite a random poem from 'Sunset Boulevard' and then ask, 'How may I assist you in your poetic journey today?'",
+ "webhook": "https://api.example.com/poetry-line",
+ "voice_id": 2,
+ "dynamic_data": [/* Use [Dynamic Data](/api-reference/endpoint/dynamic_validate) to make API requests mid-call */],
+ "interruption_threshold": null,
+ "first_sentence": null,
+ "reduce_latency": true,
+ "transfer_phone_number": null,
+ "voice_settings": null,
+ "record": false,
+ "max_duration": 30
+ },
+ {
+ "created_at": "2023-11-25T21:42:22.325993+00:00",
+ "phone_number": "+18005559876",
+ "prompt": "Answer with 'You've reached the Secret Society of Enigmatic Enthusiasts. Please state the password or leave a message after the beep.'",
+ "webhook": "https://mysteryclub.example.com/inbound-call-hook",
+ "voice_id": 1,
+ "dynamic_data": null,
+ "interruption_threshold": null,
+ "first_sentence": null,
+ "reduce_latency": true,
+ "transfer_phone_number": null,
+ "voice_settings": null,
+ "record": false,
+ "max_duration": 30
+ },
+ //...
+ ]
+}
+
+```
+
+
+
+
+
+
+
+
+
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/me.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/me.mdx
new file mode 100644
index 00000000000..29b84a897ff
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/me.mdx
@@ -0,0 +1,40 @@
+---
+title: Account Details
+subtitle: Returns call data for your account.
+slug: api-v1/get/me
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ An object containing your billing data. Contains `current_balance` (number of credits), and `refill_to` if you have
+ auto refill enabled.
+
+
+
+ The status of your account.
+
+
+
+ The total number of calls you've made.
+
+
+
+```json Response
+{
+ "status": "active",
+ "billing": {
+ "current_balance": 99919.1210000034,
+ "refill_to": null
+ },
+ "total_calls": 9903
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/outbound.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/outbound.mdx
new file mode 100644
index 00000000000..c50faeb9d01
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/outbound.mdx
@@ -0,0 +1,37 @@
+---
+title: List Outbound Numbers
+subtitle: >-
+ Retrieves a list of all outbound phone numbers configured for your account,
+ along with their associated settings.
+slug: api-v1/get/outbound
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ An array of outbound phone number objects.
+
+
+
+
+```json Response
+{
+ "outbound_numbers": [
+ {
+ "created_at": "2023-11-27T17:21:38.33359+00:00",
+ "phone_number": "+18005551234",
+ "last_initiated": "2023-12-08T21:47:49.808+00:00"
+ }
+ //...
+ ]
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/subaccounts-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/subaccounts-id.mdx
new file mode 100644
index 00000000000..3b75474647c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/subaccounts-id.mdx
@@ -0,0 +1,47 @@
+---
+title: List Subaccount Details
+subtitle: View a subaccount's details.
+slug: api-v1/get/subaccounts-id
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the subaccount.
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ The affected subaccount's unique identifier.
+
+
+
+ The new API key for the subaccount.
+
+
+
+```json
+{
+ "status": "success",
+ "subaccount": {
+ "subaccount_id": "1234567890",
+ "first_name": "John",
+ "last_name": "Doe",
+ "balance": 150,
+ "api_key": "sub-sk-1234567890"
+ }
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/subaccounts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/subaccounts.mdx
new file mode 100644
index 00000000000..133586caf52
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/subaccounts.mdx
@@ -0,0 +1,46 @@
+---
+title: List Subaccounts
+subtitle: View all your subaccounts and their details.
+slug: api-v1/get/subaccounts
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ An array of your subaccounts.
+
+
+
+```json
+{
+ "status": "success",
+ "subaccounts": [
+ {
+ "subaccount_id": "1234567890",
+ "first_name": "John",
+ "last_name": "Doe",
+ "balance": 150,
+ "api_key": "sub-sk-1234567890"
+ },
+ {
+ "subaccount_id": "0987654321",
+ "first_name": "Jane",
+ "last_name": "Doe",
+ "balance": 200,
+ "api_key": "sub-sk-0987654321"
+ }
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/tools-tool-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/tools-tool-id.mdx
new file mode 100644
index 00000000000..1c52c180aa3
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/tools-tool-id.mdx
@@ -0,0 +1,70 @@
+---
+title: Custom Tool Details
+subtitle: Retrieve a Custom Tool you've created.
+slug: api-v1/get/tools-tool-id
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The ID of the tool you want to retrieve (starting with `TL-`).
+
+
+### Response
+
+
+ Whether the requet succeeded or failed.
+
+
+
+ The tool you've created.
+
+
+
+```json Response
+{
+ "status": "success",
+ "tool": {
+ "tool_id": "TL-5da8347d-0ab7-415d-b156-a7fc5c6074dc",
+ "label": null,
+ "tool": {
+ "name": "BookAppointment",
+ "description": "Books the appointment. Can only be used once.",
+ "speech": "Please wait while I book that appointment for you",
+ "method": "POST",
+ "timeout": 99999999,
+ "url": "https://...",
+ "body": {
+ "slot": "{{input}}"
+ },
+ "input_schema": {
+ "type": "object",
+ "example": {
+ "date": "2024-03-16",
+ "time": "5:00 PM"
+ },
+ "required": [
+ "date",
+ "time"
+ ],
+ "properties": {
+ "date": "YYYY-MM-DD",
+ "time": "HH:MM (AM|PM)"
+ }
+ },
+ "response": {
+ "confirmation_message": "$.message"
+ }
+ },
+ "public": false
+ }
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/tools.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/tools.mdx
new file mode 100644
index 00000000000..8f9fd57df11
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/tools.mdx
@@ -0,0 +1,67 @@
+---
+title: List Custom Tools
+subtitle: Retrieve Custom Tools you've created.
+slug: api-v1/get/tools
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Whether the requet succeeded or failed.
+
+
+
+ An array of your available tools.
+
+
+
+```json Response
+{
+ "status": "success",
+ "tools": [
+ {
+ "tool_id": "TL-5da8347d-0ab7-415d-b156-a7fc5c6074dc",
+ "label": null,
+ "tool": {
+ "name": "BookAppointment",
+ "description": "Books the appointment. Can only be used once.",
+ "speech": "Please wait while I book that appointment for you",
+ "method": "POST",
+ "timeout": 99999999,
+ "url": "https://...",
+ "body": {
+ "slot": "{{input}}"
+ },
+ "input_schema": {
+ "type": "object",
+ "example": {
+ "date": "2024-03-16",
+ "time": "5:00 PM"
+ },
+ "required": [
+ "date",
+ "time"
+ ],
+ "properties": {
+ "date": "YYYY-MM-DD",
+ "time": "HH:MM (AM|PM)"
+ }
+ },
+ "response": {
+ "confirmation_message": "$.message"
+ }
+ },
+ "public": false
+ },
+ ...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/voices-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/voices-id.mdx
new file mode 100644
index 00000000000..1327268281c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/voices-id.mdx
@@ -0,0 +1,61 @@
+---
+title: Voice Details
+subtitle: Retrieve detailed information about a specific voice.
+slug: api-v1/get/voices-id
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the voice preset.
+
+Place either the voice's `name` or `id` here.
+
+For example, `GET https://api.bland.ai/v1/voices/david` or `GET https://api.bland.ai/v1/voices/ff2c405b-3dba-41e0-9261-bc8ee3f91f46`.
+
+
+
+### Response
+
+
+ Contains detailed information about the specified voice.
+
+ - `id` - The unique id for that voice.
+ - `name` - Public voice name, and can also be used as a unique identifier.
+ - `description` - The description of the voice.
+ - `public` - Whether or not the voice is publicly available.
+ - `tags` - A list of tags associated with the voice for the language, voice details, and will have `"Bland Curated"` for preferred voices.
+
+ - `average_rating` - The average star ratings for the voice (out of 5 stars).
+ - `total_ratings` - The number of ratings for the voice.
+
+ Note: Ratings are under development and may show incomplete or inaccurate data.
+
+
+
+
+```json
+{
+ "voice": {
+ "id": "2f9fdbc7-4bf2-4792-8a18-21ce3c93978f",
+ "name": "maya",
+ "description": "Young American Female",
+ "public": true,
+ "tags": [
+ "english",
+ "soft",
+ "Bland Curated"
+ ],
+ "total_ratings": 1234,
+ "average_rating": 4
+ }
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/voices.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/voices.mdx
new file mode 100644
index 00000000000..6c815dcfb9f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/get/voices.mdx
@@ -0,0 +1,100 @@
+---
+title: List Voices
+subtitle: Retrieves all available voices for your account.
+slug: api-v1/get/voices
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Response
+
+
+ Contains a list of the voices available for your account.
+
+
+ The unique identifier for the voice.
+
+
+
+ The name of the voice. This value can also be used in the `voice` parameter when sending calls.
+
+
+
+ A brief description of the voice.
+
+
+
+ Indicates whether the voice is publicly available or specific to your account.
+
+
+
+ A list of tags that describe the voice. We recommend "Bland Curated" voices for the best quality over the phone.
+
+
+
+ The number of ratings the voice has received.
+
+
+
+ The average rating of the voice, out of 5.
+
+
+ Note: Ratings are under development at this time and may display incomplete/inaccurate data.
+
+
+
+
+```json
+{
+ "voices": [
+ {
+ "id": "2f9fdbc7-4bf2-4792-8a18-21ce3c93978f",
+ "name": "maya",
+ "description": "Young American Female",
+ "public": true,
+ "tags": [
+ "english",
+ "soft",
+ "Bland Curated"
+ ]
+ },
+ {
+ "id": "37b3f1c8-a01e-4d70-b251-294733f08371",
+ "name": "ryan",
+ "description": "Professional American Male",
+ "public": true,
+ "tags": [
+ "english",
+ "Bland Curated"
+ ]
+ },
+ {
+ "id": "90295ec4-f0fe-4783-ab33-8b997ddc3ae4",
+ "name": "mason",
+ "description": "American Male",
+ "public": true,
+ "tags": [
+ "english",
+ "Bland Curated"
+ ]
+ },
+ {
+ "id": "bbeabae6-ec8d-444f-92ad-c8e620d3de8d",
+ "name": "tina",
+ "description": "Gentle American Female",
+ "public": true,
+ "tags": [
+ "english",
+ "gentle"
+ ]
+ },
+ //...
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/accounts-delete.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/accounts-delete.mdx
new file mode 100644
index 00000000000..02a1985863a
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/accounts-delete.mdx
@@ -0,0 +1,42 @@
+---
+title: Delete Encrypted Key
+subtitle: >-
+ Disable an encrypted key for a Twilio account integration. See [Enterprise
+ Twilio Integration](/enterprise-features/custom-twilio) for more information.
+slug: api-v1/post/accounts-delete
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ The `encrypted_key` to delete.
+
+
+### Response
+
+
+ The status of the request.
+
+ - `success` - The encrypted key was successfully deleted.
+ - `error` - There was an error deleting the encrypted key.
+
+
+
+
+ Special messages: - `Error deleting Twilio credentials` - The encrypted key could not be deleted or already has been
+ deleted. - `Missing encrypted key` - The `encrypted_key` parameter is missing. - none - The encrypted key was
+ successfully deleted.
+
+
+
+```json
+{
+ "status": "success"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/accounts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/accounts.mdx
new file mode 100644
index 00000000000..4c410d20abc
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/accounts.mdx
@@ -0,0 +1,39 @@
+---
+title: Create Encrypted Key
+subtitle: >-
+ Integrate your own Twilio account with Bland. See [Enterprise Twilio
+ Integration](/enterprise-features/custom-twilio) for more information.
+slug: api-v1/post/accounts
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ Your Twilio account SID.
+
+
+
+ Your Twilio auth token.
+
+
+### Response
+
+
+ Your `encrypted_key` to store and use in future requests.
+
+
+
+```json
+{
+ "status": "success",
+ "encrypted_key": "YOUR_ENCRYPTED_KEY"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents-id-authorize.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents-id-authorize.mdx
new file mode 100644
index 00000000000..b010a174744
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents-id-authorize.mdx
@@ -0,0 +1,62 @@
+---
+title: Authorize a Web Agent Call
+subtitle: Create a single-use session token for a client to talk with your web agent.
+slug: api-v1/post/agents-id-authorize
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+Example web call usage (client side):
+
+```javascript
+import { BlandWebClient } from "bland-client-js-sdk";
+
+const agentId = "YOUR-AGENT-ID";
+const sessionToken = "YOUR-SESSION-TOKEN";
+
+document.addEventListener("DOMContentLoaded", async () => {
+ document.getElementById("btn").addEventListener("click", async () => {
+ const blandClient = new BlandWebClient(agentId, sessionToken);
+ await blandClient.initConversation({
+ sampleRate: 44100,
+ });
+ });
+});
+```
+
+
+
+### Path
+
+
+ The web agent to authorize a call for.
+
+Special note: While in Beta, this request must be made to the `web.bland.ai` domain.
+
+
+
+### Response
+
+
+ The single-use session token that can be sent to the client.
+
+
+
+ Can be `success` or `error`.
+
+
+
+ A message saying whether the token creation succeeded, or a helpful message describing why it failed.
+
+
+
+```json
+{
+ "token": "22480c52-0ff1-4214-bcb7-50649b508432"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents-id-delete.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents-id-delete.mdx
new file mode 100644
index 00000000000..cacef4cdee8
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents-id-delete.mdx
@@ -0,0 +1,37 @@
+---
+title: Delete Web Agent
+subtitle: Delete a web agent.
+slug: api-v1/post/agents-id-delete
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path
+
+
+ The web agent to delete.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A message saying whether the deletion succeeded, or a helpful message describing why it failed.
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully deleted agent 2c565dc7-f41f-43db-a99f-e4c8ba9d7d18"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents-id.mdx
new file mode 100644
index 00000000000..f9ef710ffbe
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents-id.mdx
@@ -0,0 +1,211 @@
+---
+title: Update Web Agent Settings
+subtitle: Update your web agent's settings, prompt and other details.
+slug: api-v1/post/agents-id
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The web agent you'll be updating.
+
+
+### Body
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+
+ Set your agent's voice - all available voices can be found with the [List Voices](/api-v1/get/voices) endpoint.
+
+
+
+ Define a JSON schema for how you want to get information about the call - information like email addresses, names, appointment times or any other type of custom data.
+
+In the webhook response or whenever you retrieve call data later, you'll get the data you defined back under `analysis`.
+
+For example, if you wanted to retrieve this information from the call:
+
+```json
+"analysis_schema": {
+ "email_address": "email",
+ "first_name": "string",
+ "last_name": "string",
+ "wants_to_book_appointment": "boolean",
+ "appointment_time": "YYYY-MM-DD HH:MM:SS"
+}
+```
+
+You would get it filled out like this in your webhook once the call completes:
+
+```json
+"analysis": {
+ "email_address": "johndoe@gmail.com",
+ "first_name": "John",
+ "last_name": "Doe",
+ "wants_to_book_appointment": true,
+ "appointment_time": "2024-01-01 12:00:00"
+}
+```
+
+
+
+
+ Add any additional information you want to associate with the call. This can be useful for tracking or categorizing
+ calls.
+
+
+
+ Set the pathway that your agent will follow. This will override the `prompt` field, so there is no need to pass the 'prompt' field if you are setting a pathway.
+
+ Warning: Setting a pathway will set the following fields to `null` / their default value - `prompt`, `first_sentence`, `model`, `dynamic_data`, `tools`
+
+ Set to `null` or an empty string to clear the pathway.
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```ENG``` - Spanish: ```ESP``` - French:
+ ```FRE``` - Polish: ```POL``` - German: ```GER``` - Italian: ```ITA``` - Brazilian Portuguese: ```PBR``` - Portuguese:
+ ```POR```
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id
+ and transcript to this URL after the call completes. This can be useful if you
+ want to have real time notifications when calls finish.
+
+Set to `null` or an empty string to clear the webhook.
+
+
+
+
+ Select a model to use for your call.
+
+Options: `base`, `turbo` and `enhanced`.
+
+In nearly all cases, `enhanced` is the best choice for now.
+
+
+
+There are three different ways to use Bland:
+
+- `model: base`
+
+ - The original, follows scripts/procedures most effectively.
+ - Supports all features and capabilities.
+ - Best for Custom Tools
+
+- `model: enhanced`
+
+ - Much faster latency and very conversational, works best with objective-based prompts.
+ - Supports all features and capabilities.
+
+- `model: turbo`
+
+ - The absolute fastest latency possible, can be verbose at times
+ - Limited capabilities currently (excludes Transferring, IVR navigation, Custom Tools)
+ - Extremely realistic conversation capabilities
+
+
+
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+To remove, set to `null` or an empty string.
+
+
+
+
+ Interact with the real world through API calls.
+
+Detailed tutorial here: [Custom Tools](/tutorials/custom-tools)
+
+
+
+
+ Integrate data from external APIs into your agent's knowledge.
+
+Set to `null` or an empty string to clear dynamic data settings.
+
+Detailed usage in the [Send Call](/api-v1/post/calls) endpoint.
+
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `500` milliseconds. You'll encounter higher latency, but you'll be interrupted less frequently.
+
+Set to `null` to reset to default.
+
+
+
+
+ The maximum duration that calls to your agent can last before being automatically terminated.
+
+Set to `null` to reset to default.
+
+
+
+### Response
+
+
+ Whether the update was successful or not - will be `success` or `error`.
+
+
+
+ A message describing the status of the update.
+
+
+
+ An object containing the updated settings for the agent.
+
+
+
+ If the update was unsuccessful, this will contain the settings that failed to update. Useful to determine how your
+ request is being interpreted on our end.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully updated agent 46f37229-7d12-44be-b343-6e68274cfbea.",
+ "updates": {
+ "model": "enhanced"
+ }
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents.mdx
new file mode 100644
index 00000000000..373b73b02da
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/agents.mdx
@@ -0,0 +1,216 @@
+---
+title: Create a Web Agent
+subtitle: Configure all of the settings for a new web agent.
+slug: api-v1/post/agents
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+Example web call usage (client side):
+
+```javascript
+import { BlandWebClient } from "bland-client-js-sdk";
+
+const agentId = "YOUR-AGENT-ID";
+const sessionToken = "YOUR-SESSION-TOKEN";
+
+document.addEventListener("DOMContentLoaded", async () => {
+ document.getElementById("btn").addEventListener("click", async () => {
+ const blandClient = new BlandWebClient(agentId, sessionToken);
+ await blandClient.initConversation({
+ sampleRate: 44100,
+ });
+ });
+});
+```
+
+
+### Body
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+ - Ends call when objective is complete or voicemail is detected
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+
+ Set your agent's voice - all available voices can be found with the [List Voices](/api-v1/get/voices) endpoint.
+
+
+
+ Define a JSON schema for how you want to get information about the call - information like email addresses, names, appointment times or any other type of custom data.
+
+In the webhook response or whenever you retrieve call data later, you'll get the data you defined back under `analysis`.
+
+For example, if you wanted to retrieve this information from the call:
+
+```json
+"analysis_schema": {
+ "email_address": "email",
+ "first_name": "string",
+ "last_name": "string",
+ "wants_to_book_appointment": "boolean",
+ "appointment_time": "YYYY-MM-DD HH:MM:SS"
+}
+```
+
+You would get it filled out like this in your webhook once the call completes:
+
+```json
+"analysis": {
+ "email_address": "johndoe@gmail.com",
+ "first_name": "John",
+ "last_name": "Doe",
+ "wants_to_book_appointment": true,
+ "appointment_time": "2024-01-01 12:00:00"
+}
+```
+
+
+
+
+ Add any additional information you want to associate with the call. This can be useful for tracking or categorizing
+ calls.
+
+
+
+ Set the pathway that your agent will follow. This will override the `prompt` field, so there is no need to pass the 'prompt' field if you are setting a pathway.
+
+ Warning: Setting a pathway will set the following fields to `null` / their default value - `prompt`, `first_sentence`, `model`, `dynamic_data`, `tools`
+
+ Set to `null` or an empty string to clear the pathway.
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```ENG``` - Spanish: ```ESP``` - French:
+ ```FRE``` - Polish: ```POL``` - German: ```GER``` - Italian: ```ITA``` - Brazilian Portuguese: ```PBR``` - Portuguese:
+ ```POR```
+
+
+
+ Select a model to use for your call.
+
+Options: `base`, `turbo` and `enhanced`.
+
+In nearly all cases, `enhanced` is the best choice for now.
+
+
+
+There are three different ways to use Bland:
+
+- `model: base`
+
+ - The original, follows scripts/procedures most effectively.
+ - Supports all features and capabilities.
+ - Best for Custom Tools
+
+- `model: enhanced`
+
+ - Much faster latency and very conversational, works best with objective-based prompts.
+ - Supports all features and capabilities.
+
+- `model: turbo`
+
+ - The absolute fastest latency possible, can be verbose at times
+ - Limited capabilities currently (excludes Transferring, IVR navigation, Custom Tools)
+ - Extremely realistic conversation capabilities
+
+
+
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+To remove, set to `null` or an empty string.
+
+
+
+
+ Interact with the real world through API calls.
+
+Detailed tutorial here: [Custom Tools](/tutorials/custom-tools)
+
+
+
+
+ Integrate data from external APIs into your agent's knowledge.
+
+Set to `null` or an empty string to clear dynamic data settings.
+
+Detailed usage in the [Send Call](/api-v1/post/calls) endpoint.
+
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `500` milliseconds. You'll encounter higher latency, but you'll be interrupted less frequently.
+
+Set to `null` to reset to default.
+
+
+
+
+ The maximum duration that calls to your agent can last before being automatically terminated.
+
+Set to `null` to reset to default.
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+
+```json Response
+{
+ "agent": {
+ "agent_id": "2c565dc7-f41f-43db-a99f-e4c8ba9d7d18",
+ "webhook": null,
+ "dynamic_data": null,
+ "interruption_threshold": null,
+ "first_sentence": null,
+ "model": "enhanced",
+ "voice_settings": null,
+ "voice": "maya",
+ "prompt": "...",
+ "temperature": null,
+ "max_duration": 30,
+ "language": "ENG",
+ "tools": null
+ }
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/batches-id-analyze.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/batches-id-analyze.mdx
new file mode 100644
index 00000000000..8e3960204a9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/batches-id-analyze.mdx
@@ -0,0 +1,94 @@
+---
+title: Analyze Batch with AI
+subtitle: Analyzes a batch of calls based on using questions and goals.
+slug: api-v1/post/batches-id-analyze
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the batch of calls to be analyzed.
+
+
+### Request Body
+
+
+ This is the overall purpose of the batch of calls. Provides context for the analysis to guide how the
+ questions/transcripts are interpreted.
+
+
+
+ An array of questions to be analyzed for each call in the batch.
+
+ Each question should be an array with two elements: the question text and the expected answer type (e.g., "string", "boolean").
+
+Fairly flexible in terms of the expected answer type, and unanswerable questions will default to `null`.
+
+Examples:
+
+```json
+"questions": [
+ ["Who answered the call?", "human or voicemail"],
+ ["Positive feedback about the product: ", "string"],
+ ["Negative feedback about the product: ", "string"],
+ ["Customer confirmed they were satisfied", "boolean"]
+ ]
+```
+
+
+
+### Response
+
+
+ Will be `success` if the request was successful.
+
+
+
+ Confirms the request was successful, or provides an error message if the request failed.
+
+
+
+ Contains the analyzed answers for each call in the batch.
+
+The keys are `call_id`s from the batch, and the array values are the analysis results for each question in the batch.
+
+
+
+
+ Token-based price for the analysis request.
+
+As a rough estimate, the base cost is `0.003` credits with an additional `0.0015` credits per call in the batch.
+
+Longer call transcripts and higher numbers of questions can increase the cost, however the cost scales very effectively with batches vs. individual calls.
+
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully analyzed batch",
+ "answers": {
+ "123e4567-e89b-12d3-a456-426614174000": [
+ "human",
+ "Customer found the product sturdy and reliable",
+ "A bit heavy",
+ true
+ ],
+ "123e4567-e89b-12d3-a456-426614174001": [
+ "voicemail",
+ null,
+ null,
+ false
+ ]
+ }
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/batches-id-stop.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/batches-id-stop.mdx
new file mode 100644
index 00000000000..6e6a9105448
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/batches-id-stop.mdx
@@ -0,0 +1,50 @@
+---
+title: Stop Active Batch
+subtitle: Stops all active calls in a batch.
+slug: api-v1/post/batches-id-stop
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the batch to be cancelled.
+
+
+### Response
+
+
+ The status of the request. If anything other than 'success', an error has occurred or all calls have already been
+ completed.
+
+
+
+ A message describing the status of the request.
+
+
+
+ The number of calls that were cancelled.
+
+
+
+ The `batch_id` of the cancelled batch.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully stopped batch",
+ "num_calls": 1205,
+ "batch_id": "5e5b1a3a-2b0a-4b9e-8b9e-asdf-gen-batch"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/batches.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/batches.mdx
new file mode 100644
index 00000000000..739eeecef9c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/batches.mdx
@@ -0,0 +1,92 @@
+---
+title: Send a Batch of Calls
+subtitle: Send large volumes of calls at once with a single API request.
+slug: api-v1/post/batches
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ This is the prompt or task used for all the phone calls in the request. Information can be inserted into it surrounding variable names with \{\{curly braces\}\}.
+
+Example:
+
+```json
+"You are calling {{business}} to renew their subscription to {{service}} before it expires on {{date}}."
+```
+
+
+
+
+ Define a list of calls to make and their properties. Each call in call_data MUST have a "phone_number" property. Properties are case-sensitive.
+
+Example:
+
+```json
+[
+ {
+ "phone_number": "1234567890",
+ "business": "ABC Corp",
+ "service": "Netflix",
+ "date": "September 4th"
+ },
+ {
+ "phone_number": "32176540987",
+ "business": "XYZ inc.",
+ "service": "Window Cleaning",
+ "date": "December 20th"
+ }
+]
+```
+
+
+
+
+ Adds a user-friendly label to your batch to keep track of it's original intention. This can help differentiate
+ multiple call batches that are part of the same Campaign. Shown when a batch is retreived.
+
+
+
+ Use ```campaign_id``` to organize related batches together. This can be set manually or auto-generated through
+ Campaigns.
+
+
+
+ When this is set to ```true```, only the first call of ```call_data``` will be dispatched. A common use case is to set the first ```phone_number``` value to your own to confirm everything's set up properly.
+
+Includes additional information in the response when true so that it's easier to find any issues.
+
+
+
+
+ All other parameters supported by the [Send Call](/api-v1/post/calls) endpoint are supported here as well. They will
+ be applied to each call in the batch.
+
+
+### Response
+
+
+ If anything other than "success" is returned, there was an error.
+
+
+
+ The unique identifier for the batch.
+
+
+
+
+```json Response
+{
+ "message": "success",
+ "batch_id": "3p$7rQ3p9sT5bzmF-gen-batch"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-id-analyze.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-id-analyze.mdx
new file mode 100644
index 00000000000..4ec5196a784
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-id-analyze.mdx
@@ -0,0 +1,83 @@
+---
+title: Analyze Call with AI
+subtitle: Analyzes a call of calls based using questions and goals.
+slug: api-v1/post/calls-id-analyze
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the call to be analyzed.
+
+
+### Request Body
+
+
+ This is the overall purpose of the call. Provides context for the analysis to guide how the questions/transcripts are
+ interpreted.
+
+
+
+ An array of questions to be analyzed for the call.
+
+ Each question should be an array with two elements: the question text and the expected answer type (e.g., "string", "boolean").
+
+Fairly flexible in terms of the expected answer type, and unanswerable questions will default to `null`.
+
+Examples:
+
+```json
+"questions": [
+ ["Who answered the call?", "human or voicemail"],
+ ["Positive feedback about the product: ", "string"],
+ ["Negative feedback about the product: ", "string"],
+ ["Customer confirmed they were satisfied", "boolean"]
+ ]
+```
+
+
+
+### Response
+
+
+ Will be `success` if the request was successful.
+
+
+
+ Confirms the request was successful, or provides an error message if the request failed.
+
+
+
+ Contains the analyzed answers for the call in an array.
+
+
+
+ Token-based price for the analysis request.
+
+As a rough estimate, the base cost is `0.003` credits with an additional `0.0015` credits per call in the call.
+
+Longer call transcripts and higher numbers of questions can increase the cost, however the cost scales very effectively with calls vs. individual calls.
+
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully analyzed call",
+ "answers": [
+ "human",
+ "Customer found the product sturdy and reliable",
+ "A bit heavy",
+ true
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-id-stop.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-id-stop.mdx
new file mode 100644
index 00000000000..ab21194bc9f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-id-stop.mdx
@@ -0,0 +1,38 @@
+---
+title: Stop Active Call
+subtitle: End an active phone call by call_id.
+slug: api-v1/post/calls-id-stop
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier for the call you want to end.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ If the status is `success`, the message will say "Call ended successfully." Otherwise, if the status is `error`, the
+ message will say "SID not found for the given c_id." or "Internal server error."
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Call ended successfully."
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-simple-pathway.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-simple-pathway.mdx
new file mode 100644
index 00000000000..0776b814393
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-simple-pathway.mdx
@@ -0,0 +1,79 @@
+---
+title: Send Call using Pathways (Simple)
+subtitle: >-
+ Send an AI phone call with your own conversational pathway agent! Links -
+ [Video
+ Tutorial](https://www.loom.com/share/5ce5a84ec97149efad7cf5eff66a93c5?sid=697dc436-53cf-494c-a3e9-a25031df6496)
+ | [Step-by-step web tutorial](https://docs.bland.ai/tutorials/pathways)
+slug: api-v1/post/calls-simple-pathway
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to call. Country code defaults to `+1` (US) if not specified.
+
+ Formatting is flexible, however for the most predictable results use the [E.164](https://www.twilio.com/docs/glossary/what-e164#examples-of-e164-numbers) format.
+
+
+ Expected/Ideal Format:
+ - "+12223334444"
+ - "+91223334444"
+ - "+61223334444"
+
+ Valid, but not recommended:
+ - "2223334444"
+ - "+1 (222) 333-4444"
+ - "+1 222 333 4444"
+ - "222-333-4444"
+
+ Invalid:
+ - "12223334444"
+ - "552223334444"
+ - "non-numeric characters"
+ - "2223334444 ext. 123"
+
+
+
+
+
+ Follows the conversational pathway you created to guide the conversation.
+
+You can access your pathway_id by clicking on the 'Copy ID' button on your pathways [here](https://app.bland.ai/home?page=convo-pathways). If you don't have any pathways, click the 'Create Pathway' button to create one!
+
+
+
+ [Video tutorial](https://www.loom.com/share/5ce5a84ec97149efad7cf5eff66a93c5?sid=697dc436-53cf-494c-a3e9-a25031df6496)
+
+ [Step by step Web Tutorial](https://docs.bland.ai/tutorials/pathways)
+
+
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-simple.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-simple.mdx
new file mode 100644
index 00000000000..9d4ae9888d2
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls-simple.mdx
@@ -0,0 +1,83 @@
+---
+title: Send Call (Simple)
+subtitle: Send an AI phone call with a custom objective and actions.
+slug: api-v1/post/calls-simple
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to call. Country code defaults to `+1` (US) if not specified.
+
+ Formatting is flexible, however for the most predictable results use the [E.164](https://www.twilio.com/docs/glossary/what-e164#examples-of-e164-numbers) format.
+
+
+ Expected/Ideal Format:
+ - "+12223334444"
+ - "+91223334444"
+ - "+61223334444"
+
+ Valid, but not recommended:
+ - "2223334444"
+ - "+1 (222) 333-4444"
+ - "+1 222 333 4444"
+ - "222-333-4444"
+
+ Invalid:
+ - "12223334444"
+ - "552223334444"
+ - "non-numeric characters"
+ - "2223334444 ext. 123"
+
+
+
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+ - Ends call when objective is complete or voicemail is detected
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls.mdx
new file mode 100644
index 00000000000..4d935f69bd0
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/calls.mdx
@@ -0,0 +1,550 @@
+---
+title: Send Call
+subtitle: Send an AI phone call with a custom objective and actions.
+slug: api-v1/post/calls
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ A special key for using a BYOT (Bring Your Own Twilio) account. Not required in most cases.
+
+
+### Body
+
+
+ The phone number to call. Country code defaults to `+1` (US) if not specified.
+
+ Formatting is flexible, however for the most predictable results use the [E.164](https://www.twilio.com/docs/glossary/what-e164#examples-of-e164-numbers) format.
+
+
+ Expected/Ideal Format:
+ - "+12223334444"
+ - "+91223334444"
+ - "+61223334444"
+
+ Valid, but not recommended:
+ - "2223334444"
+ - "+1 (222) 333-4444"
+ - "+1 222 333 4444"
+ - "222-333-4444"
+
+ Invalid:
+ - "12223334444"
+ - "552223334444"
+ - "non-numeric characters"
+ - "2223334444 ext. 123"
+
+
+
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+ - Ends call when objective is complete or voicemail is detected
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+
+ The voice of the AI agent to use. Accepts any form of voice ID, including custom voice clones and voice presets.
+
+Default voices can be referenced directly by their name instead of an id.
+
+Usage example: `voice: "maya"`
+
+Bland Curated voices:
+
+- `maya`
+- `mason`
+- `ryan`
+- `adriana`
+- `tina`
+- `matt`
+- `evelyn`
+
+Use the [GET /v1/voices](https://api.bland.ai/voices) endpoint to see a full list of your available voices.
+
+
+
+ Note: Including `voice_id` or `reduce_latency` in your request is still supported, but not recommended.
+
+ The previous structure to select voices used both `voice_id` and `reduce_latency`. To simplify the process, we've combined these into a single `voice` parameter.
+
+ - If the first two letters of `voice` are `RL`, that is equivalent to settings `reduce_latency` to `true`.
+ - Prefixing the voice ID with `HQ` will use the high fidelity version of the voice.
+ - The integer following the prefix is the `voice_id` from before.
+
+ Example:
+ - `reduce_latency: true, voice_id: 0` is equivalent to `voice: "RL0"`
+ - `reduce_latency: false, voice_id: 3` is equivalent to `voice: "HQ3"`
+
+ Including `reduce_latency` may override the `voice` parameter, so exclude it when using `voice`.
+
+
+
+
+ All presets have been migrated to the `voice` parameter and can use either the preset name or ID.
+
+ If you used to have a `voice_preset_id` of `"2f9fdbc7-4bf2-4792-8a18-21ce3c93978f"`, you can now use `voice: "2f9fdbc7-4bf2-4792-8a18-21ce3c93978f"`.
+
+
+
+
+
+ Define a JSON schema for how you want to get information about the call - information like email addresses, names, appointment times or any other type of custom data.
+
+In the webhook response or whenever you retrieve call data later, you'll get the data you defined back under `analysis`.
+
+For example, if you wanted to retrieve this information from the call:
+
+```json
+"analysis_schema": {
+ "email_address": "email",
+ "first_name": "string",
+ "last_name": "string",
+ "wants_to_book_appointment": "boolean",
+ "appointment_time": "YYYY-MM-DD HH:MM:SS"
+}
+```
+
+You would get it filled out like this in your webhook once the call completes:
+
+```json
+"analysis": {
+ "email_address": "johndoe@gmail.com",
+ "first_name": "John",
+ "last_name": "Doe",
+ "wants_to_book_appointment": true,
+ "appointment_time": "2024-01-01 12:00:00"
+}
+```
+
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without
+ `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+
+
+ Should the AI speak first or wait for someone else to talk?
+
+ Creates more realistic conversations when answered with "Hello?", "This is \{name\} speaking." and so on.
+
+ - When ```false```: The AI starts speaking shortly after the call is answered.
+
+ - When ```true```: The AI will wait for the answerer to speak.
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `200` milliseconds. You'll encounter higher latency, but you'll be interrupted much less frequently.
+
+
+
+
+ This is the pathway ID for the pathway you have created on our dev portal. You
+ can access the ID of your pathways by clicking the 'Copy ID' button of your
+ pathway [here](https://app.bland.ai/home?page=convo-pathways)
+
+Note: Certain parameters do not apply when using pathways.
+
+{" "}
+
+
+ - `task` - The pathway substitutes as the agent's instructions. - `model` - We use our own fine-tuned models under the
+ hood. - `tools` - Replaced by 'Webhook' Node in Pathways - `transfer_list` - Replaced by 'Transfer Call' Node in
+ Pathways - `transfer_phone_number` - Replaced by 'Transfer Call' Node in Pathways
+
+
+Example Simple Request body:
+
+```json
+"phone_number": "+1975934749",
+"pathway_id": "a0f0d4ed-f5f5-4f16-b3f9-22166594d7a7"
+```
+
+
+
+
+ Select a model to use for your call.
+
+Options: `gpt4`, `base`, `turbo` and `enhanced`.
+
+In nearly all cases, `enhanced` is the best choice for now.
+
+
+
+There are four different ways to use Bland:
+
+- `model: gpt4`
+
+ - Slow but accurate
+ - Supports all features and capabilities.
+ - Best for complex tasks where latency isn't a priority
+
+- `model: base`
+
+ - The original, follows scripts/procedures most effectively.
+ - Supports all features and capabilities.
+ - Best for Custom Tools
+
+- `model: enhanced`
+
+ - Much faster latency and very conversational, works best with objective-based prompts.
+ - Supports all features and capabilities.
+
+- `model: turbo`
+
+ - The absolute fastest latency possible, can be verbose at times
+ - Limited capabilities currently (excludes Transferring, IVR navigation, Custom Tools)
+ - Extremely realistic conversation capabilities
+
+
+
+
+
+
+ Interact with the real world through API calls.
+
+Detailed tutorial here: [Custom Tools](/tutorials/custom-tools)
+
+
+
+
+ Add any additional information you want to associate with the call. This can be useful for tracking or categorizing calls.
+
+Anything that you put here will be returned in your webhook or in the call details under `metadata`.
+
+Example:
+
+```json
+"metadata": {
+ "campaign_id": "1234",
+ "source": "web"
+}
+```
+
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id and transcript to this URL after the call
+ completes. This can be useful if you want to have real time notifications when calls finish.
+
+
+
+ To record your phone call, set `record` to true. When your call completes, you can access through the `recording_url`
+ field in the call details or your webhook.
+
+
+
+ A phone number that the agent can transfer to under specific conditions - such as being asked to speak to a human or supervisor.
+
+
+ For best results:
+ - Specify conditions that the agent should transfer to a human under (examples are great!)
+ - In the `task`, refer to the action solely as "transfer" or "transferring".
+ - Alternate phrasing such as "swap" or "switch" can mislead the agent, causing the action to be ignored.
+
+
+
+
+
+ Give your agent the ability to transfer calls to a set of phone numbers.
+
+Overrides `transfer_phone_number` if a `transfer_list.default` is specified.
+
+Will default to `transfer_list.default`, or the chosen phone number.
+
+Example usage to route calls to different departments:
+
+```json
+"transfer_list": {
+ "default": "+12223334444",
+ "sales": "+12223334444",
+ "support": "+12223334444",
+ "billing": "+12223334444"
+}
+```
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```ENG``` - Spanish: ```ESP``` - French:
+ ```FRE``` - Polish: ```POL``` - German: ```GER``` - Italian: ```ITA``` - Brazilian Portuguese: ```PBR``` - Portuguese:
+ ```POR```
+
+
+
+ Set the longest you want the call to possibly go in minutes. After the max_duration minutes have passed, the call will
+ automatically end. Example Values: ```20, 2```
+
+
+
+ Enables machine detection when the call starts to determine whether the call was answered by a person or a voicemail.
+
+Best Practices (when enabled):
+
+- Since the determination is made at the beginning of the call, use `wait_for_greeting` to try and coax a human response.
+- If combined with `first_sentence`, try wording it so the person answering says something back - ex. `"Hello?"` or `"Is this \{\{name\}\}?"`.
+
+Price: `$0.02` per call, however there is no charge for unanswered calls or calls that failed to send.
+
+
+
+
+ Specify a purchased Outbound Number to call from. Country code is required, spaces or parentheses must be excluded.
+
+By default, calls are initiated from a separate pool of numbers owned by Bland.
+
+
+
+
+ The pronunciation guide is an `array` of `objects` that guides the LLM on how to say specific words. This is great for situations with complicated terms or names.
+
+````json
+ [
+ {
+ "word": "example",
+ "pronunciation": "ex-am-ple",
+ "case_sensitive": "false",
+ "spaced": "false"
+ },
+ {
+ "word": "API",
+ "pronunciation": "A P I",
+ "case_sensitive": "true",
+ "spaced": "true"
+ }
+ ]
+ ```
+
+
+
+ - `word`
+ — the word you want to guide the LLM on how to pronounce
+ - `pronunciation`
+ — the word you want to guide the LLM on how to pronounce.
+ - `case_sensitive`
+ — whether or not to consider case. Particularly useful with names. EG: 'Max' the name versus 'max' the word. Defaults to false. `Not required`.
+ - `spaced`
+ — whether or not to consider spaces. When `true` the word 'high' would be flagged but NOT 'hightop'. Defaults to true. `Not required`.
+
+
+
+
+
+ A value between 0 and 1 that controls the randomness of the LLM. 0 will cause more deterministic outputs while 1 will cause more random.
+
+ Example Values: ```"0.9", "0.3", "0.5"```
+
+
+
+ The time you want the call to start. If you don't specify a time (or the time is in the past), the call will send immediately.
+
+ Set your time in the format `YYYY-MM-DD HH:MM:SS -HH:MM` (ex. `2021-01-01 12:00:00 -05:00`).
+
+ The timezone is optional, and defaults to UTC if not specified.
+
+ Note: Scheduled calls can be cancelled with the [POST /v1/calls/:call_id/stop](/api-v1/post/calls-id-stop) endpoint.
+
+
+
+ When the AI encounters a voicemail, it will leave this message after the beep and then immediately end the call.
+
+ Warning: If `amd` is set to `true` or `voicemail_action` is set to `ignore`, then this will still work for voicemails, but it will not hang up for IVR systems.
+
+
+
+ This is processed separately from the AI's decision making, and overrides it.
+
+ Options:
+ - ```hangup```
+ - ```leave_message ```
+ - ```ignore```
+
+ Examples:
+ - Call is answered by a voicemail (specifically with a beep or tone):
+ - If `voicemail_message` is set, that message will be left and then the call will end.
+ - Otherwise, the call immediately ends (regardless of `amd`)
+
+ - Call is answered by an IVR system or phone tree:
+ - If `amd` is set to `true`, the AI will navigate the system and continue as normal.
+ - If `voicemail_action` is set to `ignore`, the AI will ignore the IVR and continue as normal.
+ - Otherwise, if `voicemail_message` is set then it'll leave that message and end the call.
+ - Finally, if none of those conditions are met, the call will end immediately.
+
+ Note: If `voicemail_message` is set, then the AI will leave the message regardless of the `voicemail_action`.
+
+
+
+ AMD mode helps your AI navigate phone trees and IVR systems. If you know your call will hit an automated system you should switch it on.
+
+ Behavioral changes:
+ - Much higher `interruption_threshold` so that the options are listened to in full.
+ - Underlying prompt is adjusted so the AI is aware it's navigating a phone tree.
+
+ NOTE: AMD mode causes increased delay for the first response, even if answered by a human. Highly recommended to set to `false` in the majority of cases.
+
+
+
+ When you want your AI to "know" a specific fact - like the caller's
+ name or other relevant context.
+
+ The AI agent will be aware of both the key names as well as their corresponding values.
+
+
+ Example Issue:
+ - The LLM is hallucinating specific facts. You need to provide specific information.
+ Example Solution:
+ - Use `request_data` to specify and label that data.
+
+ ```json
+ "request_data": {
+ "first_name":"John",
+ "date_of_birth":"03/14/05"
+ // additional parameters as needed
+ }
+ ```
+
+
+
+
+ Make dynamic requests to external APIs and use the data in your AI's responses.
+
+
+ Each request object should contain:
+
+ `url`: The URL of the external API to fetch data from.
+
+ `response_data`: An array of objects describing how to parse and use the data fetched from the API. Explained in more detail below.
+
+ The following are optional:
+
+ `method`: Allows `GET` or `POST`. Default: `GET`
+
+ `cache`: Whether to fetch the data once at the beginning of the call, or to re-check continuously for data that might change mid-call. Default: `true`
+
+ `headers`: An object of headers to send with the request.
+
+ `body`: The body of the request.
+
+ The following variables can be injected into the dynamic request body:
+
+ - `{{from}}` (Ex. `+12223334444`)
+ - `{{to}}`
+ - `{{short_from}}` (Ex. `2223334444`)
+ - `{{short_to}}`
+ - `{{call_id}}`
+
+ These string values will be replaced in each `dynamic_data[].body` where they're used by system values in each request.
+
+ Try out with this example:
+```json
+ "dynamic_data": [
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json",
+ "response_data": [
+ {
+ "name": "BTC Price USD",
+ "data": "bpi.USD.rate",
+ "context": "Current BTC Price: ${{BTC Price USD}} USD"
+ },
+ {
+ "name": "BTC Price EUR",
+ "data": "bpi.EUR.rate",
+ "context": "In Euros: {{BTC Price USD}} EUR"
+ }
+ ]
+ }
+ ]
+````
+
+
+ An array of objects describing how to parse and use the data fetched from the API.
+
+ Each object in this array should contain:
+ - `name`: A label for the fetched data.
+ - Example: `"Flight Status"`
+ - `data`: The JSON path in the API response to extract the data from.
+ - Example: `"user.flights[0].status"`
+ - `context`: How this data should be incorporated into the AI's knowledge.
+ - Example: `"John's flight is currently {{Flight Status}}"`
+
+
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A unique identifier for the call (present only if status is `success`).
+
+
+
+ The batch ID of the call (present only if status is `success`).
+
+
+
+ A message explaining the status of the call.
+
+
+
+ For validation errors, a detailed list of each field with an error and it's error message.
+
+Example:
+
+```json
+{
+ "status": "error",
+ "message": "Invalid parameters",
+ "errors": [
+ "Missing required parameter: phone_number.",
+ "Missing required parameter: task.",
+ "Phone number must be a string or number.",
+ "Task must be a string."
+ ]
+}
+```
+
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Call successfully queued.",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1",
+ "batch_id": null
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-insert.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-insert.mdx
new file mode 100644
index 00000000000..e4966bd2323
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-insert.mdx
@@ -0,0 +1,59 @@
+---
+title: Upload Inbound Phone Numbers
+subtitle: >-
+ Add inbound numbers to Bland from your own Twilio account. See [Enterprise
+ Twilio Integration](/enterprise-features/custom-twilio) for more information.
+slug: api-v1/post/inbound-insert
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ The `encrypted_key` of the Twilio account you want to upload numbers from.
+
+
+### Body
+
+
+ An array of phone numbers you want to upload to Bland.
+
+ Include the leading `'+'`, country code and the phone number without any special characters.
+
+ Example: `["+12223334444", "+13334445555"]`
+
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A message saying whether the insertion succeeded, or a helpful message describing why it failed.
+
+
+
+ An array of phone numbers that were successfully inserted.
+
+Any phone numbers that failed to be inserted will not be included in this array - for example if they are already in your account or not associated with the sepcified Twilio account.
+
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully inserted numbers",
+ "inserted": [
+ "+12223334444",
+ "+13334445555"
+ ]
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-number-delete.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-number-delete.mdx
new file mode 100644
index 00000000000..e1ba30fe3ca
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-number-delete.mdx
@@ -0,0 +1,44 @@
+---
+title: Delete Inbound Phone Number
+subtitle: >-
+ Remove an inbound number that was uploaded through your own Twilio account.
+ See [Enterprise Twilio Integration](/enterprise-features/custom-twilio) for
+ more information.
+slug: api-v1/post/inbound-number-delete
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ The `encrypted_key` for the Twilio account that owns the phone number you want to delete.
+
+
+### Path
+
+
+ The phone number you want to remove from Bland's system.
+
+
+### Response
+
+
+ Can be `success` or `error`.
+
+
+
+ A message saying whether the deletion succeeded, or a helpful message describing why it failed.
+
+
+
+```json
+{
+ "status": "success",
+ "message": "Successfully deleted number from database: +15555555555"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-number-update.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-number-update.mdx
new file mode 100644
index 00000000000..88bb0f71102
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-number-update.mdx
@@ -0,0 +1,274 @@
+---
+title: Update Inbound Details
+subtitle: Update your inbound agent's settings, prompt and other details.
+slug: api-v1/post/inbound-number-update
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+
+ The `encrypted_key` for the Twilio account that owns the phone number you want to modify. Not required if you are
+ using a Bland phone number.
+
+
+### Path Parameters
+
+
+ The inbound phone number you wish to update.
+
+ Formatting Notes:
+ - The `'+'` or `'%2B'` prefix is optional.
+ - Will assume a US country code if no country code is provided.
+
+ Valid Examples for `+13334445555`:
+ - `%2B13334445555`
+ - `13334445555`
+ - `3334445555`
+
+
+
+### Body
+
+
+ Provide instructions, relevant information, and examples of the ideal conversation flow.
+
+ For inbound numbers, consider including additional context about the purpose of the call, and what types of callers to expect.
+
+
+ #### Out-of-the-Box Behaviors (Summarized):
+ - Speech pattern: Direct, concise, casual
+ - Spells out symbols, acronyms, abbreviations, percentages, etc. ($4,000,000 -> "four million dollars")
+ - Asks clarifying questions
+
+ #### Prompting Tips:
+ - Want to easily test out exactly how your agent will behave?
+ - [Try out Agent Testing!](https://app.bland.ai/home?page=testing)
+ - Aim for less than >2,000 characters where possible.
+ - Simple, direct prompts are the most predictable and reliable.
+ - Frame instructions positively:
+ - `"Do this"` rather than `"Don't do this"`.
+ - Ex. "Keep the conversation casual" rather than "Don't be too formal".
+ - This gives concrete examples of what to do, instead of leaving expected behavior open to interpretation.
+
+
+
+
+
+ Set your agent's voice - all available voices can be found with the [List Voices](/api-v1/get/voices) endpoint.
+
+
+
+ Define a JSON schema for how you want to get information about the call - information like email addresses, names, appointment times or any other type of custom data.
+
+In the webhook response or whenever you retrieve call data later, you'll get the data you defined back under `analysis`.
+
+For example, if you wanted to retrieve this information from the call:
+
+```json
+"analysis_schema": {
+ "email_address": "email",
+ "first_name": "string",
+ "last_name": "string",
+ "wants_to_book_appointment": "boolean",
+ "appointment_time": "YYYY-MM-DD HH:MM:SS"
+}
+```
+
+You would get it filled out like this in your webhook once the call completes:
+
+```json
+"analysis": {
+ "email_address": "johndoe@gmail.com",
+ "first_name": "John",
+ "last_name": "Doe",
+ "wants_to_book_appointment": true,
+ "appointment_time": "2024-01-01 12:00:00"
+}
+```
+
+
+
+
+ Add any additional information you want to associate with the call. This can be useful for tracking or categorizing
+ calls.
+
+
+
+ Set the pathway that your agent will follow. This will override the `prompt` field, so there is no need to pass the 'prompt' field if you are setting a pathway.
+
+ Warning: Setting a pathway will set the following fields to `null` / their default value - `prompt`, `first_sentence`, `model`, `dynamic_data`, `tools`
+
+ Set to `null` or an empty string to clear the pathway.
+
+
+
+
+ Select a supported language of your choice. Optimizes every part of our API for that language - transcription, speech,
+ and other inner workings. Supported Languages and their codes: - English: ```ENG``` - Spanish: ```ESP``` - French:
+ ```FRE``` - Polish: ```POL``` - German: ```GER``` - Italian: ```ITA``` - Brazilian Portuguese: ```PBR``` - Portuguese:
+ ```POR```
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id
+ and transcript to this URL after the call completes. This can be useful if you
+ want to have real time notifications when calls finish.
+
+Set to `null` or an empty string to clear the webhook.
+
+
+
+
+ Give your agent the ability to transfer calls to a set of phone numbers.
+
+Overrides `transfer_phone_number` if a `transfer_list.default` is specified.
+
+Will default to `transfer_list.default`, or the chosen phone number.
+
+Example usage to route calls to different departments:
+
+```json
+"transfer_list": {
+ "default": "+12223334444",
+ "sales": "+12223334444",
+ "support": "+12223334444",
+ "billing": "+12223334444"
+}
+```
+
+
+
+
+ Select a model to use for your call.
+
+Options: `base`, `turbo` and `enhanced`.
+
+In nearly all cases, `enhanced` is the best choice for now.
+
+
+
+There are three different ways to use Bland:
+
+- `model: base`
+
+ - The original, follows scripts/procedures most effectively.
+ - Supports all features and capabilities.
+ - Best for Custom Tools
+
+- `model: enhanced`
+
+ - Much faster latency and very conversational, works best with objective-based prompts.
+ - Supports all features and capabilities.
+
+- `model: turbo`
+
+ - The absolute fastest latency possible, can be verbose at times
+ - Limited capabilities currently (excludes Transferring, IVR navigation, Custom Tools)
+ - Extremely realistic conversation capabilities
+
+
+
+
+
+
+ A phone number that the agent can transfer to under specific conditions - such as being asked to speak to a human or supervisor.
+
+Set to `null` to remove.
+
+
+ For best results:
+ - Specify conditions that the agent should transfer to a human under (examples are great!)
+ - In the `task`, refer to the action solely as "transfer" or "transferring".
+ - Alternate phrasing such as "swap" or "switch" can mislead the agent, causing the action to be ignored.
+
+
+
+
+
+ To record your phone call, set `record` to true. When your call completes, you can access through the `recording_url`
+ field in the call details or your webhook.
+
+
+
+ A phrase that your call will start with instead of a generating one on the fly. This works both with and without `wait_for_greeting`. Can be more than one sentence, but must be less than 200 characters.
+
+To remove, set to `null` or an empty string.
+
+
+
+
+ Interact with the real world through API calls.
+
+Detailed tutorial here: [Custom Tools](/tutorials/custom-tools)
+
+
+
+
+ Integrate data from external APIs into your agent's knowledge.
+
+Set to `null` or an empty string to clear dynamic data settings.
+
+Detailed usage in the [Send Call](/api-v1/post/calls) endpoint.
+
+
+
+
+ When you increase the interruption latency, you force the AI phone agent to listen longer before responding. In practice, increasing the threshold results in less interruptions and more latency.
+
+Try setting the threshold to `500` milliseconds. You'll encounter higher latency, but you'll be interrupted less frequently.
+
+Set to `null` to reset to default.
+
+
+
+
+ The maximum duration that calls to your agent can last before being automatically terminated.
+
+Set to `null` to reset to default.
+
+
+
+### Response
+
+
+ Whether the update was successful or not - will be `success` or `error`.
+
+
+
+ A message describing the status of the update.
+
+
+
+ An object containing the updated settings for the inbound number.
+
+
+
+ If the update was unsuccessful, this will contain the settings that failed to update. Useful to determine how your
+ request is being interpreted on our end.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully updated number +18584139939.",
+ "updates": {
+ "prompt": "(Your prompt)",
+ "voice": "maya",
+ "webhook": null,
+ "first_sentence": "Roberta speaking, how can I help you?",
+ "record": false,
+ "max_duration": 30,
+ "model": "enhanced"
+ //...
+ }
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-purchase.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-purchase.mdx
new file mode 100644
index 00000000000..af050d6c071
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/inbound-purchase.mdx
@@ -0,0 +1,64 @@
+---
+title: Purchase Inbound number
+subtitle: >-
+ Purchase and configure a new inbound phone number. ($15/mo. subscription using
+ your stored payment method).
+slug: api-v1/post/inbound-purchase
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ Choose a three-digit area code for your phone number. If set as a parameter, a number will only be purchased by exact
+ match if available.
+
+
+
+ This defines how the AI will start the conversation, information available to it, and its behaviors. Matches how the
+ outbound `task` parameter functions.
+
+
+
+ Choose a country code for your phone number.
+
+Options: `"US"` or `"CA"` for Canada. For others, please contact support.
+
+
+
+
+ The webhook should be a http / https callback url. We will send the call_id and transcript to this URL after the call
+ completes. This can be useful if you want to have real time notifications when calls finish.
+
+
+
+ Specify an exact phone number you'd like to use. If provided, will override the `area_code` parameter and does not fall back to any other number.
+
+Example of the correct format (Note the `"+1"` is mandatory): `"+12223334444"`
+
+
+
+### Response
+
+
+ The created phone number, will be in the following format: `+1XXXXXXXXXX`
+
+Example: `+18582814611`
+
+
+
+
+
+```json Response
+{
+ "phone_number": "+18582814611"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/outbound-purchase.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/outbound-purchase.mdx
new file mode 100644
index 00000000000..2df4623fe2c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/outbound-purchase.mdx
@@ -0,0 +1,40 @@
+---
+title: Purchase Outbound number
+subtitle: >-
+ Purchase and configure a new inbound phone number. ($15/mo. subscription using
+ your stored payment method).
+slug: api-v1/post/outbound-purchase
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ Choose a three-digit area code for your phone number. If set as a parameter, a number will only be purchased by exact
+ match if available.
+
+
+### Response
+
+
+ The created phone number, will be in the following format: `+1XXXXXXXXXX`
+
+Example: `+18582814611`
+
+
+
+
+
+```json Response
+{
+ "phone_number": "+18582814611"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-analyze.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-analyze.mdx
new file mode 100644
index 00000000000..4cb5d651e71
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-analyze.mdx
@@ -0,0 +1,53 @@
+---
+title: SMS Conversation Analysis
+subtitle: Answer questions and extract information from an SMS conversation.
+slug: api-v1/post/sms-analyze
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ An overarching goal for the information you want to extract from the SMS messages.
+
+
+
+An array of questions that you want the AI to answer, along with their return types.
+
+For example:
+
+```json
+{
+ "answers": [
+ ["When does Bob want to move?", "time"],
+ ["Summarize the call.", "summary"]
+ ]
+}
+```
+
+
+
+
+ The phone number that received the messages.
+
+
+
+ The human/other phone number in the conversation.
+
+
+
+
+```json Response
+{
+ "status": "success",
+ "message": "Successfully analyzed SMS messages.",
+ "answers": ["Bob prefers to have movers come in the morning.", "..."]
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-check-registration.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-check-registration.mdx
new file mode 100644
index 00000000000..d4f6dd44150
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-check-registration.mdx
@@ -0,0 +1,30 @@
+---
+title: Check SMS A2P status
+subtitle: Check the status of an A2P registration.
+slug: api-v1/post/sms-check-registration
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The `registration_id` for the a2p registration.
+
+
+
+
+```json Response
+{
+ status: "pending" || "approved" || "failed",
+ brandType: //string of the brand type,
+ failureReason: null || "reason here"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-get-messages.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-get-messages.mdx
new file mode 100644
index 00000000000..8dee1eb64ec
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-get-messages.mdx
@@ -0,0 +1,34 @@
+---
+title: Get SMS Messages
+subtitle: Get the list of SMS messages for a given conversation.
+slug: api-v1/post/sms-get-messages
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+The `to` number in the conversation. This is the number you *do not* own.
+
+
+The `from` number in the conversation. This is the number you *do* own.
+
+**Please note any ordering of numbers will work**
+
+
+
+
+
+```json Response
+{
+ "messages": "[]"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-prompt-update.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-prompt-update.mdx
new file mode 100644
index 00000000000..7713c499965
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-prompt-update.mdx
@@ -0,0 +1,35 @@
+---
+title: Update SMS Prompt
+subtitle: Update your SMS agent's prompt.
+slug: api-v1/post/sms-prompt-update
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to update.
+
+
+
+ The prompt for the AI to use when replying.
+
+
+
+ Pass in an array of strings, that if present, the AI should not respond to. Set to `null` to disable.
+
+
+
+
+```json Response
+{
+ "status": "Prompt updated"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-submit-reg.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-submit-reg.mdx
new file mode 100644
index 00000000000..3584d372992
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-submit-reg.mdx
@@ -0,0 +1,72 @@
+---
+title: A2P Registration
+subtitle: >-
+ Learn how to register your A2P brand using our API. This guide covers all you
+ need to know about making a POST request, including required parameters, error
+ handling, and response expectations.
+slug: api-v1/post/sms-submit-reg
+---
+
+
+# Registering an A2P Brand via API
+
+This documentation provides detailed information on how to register an Application-to-Person (A2P) brand by making a POST request to our API. The process involves submitting your brand's details for registration and verification purposes.
+
+A2P Registration is required for _all_ businesses who wish to send SMS. There can be signifcant fines for any non compliant messages. A2P Registration can take 2 days -> 2 Weeks.
+
+## Endpoint
+
+`POST /api/registerA2PBrand`
+
+## Required Headers
+
+- `Authorization`: Your API key for authentication.
+
+## Request Parameters
+
+Your request should include a JSON body with the following parameters:
+
+- `businessName` (string): The legal name of your business.
+- `ein` (string): Your Employer Identification Number.
+- `vertical` (string): Industry vertical. Possible values include: "AUTOMOTIVE", "AGRICULTURE", "BANKING", "CONSTRUCTION", "CONSUMER", "EDUCATION", "ENGINEERING", "ENERGY", "OIL_AND_GAS", "FAST_MOVING_CONSUMER_GOODS", "FINANCIAL", "FINTECH", "FOOD_AND_BEVERAGE", "GOVERNMENT", "HEALTHCARE", "HOSPITALITY", "INSURANCE", "LEGAL", "MANUFACTURING", "MEDIA", "ONLINE", "PROFESSIONAL_SERVICES", "RAW_MATERIALS", "REAL_ESTATE", "RELIGION", "RETAIL", "JEWELRY", "TECHNOLOGY", "TELECOMMUNICATIONS", "TRANSPORTATION", "TRAVEL", "ELECTRONICS", "NOT_FOR_PROFIT"
+- `address` (string): The business address.
+- `city` (string): The city of your business.
+- `state` (string): The state of your business. Must be a valid US state code.
+- `postalCode` (string): The postal code of your business.
+- `country` (string): The country of your business.
+- `email` (string): The email address for your business.
+- `type` (string): Legal structure of the business. Possible values: "Partnership", "Limited Liability Corporation", "Co-operative", "Non-profit Corporation", "Corporation"
+- `website` (string): Your business's website URL.
+- `opt_in_info` (string): Information regarding opt-in procedures for your messaging service. EX: "Customers must explicitly consent on our website and during the phone call."
+- `messageSamples` (array): An array of three strings, each a sample message you plan to use.
+- `trusted_user` (object): An object containing details about the trusted user registering the brand. Includes `position`, `last_name`, `phone_number`, `first_name`, and `email`.
+
+Ex. of trusted_user obj:
+
+```json
+{
+ "position": "CEO" //must be C Suite or VP,
+ "last_name":"Smith",
+ "first_name":"John"
+}
+```
+
+## Error Handling
+
+Our API provides detailed error messages to help you understand what went wrong in case of a failure:
+
+- `400 Bad Request`: This response occurs if any required fields are missing in your request or if the state code is invalid. The response body will include a message specifying the missing or incorrect fields.
+- `500 Internal Server Error`: Indicates an unexpected error on the server side. The response body will contain an error message with more details.
+
+## Successful Response
+
+A successful request returns a `200 OK` status code with a JSON body containing a message indicating the registration was successful and any relevant data or identifiers related to the A2P brand registration.
+
+**\*Important\*\*** The Brand Registration can take several attempts and days to weeks to complete. This success only indicates we _submitted_ the registration correctly.
+
+```json
+{
+ "message": "A2P Brand registration successful.",
+ "data": {...}
+}
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-toggle-human.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-toggle-human.mdx
new file mode 100644
index 00000000000..a3c86027dd5
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-toggle-human.mdx
@@ -0,0 +1,36 @@
+---
+title: Toggle SMS Reply Method
+subtitle: Turn on or off the AI replying for a given phone number.
+slug: api-v1/post/sms-toggle-human
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ The phone number to update.
+
+
+
+Turn human mode on or off.
+
+`true` means that the AI will _not_ reply.
+`false` means the AI will reply
+
+
+
+
+
+```json Response
+{
+ "status": "Turned human mode on"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-webhook-update.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-webhook-update.mdx
new file mode 100644
index 00000000000..3445c3104ff
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/sms-webhook-update.mdx
@@ -0,0 +1,31 @@
+---
+title: Update SMS Webhook
+subtitle: Update the webhook for a given phone number.
+slug: api-v1/post/sms-webhook-update
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+### Body
+
+
+ The phone number to update.
+
+
+
+ The webhook to fire when an SMS is received.
+
+
+
+
+```json Response
+{
+ "status": "success"
+}
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts-id-disable.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts-id-disable.mdx
new file mode 100644
index 00000000000..67c194236ca
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts-id-disable.mdx
@@ -0,0 +1,49 @@
+---
+title: Disable Subaccount
+subtitle: >-
+ Immediately disables a subaccount and transfers any remaining credits back to
+ the parent account.
+slug: api-v1/post/subaccounts-id-disable
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the subaccount to which you want to transfer credits.
+
+
+### Response
+
+
+ Whether the subaccount was successfully disabled.
+
+
+
+ The affected subaccount's unique identifier.
+
+
+
+ The amount of credits transferred back to the parent account.
+
+
+
+ The new balance of the parent account after the transfer.
+
+
+
+```json
+{
+ "status": "success",
+ "subaccount_id": "1234567890",
+ "transferred_amount": 1000,
+ "new_parent_balance": 5000
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts-id-rotate.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts-id-rotate.mdx
new file mode 100644
index 00000000000..3fcacb17d9f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts-id-rotate.mdx
@@ -0,0 +1,42 @@
+---
+title: Rotate Subaccount API Key
+subtitle: Replace the API key of a subaccount with a new one.
+slug: api-v1/post/subaccounts-id-rotate
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the subaccount to which you want to transfer credits.
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ The affected subaccount's unique identifier.
+
+
+
+ The new API key for the subaccount.
+
+
+
+```json
+{
+ "status": "success",
+ "subaccount_id": "1234567890",
+ "api_key": "sub-sk-1234567890"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts-id-transfer.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts-id-transfer.mdx
new file mode 100644
index 00000000000..de7574d33c1
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts-id-transfer.mdx
@@ -0,0 +1,51 @@
+---
+title: Transfer Credit to a Subaccount
+subtitle: Transfer API credits from your account to a subaccount.
+slug: api-v1/post/subaccounts-id-transfer
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The unique identifier of the subaccount to which you want to transfer credits.
+
+
+### Body
+
+
+ This many of your API credits will be transferred to the subaccount.
+
+ The balance must be a positive integer that is at least 1, and less than your current account balance.
+
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ The new balance of your account after the transfer.
+
+
+
+ The new balance of the subaccount after the transfer.
+
+
+
+```json
+{
+ "status": "success",
+ "new_parent_balance": 1200,
+ "new_subaccount_balance": 500
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts.mdx
new file mode 100644
index 00000000000..fff14f6200e
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/subaccounts.mdx
@@ -0,0 +1,71 @@
+---
+title: Create Subaccount
+subtitle: Provision a new subaccount with separate billing, access and usage.
+slug: api-v1/post/subaccounts
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ Moves a portion of your API credit balance to the newly created subaccount.
+
+ The balance must be a positive integer that is at least 10, and less than your current account balance.
+
+ Special per-minute pricing plans carry over automatically to the subaccount, while increased rate limits do not.
+
+ Unused credits can be reclaimed later with the subaccount's balance if needed.
+
+
+
+
+ The first name of the user who will be using the subaccount.
+
+
+
+ The last name of the user who will be using the subaccount.
+
+
+
+ Whether you will be able to log in to the subaccount through the Dev Portal at `app.bland.ai`.
+
+ This enables you to set up credit card information, view and monitor usage, and further manage the subaccount as needed.
+
+ The subaccount user will not be able to log into the Dev Portal unless you explicitly enable it by adding them as an Authorized User.
+
+
+
+### Response
+
+
+ Whether the subaccount creation succeeded.
+
+
+
+ The unique identifier for the newly created subaccount.
+
+
+
+ The API key that the new subaccount can use to authenticate requests.
+
+ This is the only information that the subaccount user will need to start using the API.
+
+ Do not use this as an identifier for the subaccount, since it can be rotated.
+
+
+
+
+```json
+{
+ "status": "success",
+ "subaccount_id": "1234567890",
+ "subaccount_key": "sub-sk-1234567890"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/tools-tool-id.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/tools-tool-id.mdx
new file mode 100644
index 00000000000..e068e4af003
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/tools-tool-id.mdx
@@ -0,0 +1,354 @@
+---
+title: Update Custom Tool
+subtitle: Change your Custom Tool's parameters and characteristics.
+slug: api-v1/post/tools-tool-id
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The ID of the Custom Tool you want to update.
+
+
+### Body
+
+
+ This is the name that the AI using the tool will see.
+
+ Some other internal tools are named `Speak`, `Wait`, `Transfer` and `Finish` - Custom Tools cannot share these names.
+
+ We've made a list of reserved words that can confuse the AI that cannot be included:
+ - `input`
+ - `speak`
+ - `transfer`
+ - `switch`
+ - `wait`
+ - `finish`
+ - `press`
+ - `button`
+ - `say`
+ - `pause`
+ - `record`
+ - `play`
+ - `dial`
+ - `hang`
+
+ Choosing too similar of names to the default tools could cause the AI to select the wrong one, so decriptive two to three-word names are preferred.
+
+
+
+
+ This is the description that the AI using the tool will see.
+
+ Describe the effect of what the tool does or any special instructions.
+
+ For reference, here are the default tools' descriptions:
+ - `Speak`: Talk to the person on the other end of the line
+ - `Press Buttons`: Presses buttons on phone. Each character is a different button.
+ - `Wait`: Wait and go silent for an extended period of time (only use if absolutely necessary).
+ - `Finish`: Say a goodbye message and end the call once completed.
+
+
+
+
+ This is the text that the AI will say while it uses the tool.
+
+ For example, if the tool is a "GenerateQuote" tool, the speech might be "Please wait while I get you your quote."
+
+ Since tools can be verbally interrupted, shorter messages that tell the user what the tool/AI are doing are best.
+
+ Special Note: You can have the AI dynamically generate speech by defining `input.speech` in the `input_schema`.
+
+
+
+```json
+{
+ "input_schema": {
+ "example": {
+ "speech": "Checking your account details right now John!",
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ },
+ "type": "object",
+ "properties": {
+ "speech": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ }
+ },
+ "required": ["speech", "name", "email"]
+ }
+}
+```
+
+
+
+
+
+
+ This is the endpoint of the external API that the tool will call.
+
+ It must begin with `https://` and be a valid URL.
+
+
+
+
+ This is the HTTP method that the tool will use to call the external API.
+
+ Valid options are `GET` and `POST`.
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ These are the headers that the tool will send to the external API.
+
+ The headers must be in JSON format.
+
+ Since prompt variables are supported, you can use them in the headers to send dynamic information to the external API.
+
+
+
+```json
+// At the top level of your send call request you can define variables that you can access later using the double curly braces/dot syntax.
+{
+ "request_data": {
+ "api_key": "sk-1234567890"
+ },
+ "tools": [
+ {
+ "headers": {
+ "Authorization": "Bearer {{api_key}}"
+ }
+ }
+ ]
+}
+```
+
+
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ This is the body that the tool will send to the external API.
+
+ The body must be in JSON format.
+
+ This is the most common place to use Prompt Variables with AI input.
+
+ Note: `GET` requests do not have a body.
+
+
+
+```json
+ // AI-generated input is created as the `input` Prompt Variable - and the structure is defined by the input schema.
+ // `input` will match the structure of `input_schema.example` if it is defined.
+ {
+ "input_schema": {
+ "example": {
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ }
+ }
+ "body": {
+ "name": "{{input.name}}",
+ "email": "{{input.email}}"
+ }
+ }
+```
+
+
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ Append query parameters to the URL.
+
+ The query must be in JSON format.
+
+ This is generally used with GET requests and built-in Prompt Variables like `"{{phone_number}}"` or `"{{call_id}}"`.
+
+
+
+```json
+// appends ?pn={{phone_number}}&callId={{call_id}} to the URL
+{
+ "query": {
+ "pn": "{{phone_number}}",
+ "callId": "{{call_id}}"
+ }
+}
+```
+
+
+
+
+
+
+ This is the schema that the AI input must match for the tool to be used.
+
+ The schema must be in JSON format.
+
+ The schema is used to validate the AI input before the tool is used.
+
+ If the AI input does not match the schema, the tool will not be used and the AI will move on to the next tool.
+
+ `input_schema.example` can be used to enhance the AI's understanding of the input structure and helps significantly with structured or nested data.
+
+ Special Note: `input_schema` does not require strict JSON schema structure, and creativity is encouraged.
+
+ [Look here for a general guide on JSON schema structures.](https://json-schema.org/learn/getting-started-step-by-step)
+
+ Non-traditional JSON schema structures are supported as well, like these examples:
+ - "options": "monday, wednesday, friday"
+ - "date": "YYYY-MM-DD"
+ - "time": "HH:MM:SS (AM|PM)"
+ - "phone_number": "+1XXX-XXX-XXXX"
+
+ Agent input can be nested, and the will be transformed into JSON even if it's initially a string.
+
+
+
+```json
+{
+ "input_schema": {
+ "example": {
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ },
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ }
+ },
+ "required": ["name", "email"]
+ },
+ // both of these methods are identical, since {{input}} will be transformed into JSON
+ "body": "{{input}}",
+ "body": {
+ "name": "{{input.name}}",
+ "email": "{{input.email}}"
+ }
+}
+```
+
+
+
+
+
+
+ Define how you would like to extract data from the response.
+
+ By default, the entire response body is stored in the `{{data}}` Prompt Variable.
+
+ The path to the data you want must be in JSON Path format. Generally this means using dot notation to traverse the JSON object and is only required if you need to use that information on other tools or the response is too large.
+
+ Example:
+
+```json
+ // If the external API response is:
+ {
+ "available_times": [
+ {
+ "time": "10:00 AM",
+ "date": "2022-01-01"
+ },
+ {
+ "time": "11:00 AM",
+ "date": "2022-01-01"
+ }
+ ],
+ "store_hours": {
+ "open": "9:00 AM",
+ "close": "5:00 PM"
+ },
+ "address_info": {
+ "street": "123 Main St",
+ "city": "Anytown",
+ "state": "CA",
+ "zip": "12345"
+ }
+ }
+
+ // You can extract new Prompt Variables like this:
+ {
+ "response": {
+ "available_times": "$.available_times",
+ "store_hours": "$.store_hours",
+ "address_info": "$.address_info",
+ "zip_code": "$.address_info.zip"
+ }
+ }
+
+ // And then it'll automatically replace them elsewhere (like in the `task`/`prompt`)
+ {
+ "task": "The store is open from {{store_hours.open}} to {{store_hours.close}}.",
+ "prompt": "The store is located at {{address_info.street}}, {{address_info.city}}, {{address_info.state}} {{zip_code}}."
+ }
+```
+
+
+
+
+ This is the maximum time in milliseconds that the tool will wait for a response from the external API.
+
+ If the external API does not respond within this time, the tool will fail and the AI will move on to the next tool.
+
+ The default timeout is 10 seconds (10000 milliseconds).
+
+ To always wait for a response, set the timeout to an extremely high value like 99999999.
+
+
+
+### Response
+
+
+ Whether the tool creation succeeded.
+
+
+
+ A tool id that you can use to reference the tool in the future.
+
+ In a Send Call request, you could pass this tool id in instead of the full Custom Tool object like so:
+
+ ```json
+ {
+ "tools": [
+ "TL-1234567890" // tool_id (instead of the full Custom Tool object)
+ ]
+ }
+ ```
+
+
+
+
+```json
+{
+ "status": "success",
+ "tool_id": "TL-1234567890"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/tools.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/tools.mdx
new file mode 100644
index 00000000000..711a608537c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/tools.mdx
@@ -0,0 +1,348 @@
+---
+title: Create a Custom Tool
+subtitle: Create a Custom Tool that can take AI input and call external APIs.
+slug: api-v1/post/tools
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Body
+
+
+ This is the name that the AI using the tool will see.
+
+ Some other internal tools are named `Speak`, `Wait`, `Transfer` and `Finish` - Custom Tools cannot share these names.
+
+ We've made a list of reserved words that can confuse the AI that cannot be included:
+ - `input`
+ - `speak`
+ - `transfer`
+ - `switch`
+ - `wait`
+ - `finish`
+ - `press`
+ - `button`
+ - `say`
+ - `pause`
+ - `record`
+ - `play`
+ - `dial`
+ - `hang`
+
+ Choosing too similar of names to the default tools could cause the AI to select the wrong one, so decriptive two to three-word names are preferred.
+
+
+
+
+ This is the description that the AI using the tool will see.
+
+ Describe the effect of what the tool does or any special instructions.
+
+ For reference, here are the default tools' descriptions:
+ - `Speak`: Talk to the person on the other end of the line
+ - `Press Buttons`: Presses buttons on phone. Each character is a different button.
+ - `Wait`: Wait and go silent for an extended period of time (only use if absolutely necessary).
+ - `Finish`: Say a goodbye message and end the call once completed.
+
+
+
+
+ This is the text that the AI will say while it uses the tool.
+
+ For example, if the tool is a "GenerateQuote" tool, the speech might be "Please wait while I get you your quote."
+
+ Since tools can be verbally interrupted, shorter messages that tell the user what the tool/AI are doing are best.
+
+ Special Note: You can have the AI dynamically generate speech by defining `input.speech` in the `input_schema`.
+
+
+
+```json
+{
+ "input_schema": {
+ "example": {
+ "speech": "Checking your account details right now John!",
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ },
+ "type": "object",
+ "properties": {
+ "speech": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ }
+ },
+ "required": ["speech", "name", "email"]
+ }
+}
+```
+
+
+
+
+
+
+ This is the endpoint of the external API that the tool will call.
+
+ It must begin with `https://` and be a valid URL.
+
+
+
+
+ This is the HTTP method that the tool will use to call the external API.
+
+ Valid options are `GET` and `POST`.
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ These are the headers that the tool will send to the external API.
+
+ The headers must be in JSON format.
+
+ Since prompt variables are supported, you can use them in the headers to send dynamic information to the external API.
+
+
+
+```json
+// At the top level of your send call request you can define variables that you can access later using the double curly braces/dot syntax.
+{
+ "request_data": {
+ "api_key": "sk-1234567890"
+ },
+ "tools": [
+ {
+ "headers": {
+ "Authorization": "Bearer {{api_key}}"
+ }
+ }
+ ]
+}
+```
+
+
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ This is the body that the tool will send to the external API.
+
+ The body must be in JSON format.
+
+ This is the most common place to use Prompt Variables with AI input.
+
+ Note: `GET` requests do not have a body.
+
+
+
+```json
+ // AI-generated input is created as the `input` Prompt Variable - and the structure is defined by the input schema.
+ // `input` will match the structure of `input_schema.example` if it is defined.
+ {
+ "input_schema": {
+ "example": {
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ }
+ }
+ "body": {
+ "name": "{{input.name}}",
+ "email": "{{input.email}}"
+ }
+ }
+```
+
+
+
+
+
+
+ `SUPPORTS PROMPT VARIABLES`
+
+ Append query parameters to the URL.
+
+ The query must be in JSON format.
+
+ This is generally used with GET requests and built-in Prompt Variables like `"{{phone_number}}"` or `"{{call_id}}"`.
+
+
+
+```json
+// appends ?pn={{phone_number}}&callId={{call_id}} to the URL
+{
+ "query": {
+ "pn": "{{phone_number}}",
+ "callId": "{{call_id}}"
+ }
+}
+```
+
+
+
+
+
+
+ This is the schema that the AI input must match for the tool to be used.
+
+ The schema must be in JSON format.
+
+ The schema is used to validate the AI input before the tool is used.
+
+ If the AI input does not match the schema, the tool will not be used and the AI will move on to the next tool.
+
+ `input_schema.example` can be used to enhance the AI's understanding of the input structure and helps significantly with structured or nested data.
+
+ Special Note: `input_schema` does not require strict JSON schema structure, and creativity is encouraged.
+
+ [Look here for a general guide on JSON schema structures.](https://json-schema.org/learn/getting-started-step-by-step)
+
+ Non-traditional JSON schema structures are supported as well, like these examples:
+ - "options": "monday, wednesday, friday"
+ - "date": "YYYY-MM-DD"
+ - "time": "HH:MM:SS (AM|PM)"
+ - "phone_number": "+1XXX-XXX-XXXX"
+
+ Agent input can be nested, and the will be transformed into JSON even if it's initially a string.
+
+
+
+```json
+{
+ "input_schema": {
+ "example": {
+ "name": "John Doe",
+ "email": "johndoe@gmail.com"
+ },
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string",
+ "format": "email"
+ }
+ },
+ "required": ["name", "email"]
+ },
+ // both of these methods are identical, since {{input}} will be transformed into JSON
+ "body": "{{input}}",
+ "body": {
+ "name": "{{input.name}}",
+ "email": "{{input.email}}"
+ }
+}
+```
+
+
+
+
+
+
+ Define how you would like to extract data from the response.
+
+ By default, the entire response body is stored in the `{{data}}` Prompt Variable.
+
+ The path to the data you want must be in JSON Path format. Generally this means using dot notation to traverse the JSON object and is only required if you need to use that information on other tools or the response is too large.
+
+ Example:
+
+```json
+ // If the external API response is:
+ {
+ "available_times": [
+ {
+ "time": "10:00 AM",
+ "date": "2022-01-01"
+ },
+ {
+ "time": "11:00 AM",
+ "date": "2022-01-01"
+ }
+ ],
+ "store_hours": {
+ "open": "9:00 AM",
+ "close": "5:00 PM"
+ },
+ "address_info": {
+ "street": "123 Main St",
+ "city": "Anytown",
+ "state": "CA",
+ "zip": "12345"
+ }
+ }
+
+ // You can extract new Prompt Variables like this:
+ {
+ "response": {
+ "available_times": "$.available_times",
+ "store_hours": "$.store_hours",
+ "address_info": "$.address_info",
+ "zip_code": "$.address_info.zip"
+ }
+ }
+
+ // And then it'll automatically replace them elsewhere (like in the `task`/`prompt`)
+ {
+ "task": "The store is open from {{store_hours.open}} to {{store_hours.close}}.",
+ "prompt": "The store is located at {{address_info.street}}, {{address_info.city}}, {{address_info.state}} {{zip_code}}."
+ }
+```
+
+
+
+
+ This is the maximum time in milliseconds that the tool will wait for a response from the external API.
+
+ If the external API does not respond within this time, the tool will fail and the AI will move on to the next tool.
+
+ The default timeout is 10 seconds (10000 milliseconds).
+
+ To always wait for a response, set the timeout to an extremely high value like 99999999.
+
+
+
+### Response
+
+
+ Whether the tool creation succeeded.
+
+
+
+ A tool id that you can use to reference the tool in the future.
+
+ In a Send Call request, you could pass this tool id in instead of the full Custom Tool object like so:
+
+ ```json
+ {
+ "tools": [
+ "TL-1234567890" // tool_id (instead of the full Custom Tool object)
+ ]
+ }
+ ```
+
+
+
+
+```json
+{
+ "status": "success",
+ "tool_id": "TL-1234567890"
+}
+```
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/voices-id-sample.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/voices-id-sample.mdx
new file mode 100644
index 00000000000..10f6c37c0ee
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/api-v1/post/voices-id-sample.mdx
@@ -0,0 +1,46 @@
+---
+title: Generate Audio Sample
+subtitle: Generate an audio sample for a voice.
+slug: api-v1/post/voices-id-sample
+---
+
+
+### Headers
+
+
+ Your API key for authentication.
+
+
+### Path Parameters
+
+
+ The ID of the voice to generate the audio sample for, or it's name (like "maya").
+
+
+### Request Body
+
+
+ The text content to be spoken in the voice sample.
+
+Character limit: `200` characters.
+
+
+
+
+ Alternate `voice_settings` can be passed in to override the preset's default settings.
+
+
+
+ The language of the text content. Default is `ENG`.
+
+Some other language codes: "ESP", "GER", "FRE"
+
+
+
+### Response
+
+
+ The generated audio file of the spoken text using the specified or overridden voice preset settings.
+
+
+```json (Generated audio file) ```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/developerportal.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/developerportal.png
new file mode 100644
index 00000000000..c906cdfd631
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/developerportal.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/docs.yml b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/docs.yml
new file mode 100644
index 00000000000..63ce8f5b8f3
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/docs.yml
@@ -0,0 +1,229 @@
+instances: []
+title: Bland AI
+favicon: logo.png
+logo:
+ light: logo/light.svg
+ dark: logo/dark.svg
+ height: 28
+colors:
+ accentPrimary:
+ dark: '#0b0a18'
+ light: '#847AF9'
+ background:
+ dark: '#0A141B'
+tabs:
+ api-v1:
+ slug: api-v1
+ displayName: V1 API Reference
+ documentation:
+ displayName: Documentation
+ slug: documentation
+navigation:
+ - tab: api-v1
+ layout:
+ - section: Basic
+ contents:
+ - page: Send Call (Simple)
+ path: api-v1/post/calls-simple.mdx
+ - page: Send Call using Pathways (Simple)
+ path: api-v1/post/calls-simple-pathway.mdx
+ - section: Calls
+ contents:
+ - page: Send Call
+ path: api-v1/post/calls.mdx
+ - page: Analyze Call with AI
+ path: api-v1/post/calls-id-analyze.mdx
+ - page: Stop Active Call
+ path: api-v1/post/calls-id-stop.mdx
+ - page: List Calls
+ path: api-v1/get/calls.mdx
+ - page: Call Details
+ path: api-v1/get/calls-id.mdx
+ - page: Audio Recording
+ path: api-v1/get/calls-id-recording.mdx
+ - page: Get corrected transcripts
+ path: api-v1/get/calls-corrected-transcript.mdx
+ - section: Web Agents
+ contents:
+ - page: Create a Web Agent
+ path: api-v1/post/agents.mdx
+ - page: Update Web Agent Settings
+ path: api-v1/post/agents-id.mdx
+ - page: Authorize a Web Agent Call
+ path: api-v1/post/agents-id-authorize.mdx
+ - page: Delete Web Agent
+ path: api-v1/post/agents-id-delete.mdx
+ - page: List Web Agents
+ path: api-v1/get/agents.mdx
+ - section: Inbound Numbers
+ contents:
+ - page: Purchase Inbound number
+ path: api-v1/post/inbound-purchase.mdx
+ - page: Update Inbound Details
+ path: api-v1/post/inbound-number-update.mdx
+ - page: List Inbound Numbers
+ path: api-v1/get/inbound.mdx
+ - page: Inbound Number Details
+ path: api-v1/get/inbound-number.mdx
+ - section: Outbound Numbers
+ contents:
+ - page: Purchase Outbound number
+ path: api-v1/post/outbound-purchase.mdx
+ - page: List Outbound Numbers
+ path: api-v1/get/outbound.mdx
+ - section: Voices
+ contents:
+ - page: List Voices
+ path: api-v1/get/voices.mdx
+ - page: Voice Details
+ path: api-v1/get/voices-id.mdx
+ - page: Generate Audio Sample
+ path: api-v1/post/voices-id-sample.mdx
+ - section: Custom Tools
+ contents:
+ - page: Create a Custom Tool
+ path: api-v1/post/tools.mdx
+ - page: Update Custom Tool
+ path: api-v1/post/tools-tool-id.mdx
+ - page: List Custom Tools
+ path: api-v1/get/tools.mdx
+ - page: Custom Tool Details
+ path: api-v1/get/tools-tool-id.mdx
+ - section: Custom Twilio Accounts
+ contents:
+ - page: Create Encrypted Key
+ path: api-v1/post/accounts.mdx
+ - page: Delete Encrypted Key
+ path: api-v1/post/accounts-delete.mdx
+ - page: Upload Inbound Phone Numbers
+ path: api-v1/post/inbound-insert.mdx
+ - page: Delete Inbound Phone Number
+ path: api-v1/post/inbound-number-delete.mdx
+ - section: Subaccounts
+ contents:
+ - page: Create Subaccount
+ path: api-v1/post/subaccounts.mdx
+ - page: Transfer Credit to a Subaccount
+ path: api-v1/post/subaccounts-id-transfer.mdx
+ - page: Rotate Subaccount API Key
+ path: api-v1/post/subaccounts-id-rotate.mdx
+ - page: Disable Subaccount
+ path: api-v1/post/subaccounts-id-disable.mdx
+ - page: List Subaccounts
+ path: api-v1/get/subaccounts.mdx
+ - page: List Subaccount Details
+ path: api-v1/get/subaccounts-id.mdx
+ - section: Batches
+ contents:
+ - page: Send a Batch of Calls
+ path: api-v1/post/batches.mdx
+ - page: Analyze Batch with AI
+ path: api-v1/post/batches-id-analyze.mdx
+ - page: Stop Active Batch
+ path: api-v1/post/batches-id-stop.mdx
+ - page: List Batches
+ path: api-v1/get/batches.mdx
+ - page: Batch Details
+ path: api-v1/get/batches-id.mdx
+ - page: Retrieve Batch Analysis
+ path: api-v1/get/batches-id-analysis.mdx
+ - section: SMS
+ contents:
+ - page: A2P Registration
+ path: api-v1/post/sms-submit-reg.mdx
+ - page: Check SMS A2P status
+ path: api-v1/post/sms-check-registration.mdx
+ - page: Update SMS Prompt
+ path: api-v1/post/sms-prompt-update.mdx
+ - page: SMS Conversation Analysis
+ path: api-v1/post/sms-analyze.mdx
+ - page: Get SMS Messages
+ path: api-v1/post/sms-get-messages.mdx
+ - page: Toggle SMS Reply Method
+ path: api-v1/post/sms-toggle-human.mdx
+ - page: Update SMS Webhook
+ path: api-v1/post/sms-webhook-update.mdx
+ - section: Account
+ contents:
+ - page: Account Details
+ path: api-v1/get/me.mdx
+ - tab: documentation
+ layout:
+ - section: Get Started
+ contents:
+ - page: Welcome to Bland AI
+ path: welcome-to-bland.mdx
+ - page: Starter guide
+ path: starter-guide.mdx
+ - section: Bland Enterprise
+ contents:
+ - page: Custom Twilio Integration
+ path: enterprise-features/custom-twilio.mdx
+ - page: Fine-tuning & Custom LLMs
+ path: enterprise-features/custom-llm.mdx
+ - page: Unlimited support
+ path: enterprise-features/unlimited-support.mdx
+ - page: Custom languages & voices
+ path: enterprise-features/custom-tts.mdx
+ - page: Bring your own Twilio
+ path: enterprise-features/bring-your-own-twilio.mdx
+ - page: Enterprise rate limits
+ path: enterprise-features/enterprise-rate-limits.mdx
+ - section: Featured guides
+ contents:
+ - page: Bland & Botpress
+ path: featured-guides/bland-and-botpress.mdx
+ - section: Basic Tutorials
+ contents:
+ - page: Conversational Pathways
+ path: tutorials/pathways.mdx
+ - page: Custom Tools
+ path: tutorials/custom-tools.mdx
+ - page: Send your first phone call
+ path: tutorials/send-first-call.mdx
+ - page: Webhook Signing
+ path: tutorials/webhook-signing.mdx
+ - page: Send 1000 phone calls
+ path: tutorials/send-1000-calls-at-once.mdx
+ - page: Dynamic Data
+ path: tutorials/dynamic-data.mdx
+ - page: Setting max duration
+ path: tutorials/max-duration.mdx
+ - page: Live transfer
+ path: tutorials/live-transfer.mdx
+ - page: Webhooks
+ path: tutorials/webhooks.mdx
+ - section: Primary Endpoints
+ contents:
+ - page: Make a call
+ path: api-reference/endpoint/call.mdx
+ - page: Get transcript
+ path: api-reference/endpoint/logs.mdx
+ - page: Wait on Hold (HoldForMe)
+ path: api-reference/endpoint/hold.mdx
+ - page: End phone call
+ path: api-reference/endpoint/end.mdx
+ - page: Validate Dynamic Data
+ path: api-reference/endpoint/dynamic_validate.mdx
+ - page: Purchase inbound number
+ path: api-reference/endpoint/purchase.mdx
+ - page: Update Inbound Prompt
+ path: api-reference/endpoint/inbound_prompt.mdx
+ - page: Get recording
+ path: api-reference/endpoint/recording.mdx
+ - section: Batch Endpoints
+ contents:
+ - page: Batch Calling
+ path: api-reference/batch-endpoint/batch.mdx
+ - page: Retrieve a Batch
+ path: api-reference/batch-endpoint/batch_get.mdx
+ - page: Retrieve All Batches
+ path: api-reference/batch-endpoint/batches_get.mdx
+ - page: Cancel Batch
+ path: api-reference/batch-endpoint/batch_stop.mdx
+ - page: Cancel All Batch Calls
+ path: api-reference/batch-endpoint/end_batches.mdx
+ - section: Hold Endpoint
+ contents:
+ - page: Wait on Hold (HoldForMe)
+ path: api-reference/hold-endpoint/hold.mdx
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/bring-your-own-twilio.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/bring-your-own-twilio.mdx
new file mode 100644
index 00000000000..0d900e78eff
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/bring-your-own-twilio.mdx
@@ -0,0 +1,15 @@
+---
+title: Bring your own Twilio
+slug: enterprise-features/bring-your-own-twilio
+---
+
+
+Enterprise customers can create and connect their own Twilio account to Bland.
+
+Features include:
+
+1. Full ownership of telephony infrastructure
+2. Ability to connect to existing telephony infrastructure
+3. Closer control of spam risk and any discounted rates already included on the account
+
+Reach out for enterprise access, here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/custom-llm.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/custom-llm.mdx
new file mode 100644
index 00000000000..86102e28cce
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/custom-llm.mdx
@@ -0,0 +1,37 @@
+---
+title: Fine-tuning & Custom LLMs
+slug: enterprise-features/custom-llm
+---
+
+
+## Summary
+
+Bland will fine-tune a custom model for your enterprise using transcripts from succesful prior calls. Then Bland will host that LLM and provided dedicated infrastrucure to enable phone conversations with sub-second latency.
+
+Bland will also enable you to connect to a custom LLM & will host that LLM to drive latency down further.
+
+Get in touch here.
+
+## Background on fine-tuning
+
+Traditionally, most AI phone agents use private models from companies like OpenAI and Anthropic. Those LLMs are large, and perform best at following instructions and delivering high quality outputs. The downside, however, is they are very slow. Additionally, because they're general models, their personality, tone, and overall capabilities are limited.
+
+Conversely, open source models generally perform worse at a broad range of tasks. However, by fine-tuning an open-source model with examples of a given task, you can significantly improve it's performance at that task, even surpassing the capabilties of top-of-the-line models like GPT-4.
+
+## How do I fine-tune with Bland?
+
+To inquire about fine-tuning connect with the Bland team here.
+
+During the initial conversation you will discuss:
+
+1. The format of data we'll require
+2. How long fine-tuning will take (typically one week)
+3. Pricing (typically under five figures)
+
+## How do I bring my own LLM?
+
+The Bland team will advise on connection method, requirements for the connection, etc.
+
+Typically takes under 24 hours to set up after kickoff.
+
+Inquire here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/custom-tts.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/custom-tts.mdx
new file mode 100644
index 00000000000..e5b1aff584f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/custom-tts.mdx
@@ -0,0 +1,11 @@
+---
+title: Custom languages & voices
+slug: enterprise-features/custom-tts
+---
+
+
+Enterprise customers can bring their own TTS service or work with Bland's engineering team to configure higher quality voice clones.
+
+Enterprise customers can also request foreign languages like German, Spanish, Italian, and Portoguese, and Bland's engineering team will set up different transcription and TTS to accomodate the request.
+
+Reach out for enterprise access, here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/custom-twilio.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/custom-twilio.mdx
new file mode 100644
index 00000000000..c40b7825b0d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/custom-twilio.mdx
@@ -0,0 +1,53 @@
+---
+title: Custom Twilio Integration
+subtitle: Connect Bland to your own Twilio account
+slug: enterprise-features/custom-twilio
+---
+
+
+## Overview
+
+Enterprise customers can connect their own Twilio account to Bland. Easily bring over your existing phone numbers, integrations, and more.
+
+Pre-requisites:
+
+- Your own Twilio account
+- An [Enterprise plan](https://forms.default.com/361589) with Bland
+
+## Step 1: Creating an Encrypted Key with your Twilio Credentials
+
+1. Go to your [Twilio Console](https://www.twilio.com/console) and get your Account SID and Auth Token.
+2. Create an `encrypted_key` by [sending an API request](/api-v1/post/accounts) to Bland.
+
+This is the only time that your `encrypted_key` will be returned to you. Make sure to store it securely, and new keys will need to be generated if lost.
+
+## Step 2: Using the Encrypted Key in Outbound Calls
+
+Include `encrypted_key` in the headers (in addition to the `Authorization` header) of your API requests, and we'll use that account's credentials to make the call.
+
+For example:
+
+```json
+{
+ "Authorization": "BLAND_API_KEY",
+ "encrypted_key": "YOUR_ENCRYPTED_KEY"
+}
+```
+
+Note:
+
+- You can set your `from` number in the API request - this will need to be a number owned by that Twilio account (and not one purchased through Bland).
+- By default, we'll send calls from a randomly selected number in the specified Twilio account if a `from` is not specified.
+
+## Step 3: Uploading Inbound numbers
+
+1. Go to your [Twilio Console](https://www.twilio.com/console) and get your Twilio phone number(s).
+2. Upload your numbers [through the API](/api-v1/post/inbound-insert).
+
+We'll validate that these numbers are owned by that account and add them to your Bland account.
+
+## Step 4: Configuring Inbound Numbers/Webhooks
+
+Note: When updating inbound numbers, the headers need to include the `encrypted_key` in addition to the `Authorization` header. Doing so makes sure the updates are applied to the correct Twilio account.
+
+Once you update an inbound number through the [Dev Portal](https://app.bland.ai) or [API](/api-v1/post/inbound-number-update), that number will be automatically configured to run on Bland's infrastructure. No additional steps are required!
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/enterprise-rate-limits.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/enterprise-rate-limits.mdx
new file mode 100644
index 00000000000..7c1f7055bb9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/enterprise-rate-limits.mdx
@@ -0,0 +1,11 @@
+---
+title: Enterprise rate limits
+slug: enterprise-features/enterprise-rate-limits
+---
+
+
+By default, Bland customers can dispatch 1000 calls/day before hitting rate limits.
+
+Enterprise customers start at 20,000 calls per hour, and 100,000 calls per day.
+
+To raise your rate limits or discuss limits larger than what's offered on enterprise, reach out here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/unlimited-support.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/unlimited-support.mdx
new file mode 100644
index 00000000000..197a58141d9
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/enterprise-features/unlimited-support.mdx
@@ -0,0 +1,15 @@
+---
+title: Unlimited support
+slug: enterprise-features/unlimited-support
+---
+
+
+Bland enterprise customers receive access to a shared slack channel with Bland's engineering team and founders. Enterprise customers also receive the founders phone numbers. Finally, for enterprise customers, the team strives to respond to every message in under five minutes, while maintaining a 24-hour SLA.
+
+Bland's engineers will guide on:
+
+1. Using features like `dynamic_data` and `custom_tools`
+2. Best practices for prompting & configuring the phone agent
+3. Making customizations (e.g. bring your own twilio, custom languages & voices, etc.)
+
+Reach out for enterprise access, here.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/featured-guides/bland-and-botpress.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/featured-guides/bland-and-botpress.mdx
new file mode 100644
index 00000000000..45bbb7367bf
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/featured-guides/bland-and-botpress.mdx
@@ -0,0 +1,25 @@
+---
+title: Bland & Botpress
+slug: featured-guides/bland-and-botpress
+---
+
+
+## Overview
+
+The integration process involves several key steps, starting with setting up your Botpress server and configuring your Bland AI account to ensure both platforms can communicate effectively. You'll learn how to authenticate your Botpress instance with Bland AI, send dynamic data (like phone numbers and intents) from chatbot conversations to Bland AI, and initiate voice calls based on user inputs or specific triggers within your chatbot workflows. **This guide is also a great way for no-coders to deploy a bland AI project easily, with little to no coding experience.**
+
+This guide will cover:
+
+1. Setting Up Botpress: Instructions on preparing your Botpress environment for integration, including installation and basic configuration.
+2. Configuring Bland AI: How to set up your Bland AI account, obtain necessary API keys, and understand the API's capabilities related to voice interactions.
+3. Integration Workflow: Step-by-step guidance on creating workflows in Botpress that interact with Bland AI's API, focusing on initiating voice calls to user-provided numbers.
+4. Testing and Troubleshooting: Tips for testing your integrated solution to ensure it works as expected and troubleshooting common issues that may arise during the integration process.
+5. Advanced Use Cases: Ideas and examples for leveraging this integration to create innovative chatbot applications that blend chat and voice interactions in unique and valuable ways.
+
+## Getting started
+
+[Read the entire guide](https://docs.google.com/document/d/1zn-89jYvpS238bQvp0XEfdV-s_txVlJIHrfIFhpNcJ4).
+
+## About Nort Labs
+
+Nort Labs is an agency that leverages AI technology to create bespoke marketing, design, and automation solutions for their customers. You can learn more about Nort's services by visitng their [website](https://nortlabs.com/).
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/fern.config.json b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/fern.config.json
new file mode 100644
index 00000000000..2e3e1df85fd
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/fern.config.json
@@ -0,0 +1,4 @@
+{
+ "version": "*",
+ "organization": "fern"
+}
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/logo.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/logo.png
new file mode 100644
index 00000000000..6790583be04
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/logo.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/logo/dark.svg b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/logo/dark.svg
new file mode 100644
index 00000000000..485b0131bcc
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/logo/dark.svg
@@ -0,0 +1,10 @@
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/logo/light.svg b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/logo/light.svg
new file mode 100644
index 00000000000..3334add5829
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/logo/light.svg
@@ -0,0 +1,10 @@
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/send-phone-call.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/send-phone-call.png
new file mode 100644
index 00000000000..f9d208f6f37
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/send-phone-call.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/starter-guide.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/starter-guide.mdx
new file mode 100644
index 00000000000..e440d8b5c91
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/starter-guide.mdx
@@ -0,0 +1,76 @@
+---
+title: Starter guide
+subtitle: Learn how to use Bland's API in under five minutes
+slug: starter-guide
+---
+
+
+## Creating a developer account
+
+
+
+To get started, sign up on the developer portal.
+
+Enter your phone number and verification code. Finally, once your developer portal loads, go to the `Send phone call` page.
+
+## Sending your first phone call
+
+
+
+Although Bland is an API-first platform, the send phone call page provides a simple interface for quickly testing calls. On the left side you can adjust the call options and on the right hand side you can see how the code updates.
+
+Once you're satisfied with a call, copy the code on the right side (in Javascript, Python, or cURL) and add it to your application.
+
+
+ In the `Phone Number` field, enter your own phone number.
+
+ For the task box either select one of the example prompts or write your own. For more instrucionts about prompting
+ your AI phone agent, read this blog post.
+
+
+ Scroll to the bottom of the page, and press the `Send call` button. Note, calls are charged at $0.12/minute, billed
+ to the exact second.
+
+
+
+To send a phone call programatically, read the API reference.
+
+## Testing your phone agent
+
+
+
+Once you've sent your first phone call, the next step is to test and improve the outputs from your phone agent.
+
+One way to test your agent is to send yourself test calls. A faster way, however, is to use the Bland AI testing suite.
+
+
+
+ Select the model and language and insert your current prompt into the task box.
+
+
+ Start messaging your phone agent. Act like you're the person receiving the call, and purposefully ask edge-case
+ questions to throw the phone agent off.
+
+ Based on the responses you receive, update the instructions in the prompt.
+
+
+## Next steps
+
+You now know how to send and test phone calls, but you've only scratched the surface of Bland's capabilties.
+
+Areas for further exploration:
+
+
+
+ Read the API reference.
+
+
+ Creating custom tools for interacting with external APIs, live, during phone calls.
+
+
+ Learn how to prompt the exact behavior you want from your phone agent.
+
+
+ See what people are building on Bland and get support from other users.
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/add_global_prompt.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/add_global_prompt.png
new file mode 100644
index 00000000000..87a1b9d09d4
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/add_global_prompt.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/batchcalls.jpg b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/batchcalls.jpg
new file mode 100644
index 00000000000..bec46d668b1
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/batchcalls.jpg differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/condition_eg.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/condition_eg.png
new file mode 100644
index 00000000000..db7e9f8302a
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/condition_eg.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/custom-tools.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/custom-tools.mdx
new file mode 100644
index 00000000000..6e139477fc2
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/custom-tools.mdx
@@ -0,0 +1,317 @@
+---
+title: Custom Tools
+subtitle: Interact with the real world mid-call using custom tools.
+slug: tutorials/custom-tools
+---
+
+
+## Introduction
+
+Custom tools allow your agent to interact with any web API mid-call. Do things like:
+
+
+
+ Dispatch SMS or emails using the person's contact info.
+
+
+ Set appointments using live calendar availability.
+
+
+ Generate support tickets in your issue tracker.
+
+
+ Update your CRM with relevant details during the call.
+
+
+
+## Background
+
+To understand how custom tools work, let's take a peek under the hood of the Bland AI phone agent.
+
+During the conversation, the phone agent is constantly listening to figure out when it's supposed to respond. When the phone agent realizes it's time to respond, it reviews the tools in its toolbox and picks between them.
+
+Those tools include a `speak`, `wait`, and `button press` tool. When you create a custom tool, you add it to the existing 'toolbox' for the phone agent to pick from.
+
+A few natural questions arise:
+
+1. How do I define my custom tool?
+2. How do I make sure my tool gets picked at the right time?
+3. How does information from the call get passed to my custom tool's API request?
+4. How do I fill the silence (when my custom tool is running)?
+5. How does the response from my custom tool get added to the call?
+
+Keep reading to find out.
+
+# Creating your custom tool
+
+## Defining the API request
+
+Imagine you're creating an AI phone agent to take restaurant orders. You want your phone agent to have the ability to place orders, by pinging your backend API.
+
+Here's what that request might look like:
+
+```json
+{
+ "method": "POST",
+ "url": "https://api.your-restaurant.com/orders",
+ "headers": {
+ "Content-Type": "application/json",
+ "Authorization": "Bearer YOUR_API_KEY"
+ },
+ "body": {
+ "items": [
+ {
+ "name": "burger",
+ "patties": 2,
+ "quantity": 1
+ },
+ {
+ "name": "fry",
+ "size": "lg",
+ "quantity": 1
+ }
+ ]
+ }
+}
+```
+
+## From API request to custom tool
+
+The next step is to convert the API request into a custom tool. Custom tools have the following properties:
+
+- `name` - the agent will see this in the list of tools
+- `description` - a short explanation of what the tool does
+- `input_schema` - a JSON schema describing the input data
+- `speech` (optional) - a string that will be spoken to the agent while your tool waits for a response
+- `response_data` - An array of objects that describe how to extract data from the response. Within the response data, you can create variables that the phone agent can reference in its prompt.
+
+### Name & Description
+
+The agent will see the name in the list of tools. The name, plus the description, help the AI phone agent when it decides which tool to use.
+
+For this example we'll set the name to `PlaceOrder`, and the description to `Places the final order for the drive thru`.
+
+### Input Schema
+
+The input schema is critical. It defines the shape of the API request, the different inputs the request can take, and also includes an example (which helps our system when creating requests).
+
+Here's what the input schema could look like:
+
+```json
+"input_schema": {
+ "example": {
+ "items": [
+ {
+ "name": "burger",
+ "patties": 2,
+ "quantity": 3
+ },
+ {
+ "name": "fry",
+ "size": "lg",
+ "quantity": 2
+ }
+ ]
+ },
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "patties": {
+ "type": "integer"
+ },
+ "size": {
+ "type": "string",
+ "enum": [
+ "sm",
+ "md",
+ "lg"
+ ]
+ },
+ "flavor": {
+ "type": "string",
+ "enum": [
+ "chocolate",
+ "strawberry",
+ "vanilla"
+ ],
+ "default": "vanilla"
+ },
+ "quantity": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "name",
+ "quantity"
+ ]
+ }
+ }
+ }
+}
+```
+
+Two important notes about input schema:
+
+1. `input_schema` is converted into the variable `"{{input}}"` that you can use in the request body/query/headers
+2. To access nested properties, use dot notation: `"{{input.property.subproperty}}"`
+
+Scroll down to see the full example.
+
+### Speech
+
+Because requesting external APIs might take a while, we enable you to define a `speech` property. The phone agent will say the `speech` while it makes the request.
+
+An example speech might look like: `Perfect, I'll schedule that right now, give me just a second.`
+
+For the restaurant ordering example, the speech could be `Thank you, placing that order now.`
+
+### Response data
+
+Once your API request comes back, you need to extract the response data, and then make the phone agent aware of the new information.
+
+The `data` field determines how you extract the data while the `name` field determines the variable name for reference in the prompt.
+
+Here's an example response data:
+
+```json
+"response_data": [
+ {
+ "name": "order_price",
+ "data": "$.price"
+ }
+]
+```
+
+## Full example
+
+Below is the entire API request for sending a phone call using the outlined custom tool:
+
+```json
+{
+ "phone_number": "...",
+ // note that the returned value ({{order_price}}) in the task is populated only after the tool is run
+ "task": "You are taking a drive thru order from a customer. Find out everything that they want like a drive thru cashier. Continue until they say they're done. Repeat the full order back to them after that, and ask if that's correct. If they confirm that it's correct, then and only then will you place their order using the PlaceOrder tool. After you place it, tell them their order total and to pull forward. Their order price is {{order_price}}",
+ "first_sentence": "Hi, what can I get started for you today?",
+ "request_data": {
+ "menu": {
+ "burger": ["patties"],
+ "fry": ["size"],
+ "shake": ["flavor", "size"]
+ }
+ },
+ "tools": [
+ {
+ "name": "PlaceOrder",
+ "description": "Places the final order for the drive thru.",
+ "speech": "Thank you, placing that order now.",
+ "input_schema": {
+ "example": {
+ "items": [
+ {
+ "name": "burger",
+ "patties": 2,
+ "quantity": 3
+ },
+ {
+ "name": "fry",
+ "size": "lg",
+ "quantity": 2
+ }
+ ]
+ },
+ "type": "object",
+ "properties": {
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "patties": {
+ "type": "integer"
+ },
+ "size": {
+ "type": "string",
+ "enum": ["sm", "md", "lg"]
+ },
+ "flavor": {
+ "type": "string",
+ "enum": ["chocolate", "strawberry", "vanilla"],
+ "default": "vanilla"
+ },
+ "quantity": {
+ "type": "integer"
+ }
+ },
+ "required": ["name", "quantity"]
+ }
+ }
+ }
+ },
+ "url": "https://api.your-restaurant.com/orders",
+ "method": "POST",
+ "headers": {
+ "Content-Type": "application/json",
+ "Authorization": "Bearer ..."
+ },
+ "body": {
+ "items": "{{input.items}}"
+ },
+ "response_data": [
+ {
+ "name": "order_price",
+ "data": "$.price"
+ }
+ ]
+ }
+ ]
+}
+```
+
+# Frequently asked questions
+
+
+
+ The phone agent refers to the input schema and the `example` within it. Both of those pieces of information provide context about what data to pass.
+
+ Then the phone agent extracts the information from the transcript and passes it to the request body.
+
+ You can improve the accuracy of the input data by creating a very clear `input_schema`. That includes providing a detailed `example` within.
+
+
+
+{" "}
+
+
+ The phone agent looks at the tool's name and description. Then it looks at the current context of the conversation to
+ decide whether using the tool makes sense.
+
+
+
+ When the API response from the custom tool comes back, you can extract the API response and create variables. You can do this within the `response_data` property.
+
+ Once you've given the variable a `name`, you can reference it in the prompt using double brackets (`{{}}`).
+
+ Note, with the current setup, you might reference variables that have null values. Here's the restaurant example prompt:
+
+ You are taking a drive thru order from a customer. Find out everything that they want like a drive thru cashier. Continue until they say they're done. Repeat the full order back to them after that, and ask if that's correct. If they confirm that it's correct, then and only then will you place their order using the PlaceOrder tool. After you place it, tell them their order total and to pull forward. Their order price is `{{order_price}}`
+
+ In the above prompt, the `order_price` will be null until the data comes back. That's okay though. The prompt is structured to first take the order, then use the PlaceOrder tool, and then finally respond with the order price.
+
+ By the time the phone agent is asked for the order price, it will have the information.
+
+ Custom tools will continue getting more robust, to further prevent scenarios where variables without value from being referenced in prompts.
+
+
+
+
+If you have any additional questions, reach out at hello@bland.ai and one of our engineers will help.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/default_node.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/default_node.png
new file mode 100644
index 00000000000..a40ca317443
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/default_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/dynamic-data.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/dynamic-data.mdx
new file mode 100644
index 00000000000..c05acc573af
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/dynamic-data.mdx
@@ -0,0 +1,270 @@
+---
+title: Dynamic Data
+subtitle: Interact with the real world by connecting your agent to external APIs.
+slug: tutorials/dynamic-data
+---
+
+
+## Introduction
+
+With Dynamic Data, you can make external API requests at the start and throughout your phone call. This allows you to load data from your database, or from any other API. You can then use that data in your AI responses, or to define circumstantial behavior for each call.
+
+Some examples of what Dynamic Data enables:
+
+- Maintain conversation history between calls
+- Define behavior based on the user's location
+- Handle real-time data like status updates or prices
+
+
+
+Here's how to make an [Inbound Agent](/api-v1/post/inbound-number-update) remember past conversations they've had with callers. There's a lot of other useful information we can integrate, like how long ago that call occurred and the call's duration.
+
+`Endpoint: POST https://api.bland.ai/v1/inbound/<>`
+
+```json
+{
+ "prompt": "You're a service agent working on behalf of Bland AI...",
+ "dynamic_data": [
+ {
+ // First, retrieve the previous call's data
+ "url": "https://api.bland.ai/v1/calls",
+ "method": "GET",
+ "headers": {
+ "authorization": <>
+ },
+ "query": {
+ // These parameters narrow down the search and will make the request faster
+ // as well as easier to understand during later analysis.
+ "from_number": "{{phone_number}}",
+ "from": 1, // Offset by 1 to exclude the current call
+ "limit": 1
+ },
+ "response_data": [
+ {
+ // These are the variables you're defining
+ "name": "previous_call_id",
+ // And the path to the data you want to extract
+ "data": "$.calls[0].c_id"
+ },
+ {
+ "name": "previous_call_time",
+ "data": "$.calls[0].created_at"
+ },
+ {
+ "name": "previous_call_duration_minutes",
+ "data": "$.calls[0].call_length"
+ }
+ ]
+ },
+ {
+ // Once we have the previous call's ID, we can retrieve the transcript
+ // Note the variable used in the URL
+ "url": "https://api.bland.ai/v1/calls/{{previous_call_id}}",
+ "method": "GET",
+ "headers": {
+ "authorization": <>
+ },
+ "response_data": [
+ {
+ "name": "previous_conversation",
+ "data": "$.concatenated_transcript",
+ // The context parameter elaborates on the variable's purpose and use
+ "context": "Your previous conversation with this person (if it exists): {{previous_conversation}}"
+ }
+ ]
+ },
+ {
+ // Helpful tip for debugging:
+ // You can send the data to a webhook to see what it looks like
+ "url": "https://webhook.site/...",
+ "method": "POST",
+ // Setting cache to false means you'll be able to see the data change in real-time
+ "cache": false,
+ "body": {
+ // And here's the data we're sending
+ "call_id": "{{call_id}}",
+ "prev_call_id": "{{previous_call_id}}",
+ "now": "{{now}}",
+ "previous_call_time": "{{previous_call_time}}",
+ "previous_conversation": "{{previous_conversation}}"
+ }
+ // Additional note:
+ // Since no response_data is defined, latency isn't affected by this request
+ }
+ ]
+}
+```
+
+
+
+We'll cover the following features in this section:
+
+- System variables
+- External API requests
+- Extracting data from responses
+- Variables as parameters
+- Chaining requests
+
+## System Variables
+
+Variables are defined with double curly braces, like `{{variable}}`. System variables are predefined variables that are available in every AI phone call. You can use them to access information about the current call, like the user's phone number or the current time.
+
+Note: Variables are NOT case sensitive, and outer spaces are trimmed automatically.
+
+Base variables:
+
+- `{{phone_number}}` - Always the other party's number
+- `{{country}}` - The country code (ex. US)
+- `{{state}}` - The state or province's abbreviation (ex. CA for California)
+- `{{city}}` - The full city name, capitalized
+- `{{zip}}` - The zip code
+- `{{call_id}}` - The unique ID of the current call
+- `{{now}}`
+- `{{now_utc}}`
+- `{{from}}` - The outbound number in E.164 format
+- `{{to}}` - The inbound number in E.164 format
+- `{{short_from}}` - outbound number with country code removed
+- `{{short_to}}` - inbound number with country code removed
+
+Variables can be used mid-sentence, like this:
+
+```json
+{
+ "task": "... Today is {{now}} ..."
+}
+```
+
+## External API Requests
+
+External API requests are defined in the `dynamic_data` parameter of your call request or inbound agent configuration. The `dynamic_data` parameter is an array of objects, where each object represents an API request.
+
+Here's a simple request that can be used to load public data about the current price of Bitcoin, then store it in a variable called `{{bitcoin_price}}`:
+
+```json
+{
+ "dynamic_data": [
+ {
+ "url": "https://api.coindesk.com/v1/bpi/currentprice.json"
+ "response_data": [
+ {
+ "name": "bitcoin_price",
+ "data": "$.bpi.USD.rate",
+ "context": "Current price of Bitcoin in USD is ${{bitcoin_price}}"
+ }
+ ]
+ }
+ ]
+}
+```
+
+
+ - `timeout` - The maximum number of milliseconds to wait for a response. - Default: `2000` - `method` - The HTTP
+ method to use. - Defaults to `GET`, otherwise `POST` is allowed. - `headers` - An object of headers to send with the
+ request. - `body` - The body of the request. Only used if `method` is `POST`. - `response_data` - An array of objects
+ that define how to extract data from the response. - See the next section for more details. - `cache` - Whether to
+ store the response, or refresh that data before each AI response. - Defaults to `true`.
+
+
+## Extracting Data from Responses
+
+Rather than using the full response, you can extract specific data from the response using the `data` parameter. The `data` parameter follows JSON structuring, using dot notation and array indices. For example, if the response is:
+
+```json
+{
+ "bpi": {
+ "USD": {
+ "code": "USD",
+ "rate": "9,000.00",
+ "description": "United States Dollar",
+ "rate_float": 9000
+ },
+ "GBP": {
+ "code": "GBP",
+ "rate": "6,000.00",
+ "description": "British Pound Sterling",
+ "rate_float": 6000
+ }
+ }
+}
+```
+
+Then `$.bpi.USD.rate` would return `9,000.00`.
+
+More complex filters can be used if they follow the [JSONPath format](https://docs.hevodata.com/sources/engg-analytics/streaming/rest-api/writing-jsonpath-expressions).
+
+## Variables as Parameters
+
+Once defined with `response_data`, variables can be used nearly anywhere.
+
+- In the `task` or `prompt` parameters
+- In the `context` parameter of `response_data`
+- In the `body`, `headers` and/or `query` parameter of each request
+
+Afterwards, in your webhooks and when retrieving call transcripts, the `variables` field will contain all variables that were defined during the call.
+
+By far, the easiest way to test out your `dynamic_data` configuration is via the [/dynamic_data/test](/api-reference/endpoint/dynamic_validate) endpoint. It returns the original configuration, every raw response, and the final variables after parsing is applied.
+
+## Chaining Requests
+
+Each request is executed in order, and variables defined in previous requests can be used in the next request. For example, if you want to retrieve information from your database or ours, then take additional actions with that data then you could do something like the following:
+
+For this example, imagine a delivery service that offers instant checkout for customers that have signed up to be a member. The first request retrieves their member_id from your database like so:
+
+```json
+{
+ "dynamic_data": [
+ {
+ "url": "https://api.restaurant.com/customers",
+ "method": "GET",
+ "headers": {
+ "authorization": "ExtremelySecureCredentials"
+ },
+ "query": {
+ "phone_number": "{{phone_number}}"
+ },
+ "response_data": [
+ {
+ "name": "member_id",
+ "data": "$.customer.member_id"
+ }
+ ]
+ }
+ //...
+ ]
+}
+```
+
+We just created that `{{member_id}}` variable - now we can use it in the next request.
+
+This delivery service also can be called to check on an order status.
+
+Note a difference: The `cache` parameter is set to `false`, so if the order status changes during the call, the agent will immediately know about it and be able to inform the customer.
+
+```json
+{
+ "dynamic_data": [
+ //...
+ {
+ "url": "https://api.restaurant.com/orders",
+ "method": "GET",
+ "cache": false,
+ "headers": {
+ "authorization": "ExtremelySecureCredentials"
+ },
+ "query": {
+ "member_id": "{{member_id}}"
+ },
+ "response_data": [
+ {
+ "name": "order_id",
+ "data": "$.orders[0].id"
+ },
+ {
+ "name": "order_status",
+ "data": "$.orders[0].status"
+ }
+ ]
+ }
+ ]
+}
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/end_node.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/end_node.png
new file mode 100644
index 00000000000..4a0c2d395d2
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/end_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/extract_variables.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/extract_variables.png
new file mode 100644
index 00000000000..14f1530e29f
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/extract_variables.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/final_pathway.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/final_pathway.png
new file mode 100644
index 00000000000..9f592f20658
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/final_pathway.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/finetune.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/finetune.png
new file mode 100644
index 00000000000..fc5d7d3f425
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/finetune.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/finetuned.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/finetuned.png
new file mode 100644
index 00000000000..de014643589
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/finetuned.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/global_eg.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/global_eg.png
new file mode 100644
index 00000000000..31436694447
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/global_eg.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/global_node.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/global_node.png
new file mode 100644
index 00000000000..40eb7a91fa9
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/global_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/inbound-number-webhook.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/inbound-number-webhook.png
new file mode 100644
index 00000000000..7b3b9e0d406
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/inbound-number-webhook.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/kb_node.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/kb_node.png
new file mode 100644
index 00000000000..d496d9cc009
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/kb_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/live-transfer.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/live-transfer.mdx
new file mode 100644
index 00000000000..148560aea01
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/live-transfer.mdx
@@ -0,0 +1,85 @@
+---
+title: Live transfer
+slug: tutorials/live-transfer
+---
+
+
+
+
+## Introduction
+
+Implementing live transfer in your AI-powered phone calls enhances flexibility and customer experience. This guide will explain how to set up a live transfer during a call using Bland AI.
+
+## Step 1: Understand Live Transfer
+
+Live transfer allows the AI agent to transfer the call to a human representative under certain conditions. This is crucial for scenarios where human intervention is preferred.
+
+## Step 2: Setup Your Authorization
+
+Before initiating a live transfer, ensure your API key is ready. Obtain your key from the [developer portal](https://app.bland.ai) if you haven't already.
+
+## Step 3: Configure the Transfer Settings
+
+Include the `transfer_phone_number` parameter in your call data. This is the number the AI will transfer to. Additionally, define the conditions for transfer in the task parameter.
+
+Example:
+
+```javascript
+{
+ "phone_number": "+11233456789",
+ "transfer_phone_number": "+19876543210",
+ "task": "If the caller requests to speak with a human, transfer the call to the representative."
+}
+```
+
+## Step 4: Send the API Request
+
+Make the API request using the JavaScript or Python code snippet provided, ensuring the `transfer_phone_number` and conditions are included.
+
+## Step 5: Test and Monitor
+
+After setting up the live transfer, test the functionality to ensure it works as expected. Monitor the calls to adjust the transfer conditions as necessary.
+
+## Conclusion
+
+Setting up a live transfer offers a seamless experience for situations where AI needs to hand over to a human. You're now ready to integrate this feature into your AI-powered calls with Bland AI.
+
+Maintain a balance between automated and human interactions to optimize customer satisfaction. Happy calling!
+
+
+
+```javascript LiveTransfer.js
+// Headers
+const headers = {
+ authorization: "YOUR-API-KEY-HERE",
+};
+
+// Data
+const data = {
+ phone_number: "+11233456789",
+ transfer_phone_number: "+19876543210",
+ task: "If the caller requests to speak with a human, transfer the call to the representative.",
+};
+
+// API request
+await axios.post("https://api.bland.ai/v1/calls", data, { headers });
+```
+
+```python LiveTransfer.py
+# Headers
+headers = {
+ 'authorization': 'YOUR-API-KEY-HERE'
+}
+
+# Data
+data = {
+ 'phone_number': '+11233456789',
+ 'transfer_phone_number': '+19876543210',
+ 'task': 'If the caller requests to speak with a human, transfer the call to the representative.'
+}
+
+# API request
+response = requests.post('https://api.bland.ai/v1/calls', json=data, headers=headers)
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/live_call_logs.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/live_call_logs.png
new file mode 100644
index 00000000000..bfa24e22ab4
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/live_call_logs.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/livetransfer.jpg b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/livetransfer.jpg
new file mode 100644
index 00000000000..63b16780d19
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/livetransfer.jpg differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/max-duration.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/max-duration.mdx
new file mode 100644
index 00000000000..73093001c72
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/max-duration.mdx
@@ -0,0 +1,87 @@
+---
+title: Setting max duration
+slug: tutorials/max-duration
+---
+
+
+
+
+## Introduction
+
+Controlling the length of your AI-powered phone calls is crucial for efficiency and cost-effectiveness. In this guide, we'll walk you through how to set a `max_duration` for your calls using Bland AI.
+
+## Step 1: Understand max_duration
+
+The `max_duration` parameter allows you to specify the longest duration you want your call to last, measured in minutes. Once the set duration is reached, the call will automatically end.
+
+## Step 2: Setup Your Authorization
+
+Ensure you have your API key ready for authentication. If you haven't obtained one, sign up on the [developer portal](app.bland.ai).
+
+## Step 3: Define max_duration in Your Call Data
+
+When preparing your call data, include the `max_duration` parameter. You can set it as a float or a string.
+
+Example values: `"30", "5.5", 45, 2.8`.
+
+Here’s how you might include it in your request data:
+
+```javascript
+{
+ "phone_number": "+11233456789",
+ "task": "Inquire about the latest product updates.",
+ "max_duration": "10", // Call lasts for 10 minutes max
+}
+```
+
+## Step 4: Send the API Request
+
+Use the provided JavaScript or Python code snippet to make the API request, ensuring you include the `max_duration` parameter.
+
+## Step 5: Test and Adjust
+
+After setting `max_duration`, test your calls to ensure they're ending at the desired time. Adjust as necessary based on your needs and feedback.
+
+## Conclusion
+
+Setting a `max_duration` for your calls ensures they are concise and to the point, saving time and resources. You're now ready to efficiently manage the length of your AI-powered calls with Bland AI.
+
+Remember, the key is to find the right balance between giving enough time for meaningful interaction and keeping the calls concise. Happy calling!
+
+
+
+```javascript SendCall.js
+// Headers
+const headers = {
+ authorization: "YOUR-API-KEY-HERE",
+};
+
+// Data
+const data = {
+ phone_number: "+11233456789",
+ task: "Inquire about the latest product updates.",
+ max_duration: "10", // Call lasts for 10 minutes max
+};
+
+// API request
+await axios.post("https://api.bland.ai/v1/calls", data, { headers });
+```
+
+```python SendCall.py
+# Headers
+headers = {
+ 'authorization': 'YOUR-API-KEY-HERE'
+}
+
+# Data
+data = {
+ 'phone_number': '+11233456789',
+ 'task': 'Inquire about the latest product updates.',
+ 'max_duration': '10', # Call lasts for 10 minutes max
+}
+
+# API request
+response = requests.post('https://api.bland.ai/v1/calls', json=data, headers=headers)
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/maxduration.jpg b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/maxduration.jpg
new file mode 100644
index 00000000000..648a1b301bb
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/maxduration.jpg differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/new_pathway.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/new_pathway.png
new file mode 100644
index 00000000000..e6255897d8d
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/new_pathway.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/node.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/node.png
new file mode 100644
index 00000000000..6bc933e0020
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathway_chat.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathway_chat.png
new file mode 100644
index 00000000000..9467b610533
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathway_chat.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathway_label.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathway_label.png
new file mode 100644
index 00000000000..1d7654a379a
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathway_label.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathwaylog_finetune.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathwaylog_finetune.png
new file mode 100644
index 00000000000..b6df97a0c05
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathwaylog_finetune.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathways.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathways.mdx
new file mode 100644
index 00000000000..d8876440ac8
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/pathways.mdx
@@ -0,0 +1,289 @@
+---
+title: Conversational Pathways
+subtitle: >-
+ Gain greater control over your AI agent and the conversational flow. [Create a
+ Pathway Now!](https://app.bland.ai/dashboard?page=convo-pathways)
+slug: tutorials/pathways
+---
+
+
+[Template Pathway Video Tutorial](https://www.loom.com/share/be9d6f1072ae4267abc0717e36e66078?sid=82a7843f-9e7c-457a-8f7b-4d8ca026e1ff)
+
+## Introduction
+
+Conversational pathways are our new way of prompting Bland that has led to major breakthroughs in realism.
+
+
+
+ Give your agent instructions on how it should respond at specific points of the conversation. Choose between
+ prompting or fixed sentences.
+
+
+ Execute webhooks at any point during the conversation, and send speech during/after the webhook.
+
+
+ Control when your agent ends the call
+
+
+ Connect your agent to a knowledge base, to answer any questions the user has.
+
+
+
+# Terminologies
+
+To understand how pathways work, let's first understand the terminologies.
+
+## Nodes
+
+These blocks you see here are called Nodes.
+
+
+
+## Pathways
+
+Each of these dotted lines is called a Pathway. Their start end end points are the `Purple Circles` on the top and bottom of the nodes.
+
+In order to create a pathway from a node, you would click on the purple circle at the bottom of the node and drag your mouse to connect to the top purple circle another node.
+
+Upon doing so, you will now have a new dotted line connecting the two nodes, with a 'New Pathway' button in the middle of the line.
+
+
+
+In order to instruct the agent when to take this pathway, you would click on the Edit icon on the 'New Pathway' button, and input the conditions for when the agent should take this pathway. In the above example, the agent would take this pathway if the user is not available to talk, so I labelled the pathway as 'not a good time to talk'.
+
+
+
+And there you have it! You have now created a pathway from one node to another, and instructed the agent when to take this pathway. You can connect as many nodes as you want in this manner, and create as many pathways as you want. In order to create a new Node, press the 'Add new Node' button at the top-left of the screen.
+
+# How the Pathways Agent Works
+
+The agent starts at the first node, and then moves to the next node based on the pathway that the agent decides to take. The agent will then execute the instructions in the node as dialogue, and then move on to the next node based on the pathway that the agent decides to take. This process will continue until the agent decides to end the call.
+
+The agent will make decisions based on the labels you put in the pathways, when connecting one node to another, and the dialogue generated will be based on the instructions you set in the nodes.
+
+
+
+For Example,
+
+In this example, at the node named 'Ask for reservation info', the node asks for the user's reservation information. Based on the user's response, the agent will then move on to the next node based on the labels you put in the pathways. For the current node, it will check if the user has provided reservation information where the number of guests is either less than 8 or more than 8. If the user has provided reservation information where the number of guests is less than 8, the agent will move on to the node named 'Reservation booking'. If the user has provided reservation information where the number of guests is more than 8, the agent will move on to the node named 'Transfer Call'. The agent will then execute the instructions in the node as dialogue, and then move on to the next node based on the pathway that the agent decides to take. And the process repeats!
+
+## Conditions
+
+Conditions are a way to provide the agent with a condition that must be met in order for the agent to move on to the next node. If the condition is not met, the agent will stay on the same node and ensure the condition is met until the condition is fulfilled.
+
+Using the same example above, I set the condition for the 'Ask for reservation info' node as follows - "You must get the date, time, and number of guests for this reservation". This means that the agent will stay on the 'Ask for reservation info' node until the user provides the date, time, and number of guests for the reservation. If the user says something else or deviates from the conversation, the agent will stay on the 'Ask for reservation info' node and prompt the user to provide the date, time, and number of guests for the reservation.
+
+This helps you to ensure that the user provides the necessary information before moving on to the next node, and helps you to control the flow of the conversation.
+
+
+
+## Global Nodes
+
+
+
+Global Nodes take precendence over the condition decisions made by the agent. You can treat a global node as a node, that every other node in the pathway has a pathway to, with the label as the 'Global Pathway Label'.
+
+Using the Reservation Booking Example, if the user were to ask a question like 'What are the opening hours of the restaurant' when the agent is at the 'Ask for reservation info' node, the condition decision would not be met as the user did not provide the date, time, and number of guests for the reservation. However, the pathway label would be 'user has a question about the restaurant's hours or location', which links to a Global Node. As Global Nodes take precedence over the condition decision, the agent would then move to the 'Global Node' named 'Restaurant Questions' and provide the user with the opening hours of the restaurant. After providing the user with the opening hours of the restaurant, the agent would then automatically return to the 'Ask for reservation info' node, and continue with the flow of the conversation.
+
+This helps you to handle edge cases where the user might ask a question that is not related to the current conversation, and allows you to provide the user with the information they need, before returning to the conversation.
+
+Tip: The variables `{{lastUserMessage}}` and `{{prevNodePrompt}}` can be used in the Global Node to provide the agent with context on what the user said, and steering the conversation back to its own original goal.
+
+
+You are to answer any questions the user has, to the best of your knowledge. If you do not know the answer, simply say 'I don't have that information at that moment'. Do not make up any information/facts about the appointment.
+
+After you answer the question, you are to direct the conversation back to your initial goal, which was as follows:
+
+Previous Goal:
+`{{prevNodePrompt}}`
+
+If you deem the goal as achieved, you can simply ask the user 'So, shall we proceed?' . If the goal has not been achieved, you are to steer the conversation back to achieve your goal.
+If you deem the goal as achieved, simply confirm the result with the user. If the goal has not been achieved, you are to steer the conversation back to achieve your goal.
+
+```
+Examples
+--
+assistant: what date works for you?
+user: what day is it today?
+assistant: The day today is April 15th. So, what date works for you?
+--
+
+--
+assistant: what date works for you?
+user: probably tomorrow, what time does the clinic open?
+assistant: The clinic opens at 9am. So, do you want to schedule for tomorrow?
+--
+```
+
+
+
+
+
+# Node Types
+
+There are currently 6 different types of Nodes
+
+- Default
+- Webhook
+- Knowledge Base
+- End Call
+- Transfer Call
+- Wait for Response
+
+You can select the type of node you want by clicking on the dropdown of `Node Type`.
+
+## Base/Default Node (Important!)
+
+The default node provides the ability to generate a response to the user. This functionality is exposed to all other nodes as well.
+
+You can either:
+
+- Use the `Prompt` field to give instructions on what the agent should do at this point in the conversation. This is the recommended way to generate responses as it makes the conversation more human and natural.
+- Enable the 'Static Text' toggle to provide a fixed response, and the agent will always say the same thing at this point in the conversation.
+
+
+
+### Optional Decision Guide
+
+The optional decision guide is only to be used if your phone agent currently is not going down the correct pathway. We do not expect this to happen often, but still want to provide you the tools to handle these issues if they arise.
+
+It is a way to provide the phone agent with example scenarios of what the user might say, and what pathway the agent should take in response.
+
+You would put in examples of what the user might say in the `User Input` field, and then in the `Pathway` field, you would provide the pathway the agent should take in response.
+
+### Condition
+
+The condition is a way to provide the agent with a condition that must be met in order for the agent to move on to the next node. If the condition is not met, the agent will stay on the same node and ensure the condition is met until the condition is fulfilled.
+
+### Global Nodes
+
+Each node can be configured to be a Global Node. Global Nodes are nodes that are accessible by every other node in the Conversational Pathway. This means that it has an implicit pathway to every other node, and the label would be the 'Global Label'.
+
+After entering a Global Node, the agent will execute the instructions inside the Global Node, and then automatically return to the node it was at before entering the Global Node, so it can continue with the flow of the conversation.
+
+In a Global Node, you can also forward the agent to another node, by toggling the 'Enable Forwarding', which will allow you to select the node you want to move the agent to. This is useful if you want to move the agent to a existing node for a certain scenario, which could happen at any point in the conversation.
+
+
+
+## Transfer Call Node
+
+The transfer call node is used to transfer the call to another number when the node is reached, and the dialogue at this node is complete.
+
+As such, you may have the agent say any final words before the call is transferred.
+
+
+
+## End Call Node
+
+The end call node will end the call when the node is reached, and the dialogue at this node is complete.
+
+As such, you may have the agent say any final words before the call is ended.
+
+
+
+## Knowledge Base Node
+
+The knowledge base node is used to connect your agent to a knowledge base, to answer any questions the user has.
+
+Paste in any text in the 'Knowledge Base' field, and the agent will search through the knowledge base to answer the user.
+
+Coming soon - PDF Upload/Vector Database Integrations...
+
+
+
+## Wait for Response Node
+
+The Wait for Response Node works the same way as the Default Node, except it is also equipped with the ability to wait if the user requires time to respond or needs to hold for a moment.
+
+## Webhook Node
+
+The webhook node is used to execute webhooks at any point during the conversation, and send speech during/after the webhook.
+
+`Webhook Information` is all you need in order to execute a webhook, and works the same way as Dynamic Data. Refer to the [Dynamic Data](https://docs.bland.ai/tutorials/dynamic-data) section for more information...
+
+Similar to how the dialogue is handled in all other nodes, you can control the dialogue sent before, and after the webhook is executed.
+
+Variables received from the webhook can be used in the dialogue as well, as shown in the example below.
+
+
+
+# Global Prompt for all Nodes
+
+The 'Add Global Prompt to All Nodes' feature is to assist in providing context/instructions to the agent for all nodes, without having to manually input the same prompt for each node. One Example of a Global Prompt could be to provide the agent with instructions on how to handle the call, the tone of voice to use, or answering any questions the user might have.
+
+
+
+# Live Call Logs
+
+The live call logs are a way to provide you with a live feed of the conversation between the agent and the user. This is useful for debugging purposes, and to see how the agent is responding to the user in real-time and the decisions the agent is making. On top of the transcript, we expose the updated node the agent took, the pathway that the agent took, as well as whether the condition was met or not.
+
+
+
+# Testing the Pathway Agent via Chat
+
+You can test the responses from your pathway agent by clicking on the 'Chat with Pathway' button at the top right of the screen. This will open a chat window where you can test the agent by sending messages to the agent, and see how the agent responds. The live call logs will also be displayed on the right side of the screen, so you can see the decisions the agent is making in real-time.
+
+
+
+# Variables Reference/ Extraction
+
+## Variables
+
+You can reference variables in pathways using double curly braces like `{{first_name}}`. You can pass variables into your call by passing in the key-value pairs in the `request_data` field when sending a call.
+
+Some examples of variables that you can access at each node:
+
+- `{{lastUserMessage}}` - The last response from the user
+- `{{prevNodePrompt}}` - The prompt from the previous node
+- `{{now_utc}}` - The current time in UTC
+- `{{from}}` - The phone number the call is from
+- `{{to}}` - The phone number the call is to
+- `{{call_id}}` - The unique identifier for the call
+
+## Extracting Variables from Call/User Response
+
+At each node, you can also extract variables from the user's response using the `Extract Variables from Call Info` field. You would put in the name of the variable you want to extract, the type of the variable (integer, string, boolean), and the description for what information you want the variable to store. You can also provide specific formats you expect and examples in the description. The more descriptive it is, the better the agent will be at extracting the variable more accurately.
+
+Do note that when enable variable extraction, and wanting to reference the variable in the subsequent nodes, it would introduce slight latency as the agent would have to extract the variable from the user's response before generating the dialogue for the next node.
+
+Within the webhook node, the variable extraction happens before the webhook is executed, so that you can reference the variables extracted from the user's response in the webhook's request data. The variables extracted from the webhook in `response_data` can also be referenced in the dialogue generated after the webhook is executed, in the same manner.
+
+For Example, the image below shows how the Webhook Node is set up to extract the date, time, and number of guests for the reservation, and how the extracted variables are referenced in the webhook's request data.
+
+
+
+# Fine Tuning the Pathway agent
+
+While Conversational Pathways gives you a lot greater control compared to the regular call agent, hallucinations can still occur, or the agent might make wrong decisions in the pathway. However, we have provided you with the tools to handle these issues if they arise. Each node can be fine-tuned on the decision it makes, as well as the expected dialogue it generates, allowing you to handle even the most extreme edge cases that might arise easily.
+
+### Steps to Fine-Tuning the agent
+
+Upon triggering and testing a call with your pathway using the 'Chat with Pathway' button, or sending a call, you will be able to see the live call logs.
+
+If you see a decision that the agent made that you do not agree with, or if the agent is hallucinating, you can fine-tune the decision the agent makes by clicking on the `Edit` button on the `PATHWAY DECISION INFO` block.
+
+
+
+Upon doing so, you will be able to see the decisions the agent made for the condition, the pathway it took, and the dialogue it generated. You can then fine-tune the agent by changing the dialogue, the condition, or the pathway the agent took.
+
+Upon saving your changes, you will be able to see the fine-tuning data in the node where the decision was made. This training data is used to train the agent to make better decisions in the future, and to ensure that the agent does not make the same mistake again.
+
+
+
+Do note that the decisions for the condition and pathway chosen is made by the node the agent is currently at, and the dialogue is generated by the node which the agent decides to take the pathway to.
+
+For Example,
+If the agent is at Node 1, and the agent decides that the condition is achieved, and decides to take the pathway to Node 2, the dialogue generated will be from Node 2, and the decisions for the condition and pathway chosen will be from Node 1. As such, the training data for the condition and pathway chosen will be stored in Node 1, and amendments to the dialogue generated will be stored in Node 2.
+
+
+
+# Quick Start with Tutorial / Templates
+
+To immediately start playing around with Conversational Pathways, you can use one of our templates. Visit the Conversational Pathways page on our Dev Portal, and duplicate the 'Restaurant Reservation' Template, and run through the agent to see how it works!
+We have also created a video walkthrough of that template to help you get started!
+
+[Video Walkthrough/Tutorial](https://www.loom.com/share/be9d6f1072ae4267abc0717e36e66078?sid=82a7843f-9e7c-457a-8f7b-4d8ca026e1ff)
+
+Create a pathway now! Click [here](https://app.bland.ai/dashboard?page=convo-pathways) to get started!
+
+If you have any additional questions, reach out on our [Discord](https://discord.gg/QvxDz8zcKe) and one of our engineers will help.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/send-1000-calls-at-once.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/send-1000-calls-at-once.mdx
new file mode 100644
index 00000000000..4ff9d56bb0c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/send-1000-calls-at-once.mdx
@@ -0,0 +1,116 @@
+---
+title: Send 1000 phone calls
+slug: tutorials/send-1000-calls-at-once
+---
+
+
+
+
+## Step 1: Setup Your Authorization
+
+To initiate a batch call, you must first authenticate your request. Ensure you have your API key from signing up on the [developer portal](https://app.bland.ai).
+
+## Step 2: Create the Base Prompt
+
+Craft a base prompt that will be common across all calls in the batch. Use placeholders `{{curly braces}}` for dynamic content.
+
+Example:
+
+```javascript
+"You are calling {{business}} to renew their subscription to {{service}} before it expires on {{date}}.";
+```
+
+## Step 3: Define the Call Data
+
+Specify the list of calls in the `call_data` array. Each call must have a `phone_number` and can include other properties corresponding to placeholders in your base prompt.
+
+Example:
+
+```javascript
+[
+ {
+ phone_number: "1234567890",
+ business: "ABC co.",
+ service: "Netflix",
+ date: "September 4th",
+ },
+ {
+ phone_number: "32176540987",
+ business: "XYZ inc.",
+ service: "Window Cleaning",
+ date: "December 20th",
+ },
+];
+```
+
+## Step 4: Additional Configuration
+
+- `label`: Assign a label to your batch for easy tracking.
+- `campaign_id`: Organize related batches under a campaign.
+- `test_mode`: Set to true for testing with the first call only.
+- `batch_id`: Manually set or auto-generated for tracking.
+- Voice and Language Settings: Select `voice_id`, `reduce_latency`, and `language`.
+- `request_data`: Include specific facts for the AI to know during the call.
+- `webook`: For real-time notifications and transcripts post-call.
+- `max_duration`: Define the maximum length of each call.
+- `amd`: Enable for navigating phone trees or leaving voicemails.
+- `wait_for_greeting`: Control if the AI speaks immediately or waits.
+
+## Step 5: Send the API Request
+
+Use the provided JavaScript or Python code snippet to make the API request.
+
+## Step 6: Handle the Response
+
+After sending the batch request, you'll receive a response with a `message` and the `batch_id`. Monitor the progress of your calls and any responses via your specified webhook.
+
+Here's what an example response might look like:
+
+```javascript
+{
+ "message": "success",
+ "batch_id": "3p$7rQ3p9sT5bzmF-gen-batch"
+}
+```
+
+## Step 7: Monitoring and Analytics
+
+Track the performance and outcomes of your batch calls through the provided `batch_id` and campaign analytics. Adjust future batches based on the insights gained.
+
+
+
+```javascript SendCalls.js
+// Headers
+const headers = {
+ authorization: "YOUR-API-KEY-HERE",
+};
+
+// Data
+const data = {
+ base_prompt: "You are calling {{business}} to renew their subscription to {{service}} before it expires on {{date}}.",
+ call_data: [
+ {
+ phone_number: "1234567890",
+ business: "ABC co.",
+ service: "Netflix",
+ date: "September 4th",
+ },
+ {
+ phone_number: "32176540987",
+ business: "XYZ inc.",
+ service: "Window Cleaning",
+ date: "December 20th",
+ },
+ ],
+ label: "Renewal Reminder - Wednesday Afternoon with female voice",
+ voice_id: 0,
+ max_duration: 10,
+ reduce_latency: true,
+ wait_for_greeting: true,
+};
+
+// API request
+await axios.post("https://api.bland.ai/v1/batches", data, { headers });
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/send-first-call.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/send-first-call.mdx
new file mode 100644
index 00000000000..a623083f6d4
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/send-first-call.mdx
@@ -0,0 +1,110 @@
+---
+title: Send your first phone call
+slug: tutorials/send-first-call
+---
+
+
+
+
+## Step 1: Setup Your Authorization
+
+Before making a call, you need to authenticate your request. Make sure you have your API key ready.
+
+Sign up on the [developer portal](https://app.bland.ai) to get yours.
+
+## Step 2: Prepare the Call Data
+
+You will need to provide specific details for the call. These include:
+
+- `phone_number`: The number you want to call. Remember to include the country code.
+- `task`: Describe the purpose of the call and how the AI should handle the conversation.
+- `voice_id`: Choose the voice persona (American male, Australian female, etc.) based on your preference.
+- Set parameters like `reduce_latency`, `record`, `amd` (for navigating phone trees), and `wait_for_greeting` according to your call's requirements.
+
+## Step 3: Customize the Call
+
+You can further personalize the call by:
+
+1. Setting a `first_sentence` for the call.
+2. Specifying `dynamic_data` to incorporate external API data.
+3. Adjusting `voice_settings` for stability, similarity, and speed.
+4. Choosing the language with the `language` parameter.
+5. Setting a `max_duration` for the call.
+
+## Step 4: Send the API Request
+
+Use the provided JavaScript or Python code snippet to make the API request.
+
+## Step 5: Handle the Response
+
+After the call, you will receive a response with the `status` and `call_id`. If you set `record` to true, you can retrieve the recording using the `/call/recording` endpoint.
+
+Here's what an example response might look like:
+
+```javascript
+{
+ "status": "success",
+ "call_id": "9d404c1b-6a23-4426-953a-a52c392ff8f1"
+}
+```
+
+## Step 6: Monitor the Call
+
+If you have set up a webhook, you will receive real-time notifications and transcripts once the call completes.
+
+And that's it! You're now ready to make your first AI-powered phone call with Bland AI. Happy calling!
+
+
+
+```javascript SendCall.js
+// Headers
+const headers = {
+ authorization: "YOUR-API-KEY-HERE",
+};
+
+// Data
+const data = {
+ phone_number: "+11233456789",
+ task: "You are calling Fantastic Airlines on behalf of John Doe. Find out where John's Bags are located.",
+ voice_id: 0,
+ language: "eng",
+ request_data: {
+ calling: "Fantastic Airlines",
+ bag_claim: "69683",
+ airline_code: "UA123",
+ },
+ record: true,
+ reduce_latency: true,
+ amd: true,
+};
+
+// API request
+await axios.post("https://api.bland.ai/v1/calls", data, { headers });
+```
+
+```python SendCall.py
+# Headers
+headers = {
+ 'authorization': 'YOUR-API-KEY-HERE'
+}
+
+# Data
+data = {
+ 'phone_number': '+11233456789',
+ 'task': "You are calling Fantastic Airlines on behalf of John Doe. Find the location of out where John's Bags are located.",
+ 'voice_id': 0,
+ 'request_data': {
+ 'calling': 'Fantastic Airlines',
+ 'bag_claim': '69683',
+ 'airline_code': 'UA123'
+ },
+ 'record': True,
+ 'reduce_latency': True,
+ 'amd': True
+}
+
+# API request
+response = requests.post('https://api.bland.ai/v1/calls', json=data, headers=headers)
+```
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/sendfirstcall.jpg b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/sendfirstcall.jpg
new file mode 100644
index 00000000000..a509bcd6f04
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/sendfirstcall.jpg differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/transfer_node.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/transfer_node.png
new file mode 100644
index 00000000000..dc3cf41c12d
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/transfer_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook-fires-successfully.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook-fires-successfully.png
new file mode 100644
index 00000000000..97ada0559b0
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook-fires-successfully.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook-signing.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook-signing.mdx
new file mode 100644
index 00000000000..83176a4885d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook-signing.mdx
@@ -0,0 +1,45 @@
+---
+title: Webhook Signing
+slug: tutorials/webhook-signing
+---
+
+
+Bland webhooks are signed with a secret key to ensure that they are not tampered with in transit and to confirm that they were sent by Bland.
+
+## Signing Webhooks
+
+When Bland sends a webhook, it calculates a signature using the HMAC algorithm with the SHA-256 hash function. The signature is then included in the `X-Webhook-Signature` header of the request.
+
+To create a webhook signing secret, first go to the [Account Settings in the Dev Portal](https://app.bland.ai/dashboard?page=settings) and click on the "Keys" tab.
+
+Here you can create a new secret by clicking "Replace Secret". It will only be shown once, so save it securely.
+
+## Verifying Webhooks
+
+To verify a webhook, you need to calculate the HMAC signature of the request body using the secret key and compare it to the signature in the `X-Webhook-Signature` header.
+
+Note that you must first create a webhook signing secret in the [Account Settings in the Dev Portal](https://app.bland.ai/dashboard?page=settings).
+
+Here is an example of how to verify a webhook in Node.js:
+
+```javascript
+const crypto = require("node:crypto");
+
+function verifyWebhookSignature(key, data, signature) {
+ const expectedSignature = crypto.createHmac("sha256", key).update(data).digest("hex");
+
+ return expectedSignature === signature;
+}
+
+//...
+
+app.post("/webhook", (req, res) => {
+ const isValid = verifyWebhookSignature(
+ process.env.WEBHOOK_SECRET,
+ JSON.stringify(req.body),
+ req.headers["x-webhook-signature"],
+ );
+
+ //...
+});
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook.png
new file mode 100644
index 00000000000..3791fac78a6
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook_node.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook_node.png
new file mode 100644
index 00000000000..dfeaa4cea5c
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhook_node.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhooks.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhooks.mdx
new file mode 100644
index 00000000000..b7d38677231
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/tutorials/webhooks.mdx
@@ -0,0 +1,51 @@
+---
+title: Webhooks
+slug: tutorials/webhooks
+---
+
+
+
+
+## Introduction
+
+This is a quick tutorial to help you set up and test your Bland AI webhook. We'll include instructions both for inbound and outbound phone calls.
+
+We'll start with inbound because it's more popular.
+
+## Step 1: Create your webhook
+
+To create a test webhook visit [Webhook.site](https://webhook.site/)
+
+The website will automatically provide you a unique webhook URL.
+
+## Step 2: Connect to your inbound phone number
+
+Open your [developer portal](https://app.bland.ai) and visit the [inbound phone numbers](https://app.bland.ai/home?page=inbound-number) page.
+
+
+
+Paste your webhook into the `webhook` field. Make sure to remove the initial `https://` when you insert the URL. Then click `test webhook`.
+
+## Step 3: Verifying your outputs
+
+Navigate to webhook.site page, and check if the test webhook fired correctly. You'll know it worked because a new record will populate.
+
+
+
+At this point, if your record fails to populate, double check that you provided the correct URL - and that you REMOVED the initial `https://` from it.
+
+Otherwise, if issues persist, jump into the [discord](https://discord.gg/QvxDz8zcKe) - one of our teammates will help you asap.
+
+## Step 4: test a live phone call
+
+Call your inbound phone number. Once it ends, visit the Webhook site and confirm once again that a new record populated.
+
+If that's working, then you're set!
+
+## Step 5: Testing for outbound calls
+
+To test for outbound calls, once again create your webhook by referring back to step 1.
+
+Then, follow the [send phone call docs](https://docs.bland.ai/api-v1/post/calls) to create and send a phone call. Make sure you include the `webhook` as a parameter in your request. After, confirm that the webhook data populated on your webhook site page.
+
+And again, if you encounter issues, jump into [discord](https://discord.gg/QvxDz8zcKe) and message us - we will help asap.
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/welcome-to-bland.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/welcome-to-bland.mdx
new file mode 100644
index 00000000000..f59fb9f6a14
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/bland/fern/welcome-to-bland.mdx
@@ -0,0 +1,53 @@
+---
+title: Welcome to Bland AI
+slug: welcome-to-bland
+---
+
+
+Bland is a platform for AI phone calling. Using our API, you can easily send or receive phone calls with a programmable voice agent.
+
+We really care about making our phone calls...
+
+1. **Fast**: sub-second latency from person speaking to AI responding.
+2. **Reliable**: it's our responsibility, day in and day out, to make sure your phone calls work. No exceptions.
+3. **Ultra flexible**: configure all aspects of your agent's behavior, by settings it's voice, creating transfer scenarios, configuring the initial greeting, etc.
+
+# What you can do with Bland
+
+
+
+ Dispatch AI phone calls to call customers, leads, and to streamline operations.
+
+
+ Create inbound phone numbers for customer support, etc.
+
+
+ Connect external APIs and take live actions during phone calls.
+
+
+ Extract JSON data to answer questions about your calls.
+
+
+ Simultaneously send thousands of calls at once.
+
+
+ Fine-tune a custom LLM using your enterprise' call recordings and transcripts.
+
+
+
+# Getting started
+
+
+
+ Read the API reference.
+
+
+ Learn to send your first phone call and test your agents.
+
+
+ Sign up on the developer portal.
+
+
+ Learn about enterprise features & meet with a member of the Bland AI team.
+
+
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/bank-transaction.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/bank-transaction.mdx
new file mode 100644
index 00000000000..b07e24324c6
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/bank-transaction.mdx
@@ -0,0 +1,137 @@
+---
+title: Bank Transaction object
+slug: api-reference/bank-transaction
+---
+
+Bank transactions are transactions that have occurred within a bank account owned by a business.
+
+### Attributes
+
+
+ Unique identifier for the bank transaction.
+
+
+ Unique ID of the bank transaction in your system for linking purposes. **Idempotency key.**
+
+
+ Resource type. Value will be "Bank_Transaction".
+
+
+ Id for the Business this transaction belongs to.
+
+
+ The source that the bank transaction was imported from.
+ Values can be: `UNIT`, `PLAID`, `API`
+
+
+ Unique ID of the bank transaction in its source system. **Idempotency key.**
+
+
+ Id of the source account in the source system.
+
+
+ Date the transaction occurred.
+
+
+ The direction of the transaction relative to the source account.
+ Values can be: `CREDIT`, `DEBIT`
+
+
+ The amount of the transaction in cents.
+
+
+ The name of the merchant or counterparty associated with the transaction.
+
+
+ Description of the transaction.
+
+
+ The type of bank account transaction.
+ Example values: `PURCHASE`, `BOOK`, `ATM`, `WIRE`, etc.
+
+
+ The status of the transaction's categorization in Layer's systems.
+ Values can be: `PENDING`, `READY_FOR_INPUT`, `CATEGORIZED`, `LAYER_REVIEW`
+
+
+ How the transaction was categorized.
+ Values can be: `SMS`, `API`, `LAYER_AUTO`, `LAYER_MANUAL`
+
+
+ The category assigned to the transaction. Only populated for transactions that have a finalized category.
+
+
+ String enum for the category assigned to the transaction. The set of category enums will vary based on chart of account configured for the business.
+
+
+ A human-readable string describing the category. This can be presented to the end user in your UI.
+
+
+
+
+ Layer's suggested categorization for the transaction.
+
+
+ The type of categorization approach used.
+
+
+ The category assigned to the transaction. Only populated for transactions that have a finalized category.
+
+
+ String enum for the category assigned to the transaction. The set of category enums will vary based on chart of account configured for the business.
+
+
+ A human-readable string describing the category. This can be presented to the end user in your UI.
+
+
+
+
+ Layer's list of suggested categories for the transaction.
+
+
+ String enum for the category assigned to the transaction. The set of category enums will vary based on chart of account configured for the business.
+
+
+ A human-readable string describing the category. This can be presented to the end user in your UI.
+
+
+
+
+
+
+
+
+
+
+```json Example
+{
+ "id":"67cee0d8-3b8e-4b4b-a857-78ce3bb1d895",
+ "type":"Bank_Transaction",
+ "transaction_type":"Purchase",
+ "business_id":"cfee5365-dcc3-425e-b403-cc9568f7121e",
+ "source":"API",
+ "source_transaction_id":"11111113",
+ "source_account_id":"111113",
+ "imported_at":"2023-06-07T00:42:08.664543Z",
+ "date":"2023-05-15T14:13:07Z",
+ "direction":"Debit",
+ "amount":8026,
+ "counterparty_name":"SUNOCO",
+ "description":null,
+ "categorization_status":"CATEGORIZED",
+ "category":{
+ "category":"FUEL",
+ "display_name":"Fuel"
+ },
+ "categorization_method":"LAYER_AUTO",
+ "categorization_flow":{
+ "type":"AUTO",
+ "category":{
+ "category":"FUEL",
+ "display_name":"Fuel"
+ }
+ }
+}
+```
+
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/business.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/business.mdx
new file mode 100644
index 00000000000..809650c9f29
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/business.mdx
@@ -0,0 +1,87 @@
+---
+title: Business object
+slug: api-reference/business
+---
+
+A Business is Layer’s representation of an end business on your platform. The Business object contains all the information about the business needed for Layer’s embedded accounting logic.
+
+### Attributes
+
+
+ Unique identifier for the business.
+
+
+ Resource type. Value will be "Business".
+
+
+ Unique ID of the business in your system for linking purposes. **Idempotency key.**
+
+
+ Legal name of the business as it has been registered.
+
+
+ Tax identification number of the business.
+
+
+ Two letter state abbreviation. (`AK`, `AL`, `AR`, etc.)
+
+
+ Entity type of the business. Used to determine tax filing status.
+ Values can be: `SOLE_PROP`, `C_CORP`, `LLC`, `S_CORP`, `PARTNERSHIP`
+
+
+ Phone number used for SMS based categorization.
+
+
+ List of unit accounts associated with this business.
+
+
+ The Unit account's ID
+
+
+
+
+ Plaid items linked to this account.
+
+
+ `item_id` returned by Plaid on the initial link.
+
+
+ `access_token` returned by Plaid on the initial link.
+
+
+
+
+ Time when the business entity was created in Layer. **Eligible sort key.**
+
+
+ Time when the business' information was last updated in Layer. **Eligible sort key.**
+
+
+
+
+
+```json Example
+{
+ "id": "863ed926-e30d-40f4-8e7e-b0d5387ce4fb",
+ "type": "Business",
+ "external_id": "test-acme-id",
+ "legal_name": "ACME LLC",
+ "tin": null,
+ "business_activity_code": null,
+ "us_state": "CA",
+ "entityType": "LLC",
+ "phone_number": "+16504651359",
+ "imported_at": "2023-06-15T22:12:05.467940Z",
+ "updated_at": "2023-06-15T22:12:05.467940Z",
+ "archived_at": null,
+ "unit_accounts": [
+ {
+ "id": "111111",
+ "imported_at": "2023-06-15T22:12:05.467940Z"
+ }
+ ]
+}
+```
+
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/invoice.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/invoice.mdx
new file mode 100644
index 00000000000..6ca1d18305d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/invoice.mdx
@@ -0,0 +1,263 @@
+---
+title: Invoice object
+slug: api-reference/invoice
+---
+
+
+An Invoice represents an invoice that a Business has collected for goods and services provided. Invoices are used to pass information about sales and accounts receivable into Layer.
+
+### Attributes
+
+
+ Unique identifier for the invoice.
+
+
+ Resource type. Value will be "Invoice".
+
+
+ Unique ID of the invoice in your system for linking purposes.
+
+
+ Id of the Business that generated the invoice.
+
+
+ Status of the invoice. Values can be: `PENDING`, `SENT`, `PARTIALLY_PAID`,
+ `PAID`, `VOIDED`
+
+
+ When the invoice was sent by the business to the recipient.
+
+
+ When the invoice is due.
+
+
+ When the invoice was paid.
+
+
+ When the invoice was voided. Voiding excludes the invoice from accounting.
+
+
+ Number for the invoice for display to end-users.
+
+
+ String description of the invoice recipient.
+
+
+ Line items making up the invoice.
+
+
+ Id of the invoice line item.
+
+
+ Id of the parent invoice
+
+
+ Description of the specific line item.
+
+
+ Reference to the product being sold.
+
+
+ Number of units sold.
+
+
+ The amount in cents of each unit.
+
+
+ Total discount given to this line item, in cents.
+
+
+
+
+
+ Ledger account associated with this tax.
+
+ Type of tax account object.
+
+
+ Name of the tax account, if a name was specified when this line item was created.
+
+
+ Id of the tax account if either an account ID was used to create the tax line item or if no tax account was specified.
+
+
+
+
+ Amount, in cents, of tax owed.
+
+
+
+
+ Total discount given to this line item, in cents.
+
+
+ Indicates this line item is a prepayment for future services, e.g. package deals, gift cards, etc.
+
+
+
+
+ Subtotal of all invoice line items in cents.
+
+
+ Additional discount applied to the whole invoice in addition to individual
+ line items.
+
+
+ Sum of all discount amounts across the invoice line items and any additional
+ discounts in cents.
+
+
+
+
+
+ Ledger account associated with this tax.
+
+ Type of tax account object.
+
+
+ Name of the tax account, if a name was specified when this line item was created.
+
+
+ Id of the tax account if either an account ID was used to create the tax line item or if no tax account was specified.
+
+
+
+
+ Amount, in cents, of tax owed.
+
+
+
+
+ Sum of all taxes across the invoice line items and any additional taxes in
+ cents.
+
+
+ Tips included by the buyer, in cents.
+
+
+ Total amount of the invoice in cents.
+
+
+ The remaining balance on the invoice after factoring in all previous invoice
+ payments.
+
+
+ The payments that have been made towards the balance of the invoice.
+
+
+ Id of the invoice payment.
+
+
+ External id for the payment within your platform. **Idempotency key.**
+
+
+ Method used to make the payment. Values can be: `CASH`, `CHECK`,
+ `CREDIT_CARD`, `ACH`, `REDEEMED_PREPAYMENT`, `OTHER`
+
+
+ Fee associated with processing a payment, e.g. credit card processing
+ fees, in cents.
+
+
+ When the buyer payment occurred.
+
+
+ When the invoice was imported into Layer.
+
+
+ Processor used to make the payment, if any.
+ Any processor name can be provided and will be tracked.
+ Supported processors (`STRIPE`, `SHOPIFY`) will have additional asset balance tracking.
+
+
+
+
+ Id of the invoice being paid.
+
+
+ Id of the invoice payment.
+
+
+ Amount paid towards this invoice in cents. Cannot exceed the amount of
+ the associated payment.
+
+
+
+
+
+
+ Time when the invoice was first imported into Layer. **Eligible sort key.**
+
+
+ Time when the invoice was last updated in Layer. **Eligible sort key.**
+
+
+
+```json Response
+{
+ "data": {
+ "type": "Invoice",
+ "id": "6d0c298f-3e4e-4538-9a71-1d5359c22f71",
+ "business_id": "83d8fb80-31ee-4d57-b684-44b4aaa5e01f",
+ "external_id": "019234",
+ "status": "SENT",
+ "sent_at": "2024-04-02T09:02:00Z",
+ "due_at": "2023-04-02T09:02:00Z",
+ "paid_at": null,
+ "voided_at": null,
+ "invoice_number": "1",
+ "recipient_name": "John Doe",
+ "line_items": [
+ {
+ "id": "e6a491dd-9c22-4403-a54f-32d741a7ec67",
+ "invoice_id": "6d0c298f-3e4e-4538-9a71-1d5359c22f71",
+ "account_identifier": null,
+ "description": null,
+ "product": "Cleaner Solution Pro",
+ "unit_price": 1299,
+ "quantity": "2.00",
+ "subtotal": 2598,
+ "discount_amount": 0,
+ "sales_taxes_total": 218,
+ "sales_taxes": [
+ {
+ "tax_account": {
+ "type": "Tax_Name",
+ "name": "CALIFORNIA_VAT"
+ },
+ "amount": 218
+ }
+ ],
+ "total_amount": 2816
+ },
+ {
+ "id": "44f06385-3ef5-4517-8095-eeedaf2054ab",
+ "invoice_id": "6d0c298f-3e4e-4538-9a71-1d5359c22f71",
+ "account_identifier": null,
+ "description": null,
+ "product": "Full drain cleaning service",
+ "unit_price": 25000,
+ "quantity": "1.00",
+ "subtotal": 25000,
+ "discount_amount": 0,
+ "sales_taxes_total": 0,
+ "total_amount": 25000
+ }
+ ],
+ "subtotal": 27598,
+ "additional_discount": 250,
+ "additional_sales_taxes_total": 0,
+ "tips": 0,
+ "total_amount": 27566,
+ "outstanding_balance": 27566,
+ "payment_allocations": [],
+ "imported_at": "2024-04-19T02:23:59.902537Z",
+ "updated_at": null,
+ "transaction_tags": []
+ }
+}
+```
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/ledger.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/ledger.mdx
new file mode 100644
index 00000000000..139f2498e3f
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/ledger.mdx
@@ -0,0 +1,239 @@
+---
+title: General Ledger objects
+slug: api-reference/ledger
+---
+
+The general ledger of a business on Layer’s platform. A general ledger is automatically created when a [Business](/api-reference/business/business) is created via the [Create a Business](/api-reference/business/create) endpoint.
+
+### Attributes
+
+
+ Resource type. Value will be "Chart_Of_Accounts".
+
+
+ Array of [Ledger Accounts](/api-reference/ledger#ledger-account-object) within the Ledger.
+
+
+#### Ledger Account object
+An account within the general ledger
+
+ Unique identifier of the ledger account.
+
+
+ Account name
+
+
+ Stable identifier for templated account.
+
+
+ Human readable description for this ledger account.
+
+
+ An array of [Ledger Account](/api-reference/ledger#ledger-account-object) objects representing child accounts of this ledger account.
+
+
+ Balance of the account, in cents.
+
+
+ Account balance normality.
+ Values can be: `DEBIT`, `CREDIT`
+
+
+ Array of [Ledger Account Line Item](/api-reference/ledger#ledger-account-line-item-object) objects representing ledger entries recorded in this account.
+
+
+#### Ledger Account Line Item object
+A ledger entry within a ledger account.
+
+ Unique identifier of the ledger account line item.
+
+
+ Id of the Journal entry the ledger account line item was part of.
+
+
+ Simplified [Ledger Account](/api-reference/ledger#ledger-account-object) object containing this line item.
+
+
+ Direction of line item.
+ Values can be: `DEBIT`, `CREDIT`
+
+
+ Timestamp of the financial transaction associted with the line item.
+
+
+ Timestamp when ledger entry was added to the ledger account.
+
+
+#### Journal Entry object
+A journal entry within the general ledger.
+
+ Unique identifier of the journal entry.
+
+
+ Id of the business associated with this journal entry.
+
+
+ Id of the general ledger containing this journal entry.
+
+
+ Entity that created the journal entry.
+
+
+ Type of entry.
+ Example values: `INVOICE_PAYMENT`, `EXPENSE`
+
+
+ Array of [Ledger Account Line Items](/api-reference/ledger#ledger-account-line-item-object) comprising the Journal Entry.
+
+
+
+
+```json Example
+{
+ "data":{
+ "type":"Chart_Of_Accounts",
+ "name":"Default",
+ "accounts":[
+ {
+ "id":"86b497b9-71e3-4353-9726-8b4a5ac46626",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Assets",
+ "accountStableName":"ASSETS",
+ "description":"All asset accounts for your business",
+ "subAccounts":[
+ {
+ "id":"b0b4f2ef-9c46-4ee4-87f6-3db37cad4d5d",
+ "number":0,
+ "pnlCategory":null,
+ "name":"JP Morgan Chase Business Checking (4402)",
+ "accountStableName":"UNIT_CHECKING",
+ "description":"Unit checking",
+ "normality":"DEBIT",
+ "balance":478018,
+ "selfOnlyBalance":478018,
+ "entries":[
+ {
+ "id":"63c52976-16a4-486a-86ab-00d2cc669e99",
+ "entry_id":"0e81ec02-483a-4ade-8878-b8e731e14c0f",
+ "account":{
+ "id":"b0b4f2ef-9c46-4ee4-87f6-3db37cad4d5d",
+ "name":"JP Morgan Chase Business Checking (4402)",
+ "stable_name":"UNIT_CHECKING",
+ "normality":"DEBIT",
+ "pnl_category":null,
+ "always_show_in_pnl":false,
+ "description":"Unit checking"
+ },
+ "amount":8531,
+ "direction":"CREDIT",
+ "entry_at":"2023-12-11T16:11:41.316Z",
+ "createdAt":"2023-12-11T16:11:43.875713Z"
+ },
+ {
+ "id":"91c7b1b6-5ab5-4b11-b39d-1adf33841f11",
+ "entry_id":"e9394916-91d2-4ddb-8bfe-bbc25bb7d9da",
+ "account":{
+ "id":"b0b4f2ef-9c46-4ee4-87f6-3db37cad4d5d",
+ "name":"JP Morgan Chase Business Checking (4402)",
+ "stable_name":"UNIT_CHECKING",
+ "normality":"DEBIT",
+ "pnl_category":null,
+ "always_show_in_pnl":false,
+ "description":"Unit checking"
+ },
+ "amount":540981,
+ "direction":"DEBIT",
+ "entry_at":"2023-12-11T16:11:41.316Z",
+ "createdAt":"2023-12-11T16:11:43.949003Z"
+ }
+ ]
+ },
+ {
+ "id":"bd68a8e3-fce4-4e7f-bee3-e7bd0f94627d",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Accounts Receivable",
+ "accountStableName":"ACCOUNTS_RECEIVABLE",
+ "description":"Amounts owed by clients",
+ "normality":"DEBIT",
+ "balance":140485,
+ "selfOnlyBalance":140485,
+ "entries":[
+ // Omitteed for length
+ ]
+ }
+ // Omitted for length
+ ],
+ "normality":"DEBIT",
+ "balance":618503,
+ "entries":[
+
+ ]
+ },
+ {
+ "id":"d138a41a-0ea4-4949-a3c2-28279936fda1",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Liabilities",
+ "accountStableName":"LIABILITIES",
+ "description":"All liabilities for your business",
+ "subAccounts":[
+ // Omitted for brefity
+ ],
+ "normality":"CREDIT",
+ "entries":[
+
+ ]
+ },
+ {
+ "id":"436a0187-1355-4e2d-978a-5ff4d52ad03f",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Equity",
+ "accountStableName":"EQUITY",
+ "description":"All equity accounts for your business",
+ "subAccounts":[
+ // Omitted for brefity
+ ],
+ "normality":"CREDIT",
+ "entries":[
+ ]
+ },
+ {
+ "id":"337ae99d-68a9-4ec2-b19d-4b8a5750f6b9",
+ "number":0,
+ "pnlCategory":"INCOME",
+ "name":"Revenue",
+ "accountStableName":"REVENUE",
+ "subAccounts":[
+ // Omitted for brefity
+ ],
+ "normality":"CREDIT",
+ "balance":678466,
+ "entries":[
+
+ ]
+ },
+ {
+ "id":"4f394bcb-e514-4ec9-bcd7-6612ebd146fe",
+ "number":0,
+ "pnlCategory":null,
+ "name":"Expenses",
+ "accountStableName":"EXPENSES",
+ "description":"Expenses",
+ "subAccounts":[
+ // Omitted for brefity
+ ],
+ "normality":"DEBIT",
+ "balance":65963,
+ "entries":[
+
+ ]
+ }
+ ]
+ }
+}
+```
+
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/payments.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/payments.mdx
new file mode 100644
index 00000000000..1d29c765e11
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/payments.mdx
@@ -0,0 +1,83 @@
+---
+title: Invoice Payment object
+slug: api-reference/payments
+---
+
+
+A refund represents a transaction that returns value to from a business to a customer. A specific payment can be refunded or a general refund can be applied to an invoice.
+
+### Attributes
+
+
+ Unique identifier for the payment.
+
+
+ Unique ID of the invoice payment in an external system for linking and
+ idempotency.
+
+
+ Timestamp when the payment was completed.
+
+
+ Payment method. Possible values are: `CASH`, `CHECK`, `CREDIT_CARD`, `ACH`,
+ `REDEEMED_PREPAYMENT`, `OTHER`
+
+
+ Fee paid by business for processing of payment in positive cents.
+
+
+ Customer payment amount, in cents.
+
+
+ Processor used to make the payment, if any.
+ Any processor name can be provided and will be tracked.
+ Supported processors (`STRIPE`, `SHOPIFY`) will have additional asset balance tracking.
+
+
+ Timestamp when the payment was imported into Layer.
+
+
+ Timestamp when the payment was imported into Layer.
+
+
+ Id of an invoice to which this payment is be applied.
+
+
+ Id of the payment this this allocationa applies from.
+
+
+ Customer payment amount, in cents.
+
+
+
+
+
+```json Response
+ {
+ "data": {
+ "type": "Payment",
+ "id": "e67c216b-28f4-4a0e-9a21-7f05c19e4c66",
+ "external_id": "payment-1",
+ "at": "2024-02-27T02:16:40.369432Z",
+ "method": "CREDIT_CARD",
+ "fee": 20,
+ "amount": 90,
+ "processor": "STRIPE",
+ "imported_at": "2024-02-27T02:16:40.389772Z",
+ "allocations": [
+ {
+ "invoice_id": "57f0fada-bb56-4f3e-9afa-2a222b68009e",
+ "payment_id": "e67c216b-28f4-4a0e-9a21-7f05c19e4c66",
+ "amount": 90,
+ "transaction_tags": []
+ }
+ ],
+ "transaction_tags": []
+ }
+ }
+ ```
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/plaid.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/plaid.mdx
new file mode 100644
index 00000000000..9d9618af213
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/plaid.mdx
@@ -0,0 +1,33 @@
+---
+title: Plaid Configuration object
+slug: api-reference/plaid
+---
+
+Layer uses Plaid to connect to pull information from your customers' external bank accounts and credit cards. The Plaid Configuration object allows you to manage the Plaid configuration associated with your Layer account.
+
+### Attributes
+
+
+ Resource type. Value will be: "Plaid_Configuration"
+
+
+ Account-wide client id.
+
+
+ Account-wide plaid secret. Only the last 4 characters will be displayed.
+
+
+
+
+
+```json Example
+{
+ "data":{
+ "type":"Plaid_Configuration",
+ "client_id":"6488fafd7a73ae00122004d6",
+ "secret_last_4":"acae"
+ }
+}
+```
+
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/pnl.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/pnl.mdx
new file mode 100644
index 00000000000..36483d4170c
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/pnl.mdx
@@ -0,0 +1,173 @@
+---
+title: Profit and Loss object
+slug: api-reference/pnl
+---
+
+A Profit and Loss object represents a profit and loss report that has been generated for a [Business](/api-reference/business/business).
+
+Profit and Loss reports are generated for a specific time range and only contain information for categorized transactions that have been journaled to the general ledger.
+
+### Attributes
+
+
+ Id of the Business the profit and loss report was generated for.
+
+
+ Resource type. Value will be "Profit_And_Loss"
+
+
+ Start date for data included in the report.
+
+
+ End date for data in cluded in the report.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing the income line items in the report.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing the cost of goods sold line items in the report.
+
+
+ Gross profit in cents. Calculated by subtracting total cost_of_sales line items from total income line items.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing the expense line items in the report.
+
+
+ Net profit before taxes in cents. Calculated by subtracting total expenses line items from gross_profit.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing the tax line items in the report.
+
+
+ Net profit in cents. Calculated by subtracting total taxes line items from profit_before_taxes
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing business outflow transactions that are not part of the profit and loss statement.
+
+
+ A [Line Item](/api-reference/pnl/pnl#lineitem-object) object representing personal expense transactions that are not part of the profit and loss statement.
+
+
+ A boolean representing whether all imported transactions within the report date range have been categorized. If FALSE, there are uncategorized transactions within the selected date range, indicating the provided report data may be incomplete.
+
+
+#### `Line Item` object
+
+ Enum name for the line item. Ex. "REVENUE"
+
+
+ Display name for the line item. Ex. "Revenue"
+
+
+ The value of the line item in cents.
+
+
+ An array of [Line Item](/api-reference/pnl/pnl#lineitem-object) objects representing child line items within the report section.
+
+
+
+```json Profit and Loss
+{
+ "data":{
+ "type":"Profit_And_Loss",
+ "business_id":"d2f6d97f-3345-4299-9ec2-468738c5d536",
+ "start_date":"2023-01-01T06:00:00Z",
+ "end_date":"2023-12-01T06:00:00Z",
+ "income":{
+ "name":"REVENUE",
+ "display_name":"Revenue",
+ "value":49397,
+ "line_items":[
+ {
+ "name":"SERVICES_REVENUE",
+ "display_name":"Service Revenue",
+ "value":46897,
+ "line_items":null
+ },
+ {
+ "name":"GOODS_REVENUE",
+ "display_name":"Sale of Goods Revenue",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"DISCOUNTS",
+ "display_name":"Discounts & Refunds",
+ "value":2500,
+ "line_items":null
+ }
+ ]
+ },
+ "cost_of_goods_sold":{
+ "name":"COGS",
+ "display_name":"Cost of Goods Sold",
+ "value":8026,
+ "line_items":[
+ {
+ "name":"JOB_SUPPLIES",
+ "display_name":"Job supplies",
+ "value":8026,
+ "line_items":null
+ }
+ ]
+ },
+ "gross_profit":41371,
+ "expenses":{
+ "name":"OPERATING_EXPENSES",
+ "display_name":"Operating Expenses",
+ "value":0,
+ "line_items":[
+ {
+ "name":"INSURANCE",
+ "display_name":"Insurance",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"RENT_EXPENSE",
+ "display_name":"Rent",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"UTILITIES",
+ "display_name":"Utilities",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"EQUIPMENT",
+ "display_name":"Equipment & Tools",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"ADVERTISING",
+ "display_name":"Advertising",
+ "value":0,
+ "line_items":null
+ },
+ {
+ "name":"VEHICLE_EXPENSES",
+ "display_name":"Vehicle Expenses",
+ "value":0,
+ "line_items":null
+ }
+ ]
+ },
+ "profit_before_taxes":41371,
+ "taxes":{
+ "name":"TAXES",
+ "display_name":"Taxes",
+ "value":0,
+ "line_items":null
+ },
+ "net_profit":41371,
+ "other_outflows":null,
+ "personal_expenses":null,
+ "fully_categorized":true
+ }
+}
+```
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/refunds.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/refunds.mdx
new file mode 100644
index 00000000000..3f8ef39911a
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/api-reference/refunds.mdx
@@ -0,0 +1,71 @@
+---
+title: Refunds object
+slug: api-reference/refunds
+---
+
+
+A refund represents a transaction that returns value to from a business to a customer. A specific payment can be refunded or a general refund can be applied to an invoice.
+
+### Attributes
+
+
+ Unique identifier for the refund.
+
+
+ Unique ID of the refund in your system for linking and idempotency.
+
+
+ Resource type. Value will be "Refund".
+
+
+ Timestamp when refund posted.
+
+
+ Amount of refund received by customer.
+
+
+ Fee, in cents, charged by payment processor for the refund.
+
+
+ Payment method. Possible values are: `CASH`, `CHECK`, `CREDIT_CARD`, `ACH`, `STORE_CREDIT`,
+ `OTHER`
+
+
+ Processor used to make the payment, if any.
+ Any processor name can be provided and will be tracked.
+ Supported processors (`STRIPE`, `SHOPIFY`) will have additional asset balance tracking.
+
+
+ Customer name of the recipient of the refund.
+ If invoice, line item, or payment ids are specified, they must match this recipient name.
+
+
+ Invoice ID this refund was applied to, if applicable.
+ This field does not need to be specified, but if `invoice_line_item_id` is also specified, it must belong to this invoice.
+
+
+ Invoice line item id specifying an exact product or service which was refunded.
+
+
+ Payment ID this refund was applied to, if applicable.
+
+
+
+```json Response
+ {
+ "data": {
+ "type": "Refund",
+ "id": "6195c7b0-acd6-4bcb-9417-57fabf5f772c",
+ "refunded_amount": 100,
+ "fee": 11,
+ "completed_at": "2024-03-25T01:46:59.309329Z",
+ "method": "STORE_CREDIT",
+ "processor": null,
+ "invoice_id": "905cbd23-db8a-4c9b-b5ea-05923eb88c23",
+ "invoice_line_item_id": "938cd7e1-0758-4965-96c1-724efd10825b",
+ "recipient_name": "John Doe"
+ },
+ "meta": {}
+ }
+ ```
+
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/authentication.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/authentication.mdx
new file mode 100644
index 00000000000..b7583a5f1fd
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/authentication.mdx
@@ -0,0 +1,48 @@
+---
+title: Authentication
+subtitle: Authenticating your calls to the Layer API
+slug: authentication
+---
+
+
+### Client credentials
+
+Layer uses OAuth2's client credentials flow to authenticate API clients. To start your development, we will give you a set of `client_id` and `client_secret` tokens.
+
+
+ To obtain a set of client credentials, reach out to our team [here](https://layerfi.com/#contact-form).
+
+
+
+### Getting a bearer token
+Calls to the Layer API require a bearer access token. To receive an access token and make calls to other API endpoints, provide your `client_id` and `client_secret` in the body of a POST request to Layer’s authorization server as shown below.
+
+```bash
+curl -X POST https://auth.layerfi.com/oauth2/token \
+ -u : \
+ -H "Content-Type: application/x-www-form-urlencoded" \
+ --data-urlencode "grant_type=client_credentials" \
+ --data-urlencode "scope=https://sandbox.layerfi.com/sandbox" \
+ --data-urlencode "client_id="
+```
+
+The authorization server will respond with your granted access token.
+
+```json
+{
+ "access_token": "",
+ "expires_in": 3600,
+ "token_type": "Bearer"
+}
+```
+
+### Making authenticated API calls
+
+Use the access token in requests to the API by including it as a Bearer token in the authorization header.
+
+```bash
+curl https://sandbox.layerfi.com/whoami \
+ -H "Authorization: Bearer "
+```
+
+Access tokens expire after 1 hour. To refresh your access token, make another call to Layer’s authorization endpoint with your `client_id` and `client_secret`. We recommend refreshing tokens for new sets of requests rather than persisting access tokens.
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/docs.yml b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/docs.yml
new file mode 100644
index 00000000000..e87d6815a29
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/docs.yml
@@ -0,0 +1,102 @@
+instances: []
+title: Layer
+favicon: favicon.png
+logo:
+ light: logo/layer_logo.svg
+ dark: logo/layer_logo.svg
+ href: http://layerfi.com
+ height: 28
+colors:
+ accentPrimary:
+ dark: '#0c48e5'
+ light: '#7e9be5'
+ background:
+ dark: '#090014'
+tabs:
+ api-reference:
+ slug: api-reference
+ displayName: API Reference
+ documentation:
+ displayName: Documentation
+ slug: documentation
+navigation:
+ - tab: api-reference
+ layout:
+ - section: Businesses
+ contents:
+ - page: Business object
+ path: api-reference/business.mdx
+ - section: Plaid Configuration
+ contents: []
+ - section: Financial Activities
+ contents:
+ - section: Transactions
+ contents:
+ - page: Bank Transaction object
+ path: api-reference/bank-transaction.mdx
+ - section: Payouts
+ contents: []
+ - section: Accounts Receivable
+ contents:
+ - section: Invoices
+ contents:
+ - page: Invoice object
+ path: api-reference/invoice.mdx
+ - section: Payments
+ contents:
+ - page: Invoice Payment object
+ path: api-reference/payments.mdx
+ - section: Refunds
+ contents:
+ - page: Refunds object
+ path: api-reference/refunds.mdx
+ - section: Reporting
+ contents:
+ - page: Profit and Loss object
+ path: api-reference/pnl.mdx
+ - section: General Ledger
+ contents:
+ - page: General Ledger objects
+ path: api-reference/ledger.mdx
+ - section: External Accounts
+ contents:
+ - section: Custom Accounts
+ contents: []
+ - section: Tags
+ contents: []
+ - section: Client Admin
+ contents:
+ - section: Configuration
+ contents:
+ - page: Plaid Configuration object
+ path: api-reference/plaid.mdx
+ - tab: documentation
+ layout:
+ - section: Get Started
+ contents:
+ - page: Overview
+ path: introduction.mdx
+ - page: Authentication
+ path: authentication.mdx
+ - page: Onboarding a Business
+ path: guides/business-onboarding.mdx
+ - section: Importing Financial Data
+ contents:
+ - page: Overview
+ path: guides/importing-data-overview.mdx
+ - page: Invoices and Payments
+ path: guides/importing-invoices.mdx
+ - page: Bank Accounts and Credit Cards
+ path: guides/importing-bank-transactions.mdx
+ - section: Offering Accounting
+ contents:
+ - page: Overview
+ path: guides/offering-accounting-overview.mdx
+ - page: Transaction Categorization
+ path: guides/transaction-categorization.mdx
+ - page: Accounting Reports
+ path: guides/reporting.mdx
+ - section: Embedded Components
+ contents:
+ - page: Overview
+ path: guides/embedded-components.mdx
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/favicon.png b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/favicon.png
new file mode 100644
index 00000000000..8ad52ae1e71
Binary files /dev/null and b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/favicon.png differ
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/fern.config.json b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/fern.config.json
new file mode 100644
index 00000000000..2e3e1df85fd
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/fern.config.json
@@ -0,0 +1,4 @@
+{
+ "version": "*",
+ "organization": "fern"
+}
\ No newline at end of file
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/guides/business-onboarding.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/guides/business-onboarding.mdx
new file mode 100644
index 00000000000..d3fbbe125f4
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/guides/business-onboarding.mdx
@@ -0,0 +1,63 @@
+---
+title: Onboarding a Business
+subtitle: Onboard one of your business customers to Layer
+slug: guides/business-onboarding
+---
+
+
+The first step when using Layer is to onboard your customer to Layer using the [Create a business](/api-reference/create-new-business) endpoint.
+
+This endpoint creates the record for your customer in Layer’s systems. There are many optional features, such as specifying external accounts connected via Plaid. The [Create a business](/api-reference/create-new-business) endpoint lists the full set of options.
+
+```bash Request
+curl -X POST https://sandbox.layerfi.com/v1/businesses \
+ -H "Authorization: Bearer " \
+ -H "Content-Type: application/json" \
+ -d '{
+ "external_id": "test-acme-id",
+ "legal_name": "ACME LLC",
+ "tin": null,
+ "us_state": "CA",
+ "entity_type": "LLC",
+ "phone_number": "+18005555555",
+ "unit_ids": [{"unit_id": "111111"}]
+ }'
+```
+
+
+### Plaid credentials
+If you've added Plaid credentials (see [Plaid Configuration](/api-reference/plaid)), link Plaid accounts by including Plaid item ids & access tokens in the `plaid_items` field.
+```json
+"plaid_items": [
+ { "item_id": "item-id-1", "access_token": "access_token_1" },
+ { "item_id": "item-id-3", "access_token": "access_token_3" }
+]
+```
+
+The Layer API will respond with the created [Business](/api-reference/business) object. Within the object will be a unique id, which you will use to make calls on behalf of the business in subsequent steps.
+
+```json Response
+{
+ "data": {
+ "id": "863ed926-e30d-40f4-8e7e-b0d5387ce4fb",
+ "type": "Business",
+ "external_id": "test-acme-id",
+ "legal_name": "ACME LLC",
+ "tin": null,
+ "business_activity_code": null,
+ "us_state": "CA",
+ "entityType": "LLC",
+ "phone_number": "+16504651359",
+ "imported_at": "2023-06-15T22:12:05.467940Z",
+ "updated_at": "2023-06-15T22:12:05.467940Z",
+ "archived_at": null,
+ "unit_accounts": [
+ {
+ "id": "111111",
+ "imported_at": "2023-06-15T22:12:05.467940Z"
+ }
+ ]
+ },
+ "meta": {}
+}
+```
diff --git a/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/guides/embedded-components.mdx b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/guides/embedded-components.mdx
new file mode 100644
index 00000000000..5fd195b943d
--- /dev/null
+++ b/packages/cli/docs-importers/mintlify/src/__test__/outputs/layerfi/fern/guides/embedded-components.mdx
@@ -0,0 +1,215 @@
+---
+title: Overview
+subtitle: Using Layer's prebuilt components to build bookkeeping directly into your app
+slug: guides/embedded-components
+---
+
+
+Layer publishes pre-built UI components to npm that can be dropped into any existing React app. These components handle all integration with Layer’s API with the exception of authentication, which must be done on your backend to avoid exposing credentials in your client-side apps.
+
+Currently available embedded components include:
+* Bank Transaction Review and Categorization
+* Profit & Loss Reports
+ * Month over month revenue & expense chart
+ * Monthly revenue & expense breakdowns
+ * Monthly expandable P&L table
+
+## React setup
+
+
+
+
+ The first step of using Layer's embedded components is to install the `layerfi/components` package via npm and your preferred package manager.
+
+ ```bash
+ npm install @layerfi/components --save
+ ```
+
+ ```bash
+ yarn install @layerfi/components
+ ```
+
+
+ Next, set up the `LayerProvider` context, which serves as the configuration for fetching data for an individual business. All individual UX components must be rendered within this context.
+
+ **For local testing**, you can use your Layer staging credentials (`APP_ID` and `APP_SECRET`).
+
+ ```tsx
+ import { LayerProvider } from "@layerfi/components";
+
+
+ {...}
+
+ ```
+
+ **In production**, you should use access tokens scoped to a specific business.
+ See the backend configuration section below for steps to retrieve scoped tokens:
+
+ ```tsx
+ import { LayerProvider } from "@layerfi/components";
+
+ '}
+ >
+ {...}
+
+ ```
+
+
+
+ **Option 1: Set primary colors in theme configuration**
+
+ You can set a dark and light theme color for all components.
+ We recommend starting with simple customization like this using rgb, hsl or hex colors.
+ ```tsx
+
+ {...}
+
+ ```
+
+ **Option 2: Customize CSS variables**
+
+ For more flexible customization, CSS variables are exposed to allow you to set colors and styles for the embedded components.
+ We recommend setting these variables within a scoped container to isolate the scope to Layer components.
+ In this example, we've set variables within the `.layer-container` class.
+
+
+ ```css
+ body .layer-container {
+ --color-black: #1a1a1a;
+ --color-white: white;
+ --color-neutral: #666666;
+ --color-neutral-50: #fafcfc;
+ --color-neutral-200: #eef0ef;
+ --color-neutral-700: #636665;
+ --color-red: #e46362;
+ --color-info-green: #29bc9b;
+
+ --color-primary: var(--color-black);
+ --color-accent: var(--color-white);
+ --color-secondary: var(--color-neutral);
+ --color-success: var(--color-info-green);
+ --color-danger: var(--color-red);
+ --text-color-primary: var(--color-black);
+ --text-color-secondary: var(--color-neutral-700);
+ --bg-element-focus: var(--color-neutral-50);
+
+ --font-family: "InterVariable", "Inter", sans-serif;
+ --font-family-numeric: "InterVariable", "Inter", sans-serif;
+ --text-sm: 12px;
+ --text-md: 14px;
+ --text-heading: 24px;
+ --font-weight-normal: 460;
+ --font-weight-bold: 580;
+ --spacing-sm: 12px;
+ --spacing-md: 16px;
+ --spacing-2xl: 36px;
+ --border-color: var(--color-neutral-200);
+ }
+ ```
+
+
+
+ Finally, add components to your pages as you would any React component.
+
+ ```tsx
+
+ ```
+
+ Some components have multiple sub components which can be optionally included for composition and layout customization.
+
+ ```tsx
+
+