# OpenAPI

## GET /api/v1/workspaces/{workspace}/openapi

Get attached OpenAPI spec status

**Auth:** bearerAuth

:::codesamples Code examples

```bash:curl
curl -X GET "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <token>"
```

```java:Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder()
        .uri(URI.create("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi"))
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .method("GET", HttpRequest.BodyPublishers.noBody())
        .build();

    var response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
  }
}
```

```python:Python
import urllib.request

url = "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
}
data = None
req = urllib.request.Request(url, data=data, headers=headers, method="GET")
with urllib.request.urlopen(req) as res:
    print(res.status)
    print(res.read().decode())
```

```typescript:TypeScript
const response = await fetch("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
  }
});

console.log(response.status);
console.log(await response.json());
```

```go:Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"time"
)

func main() {
	req, err := http.NewRequest("GET", "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer <token>")
	client := &http.Client{Timeout: 30 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	bodyBytes, err := io.ReadAll(io.LimitReader(res.Body, 10<<20))
	if err != nil {
		panic(err)
	}
	fmt.Println(res.StatusCode)
	fmt.Println(string(bodyBytes))
}
```

```rust:Rust
// cargo add reqwest --features blocking
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::blocking::Client::new();
    let response = client.request(reqwest::Method::GET, "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi")
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .send()?;

    println!("{}", response.status());
    println!("{}", response.text()?);
    Ok(())
}
```

:::

:::details open Parameters

| NAME | IN | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- | --- |
| `workspace` | path | string | yes | Workspace id, or - for the key's bound workspace |

:::

:::details open Responses

#### 200

Success

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `configured` | boolean | yes | - |
| `lastError` | string | no | - |
| `lastSyncedAt` | string (date-time) | no | - |
| `sourceType` | string | no | - |
| `sourceUrl` | string | no | - |
| `specTitle` | string | no | - |
| `specVersion` | string | no | - |
| `stats` | OpenAPISyncStats object | no | - |
| `updatedAt` | string (date-time) | no | - |

```json
{
  "configured": true,
  "lastError": "string",
  "lastSyncedAt": "string",
  "sourceType": "string",
  "sourceUrl": "string",
  "specTitle": "string",
  "specVersion": "string",
  "stats": {
    "created": 0,
    "deleted": 0,
    "unchanged": 0,
    "updated": 0
  },
  "updatedAt": "string"
}
```

#### 400

Bad request

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 401

Unauthorized

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 403

Forbidden

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 404

Not found

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 429

Rate limited

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

:::

## PUT /api/v1/workspaces/{workspace}/openapi

Attach an OpenAPI spec (by url or raw spec) and generate pages

**Auth:** bearerAuth

:::codesamples Code examples

```bash:curl
curl -X PUT "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  --data '{
  "spec": "string",
  "url": "string"
}'
```

```java:Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder()
        .uri(URI.create("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi"))
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .header("Content-Type", "application/json")
        .method("PUT", HttpRequest.BodyPublishers.ofString("{\n  \"spec\": \"string\",\n  \"url\": \"string\"\n}"))
        .build();

    var response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
  }
}
```

```python:Python
import urllib.request

url = "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json",
}
data = "{\n  \"spec\": \"string\",\n  \"url\": \"string\"\n}".encode("utf-8")
req = urllib.request.Request(url, data=data, headers=headers, method="PUT")
with urllib.request.urlopen(req) as res:
    print(res.status)
    print(res.read().decode())
```

```typescript:TypeScript
const response = await fetch("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi", {
  method: "PUT",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "spec": "string",
    "url": "string"
  })
});

console.log(response.status);
console.log(await response.json());
```

```go:Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
	"time"
)

func main() {
	body := strings.NewReader(`{
  "spec": "string",
  "url": "string"
}`)
	req, err := http.NewRequest("PUT", "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	client := &http.Client{Timeout: 30 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	bodyBytes, err := io.ReadAll(io.LimitReader(res.Body, 10<<20))
	if err != nil {
		panic(err)
	}
	fmt.Println(res.StatusCode)
	fmt.Println(string(bodyBytes))
}
```

```rust:Rust
// cargo add reqwest --features blocking
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::blocking::Client::new();
    let response = client.request(reqwest::Method::PUT, "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi")
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .header("Content-Type", "application/json")
        .body("{\n  \"spec\": \"string\",\n  \"url\": \"string\"\n}")
        .send()?;

    println!("{}", response.status());
    println!("{}", response.text()?);
    Ok(())
}
```

:::

:::details open Parameters

| NAME | IN | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- | --- |
| `workspace` | path | string | yes | Workspace id, or - for the key's bound workspace |

:::

:::details open Request Body

Required: yes

#### application/json

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `spec` | string | yes | - |
| `url` | string | yes | - |

```json
{
  "spec": "string",
  "url": "string"
}
```

:::

:::details open Responses

#### 200

Success

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `configured` | boolean | yes | - |
| `lastError` | string | no | - |
| `lastSyncedAt` | string (date-time) | no | - |
| `sourceType` | string | no | - |
| `sourceUrl` | string | no | - |
| `specTitle` | string | no | - |
| `specVersion` | string | no | - |
| `stats` | OpenAPISyncStats object | no | - |
| `updatedAt` | string (date-time) | no | - |

```json
{
  "configured": true,
  "lastError": "string",
  "lastSyncedAt": "string",
  "sourceType": "string",
  "sourceUrl": "string",
  "specTitle": "string",
  "specVersion": "string",
  "stats": {
    "created": 0,
    "deleted": 0,
    "unchanged": 0,
    "updated": 0
  },
  "updatedAt": "string"
}
```

#### 400

Bad request

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 401

Unauthorized

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 403

Forbidden

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 404

Not found

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 429

Rate limited

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

:::

## DELETE /api/v1/workspaces/{workspace}/openapi

Detach the OpenAPI spec (generated pages become editable)

**Auth:** bearerAuth

:::codesamples Code examples

```bash:curl
curl -X DELETE "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <token>"
```

```java:Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder()
        .uri(URI.create("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi"))
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .method("DELETE", HttpRequest.BodyPublishers.noBody())
        .build();

    var response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
  }
}
```

```python:Python
import urllib.request

url = "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
}
data = None
req = urllib.request.Request(url, data=data, headers=headers, method="DELETE")
with urllib.request.urlopen(req) as res:
    print(res.status)
    print(res.read().decode())
```

```typescript:TypeScript
const response = await fetch("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
  }
});

console.log(response.status);
console.log(await response.json());
```

```go:Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"time"
)

func main() {
	req, err := http.NewRequest("DELETE", "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer <token>")
	client := &http.Client{Timeout: 30 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	bodyBytes, err := io.ReadAll(io.LimitReader(res.Body, 10<<20))
	if err != nil {
		panic(err)
	}
	fmt.Println(res.StatusCode)
	fmt.Println(string(bodyBytes))
}
```

```rust:Rust
// cargo add reqwest --features blocking
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::blocking::Client::new();
    let response = client.request(reqwest::Method::DELETE, "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi")
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .send()?;

    println!("{}", response.status());
    println!("{}", response.text()?);
    Ok(())
}
```

:::

:::details open Parameters

| NAME | IN | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- | --- |
| `workspace` | path | string | yes | Workspace id, or - for the key's bound workspace |

:::

:::details open Responses

#### 200

Success

#### 400

Bad request

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 401

Unauthorized

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 403

Forbidden

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 404

Not found

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 429

Rate limited

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

:::

## GET /api/v1/workspaces/{workspace}/openapi/pages

List generated OpenAPI pages and their sections

**Auth:** bearerAuth

:::codesamples Code examples

```bash:curl
curl -X GET "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <token>"
```

```java:Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder()
        .uri(URI.create("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages"))
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .method("GET", HttpRequest.BodyPublishers.noBody())
        .build();

    var response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
  }
}
```

```python:Python
import urllib.request

url = "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
}
data = None
req = urllib.request.Request(url, data=data, headers=headers, method="GET")
with urllib.request.urlopen(req) as res:
    print(res.status)
    print(res.read().decode())
```

```typescript:TypeScript
const response = await fetch("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
  }
});

console.log(response.status);
console.log(await response.json());
```

```go:Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"time"
)

func main() {
	req, err := http.NewRequest("GET", "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer <token>")
	client := &http.Client{Timeout: 30 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	bodyBytes, err := io.ReadAll(io.LimitReader(res.Body, 10<<20))
	if err != nil {
		panic(err)
	}
	fmt.Println(res.StatusCode)
	fmt.Println(string(bodyBytes))
}
```

```rust:Rust
// cargo add reqwest --features blocking
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::blocking::Client::new();
    let response = client.request(reqwest::Method::GET, "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages")
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .send()?;

    println!("{}", response.status());
    println!("{}", response.text()?);
    Ok(())
}
```

:::

:::details open Parameters

| NAME | IN | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- | --- |
| `workspace` | path | string | yes | Workspace id, or - for the key's bound workspace |

:::

:::details open Responses

#### 200

Success

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `pages` | array items: OpenAPIPageRow object | yes | - |
| `sections` | array items: NavGroup object | yes | - |

```json
{
  "pages": [
    {
      "isFolder": true,
      "level": 0,
      "method": "string",
      "nav": "string",
      "ref": "string",
      "section": "string",
      "slug": "string",
      "sort": 0,
      "title": "string"
    }
  ],
  "sections": [
    {
      "key": "string",
      "label": "string",
      "sort": 0
    }
  ]
}
```

#### 400

Bad request

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 401

Unauthorized

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 403

Forbidden

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 404

Not found

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 429

Rate limited

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

:::

## DELETE /api/v1/workspaces/{workspace}/openapi/pages/{slug}

Detach one generated page so it can be edited

**Auth:** bearerAuth

:::codesamples Code examples

```bash:curl
curl -X DELETE "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <token>"
```

```java:Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder()
        .uri(URI.create("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string"))
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .method("DELETE", HttpRequest.BodyPublishers.noBody())
        .build();

    var response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
  }
}
```

```python:Python
import urllib.request

url = "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
}
data = None
req = urllib.request.Request(url, data=data, headers=headers, method="DELETE")
with urllib.request.urlopen(req) as res:
    print(res.status)
    print(res.read().decode())
```

```typescript:TypeScript
const response = await fetch("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
  }
});

console.log(response.status);
console.log(await response.json());
```

```go:Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"time"
)

func main() {
	req, err := http.NewRequest("DELETE", "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer <token>")
	client := &http.Client{Timeout: 30 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	bodyBytes, err := io.ReadAll(io.LimitReader(res.Body, 10<<20))
	if err != nil {
		panic(err)
	}
	fmt.Println(res.StatusCode)
	fmt.Println(string(bodyBytes))
}
```

```rust:Rust
// cargo add reqwest --features blocking
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::blocking::Client::new();
    let response = client.request(reqwest::Method::DELETE, "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string")
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .send()?;

    println!("{}", response.status());
    println!("{}", response.text()?);
    Ok(())
}
```

:::

:::details open Parameters

| NAME | IN | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- | --- |
| `workspace` | path | string | yes | Workspace id, or - for the key's bound workspace |
| `slug` | path | string | yes | - |

:::

:::details open Responses

#### 200

Success

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `archived` | boolean | yes | - |
| `author` | string | yes | - |
| `createdAt` | string (date-time) | yes | - |
| `encrypted` | boolean | yes | - |
| `isFolder` | boolean | yes | - |
| `kicker` | string | yes | - |
| `level` | integer | yes | - |
| `locked` | boolean | yes | - |
| `markdown` | string | yes | - |
| `method` | string | no | - |
| `nav` | string | yes | - |
| `navLabel` | string | yes | - |
| `section` | string | yes | - |
| `slug` | string | yes | - |
| `sort` | integer | yes | - |
| `source` | string | no | - |
| `sourceRef` | string | no | - |
| `status` | string | yes | - |
| `title` | string | yes | - |
| `updatedAt` | string (date-time) | yes | - |
| `updatedLabel` | string | yes | - |
| `views` | integer | yes | - |
| `visibility` | string | yes | - |

```json
{
  "archived": true,
  "author": "string",
  "createdAt": "string",
  "encrypted": true,
  "isFolder": true,
  "kicker": "string",
  "level": 0,
  "locked": true,
  "markdown": "string",
  "method": "string",
  "nav": "string",
  "navLabel": "string",
  "section": "string",
  "slug": "string",
  "sort": 0,
  "source": "string",
  "sourceRef": "string",
  "status": "string",
  "title": "string",
  "updatedAt": "string",
  "updatedLabel": "string",
  "views": 0,
  "visibility": "string"
}
```

#### 400

Bad request

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 401

Unauthorized

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 403

Forbidden

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 404

Not found

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 429

Rate limited

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

:::

## POST /api/v1/workspaces/{workspace}/openapi/pages/{slug}/placement

Move a generated OpenAPI page within a section

**Auth:** bearerAuth

:::codesamples Code examples

```bash:curl
curl -X POST "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string/placement" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  --data '{
  "position": 0,
  "section": "string"
}'
```

```java:Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder()
        .uri(URI.create("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string/placement"))
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .header("Content-Type", "application/json")
        .method("POST", HttpRequest.BodyPublishers.ofString("{\n  \"position\": 0,\n  \"section\": \"string\"\n}"))
        .build();

    var response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
  }
}
```

```python:Python
import urllib.request

url = "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string/placement"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json",
}
data = "{\n  \"position\": 0,\n  \"section\": \"string\"\n}".encode("utf-8")
req = urllib.request.Request(url, data=data, headers=headers, method="POST")
with urllib.request.urlopen(req) as res:
    print(res.status)
    print(res.read().decode())
```

```typescript:TypeScript
const response = await fetch("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string/placement", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "position": 0,
    "section": "string"
  })
});

console.log(response.status);
console.log(await response.json());
```

```go:Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
	"time"
)

func main() {
	body := strings.NewReader(`{
  "position": 0,
  "section": "string"
}`)
	req, err := http.NewRequest("POST", "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string/placement", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	client := &http.Client{Timeout: 30 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	bodyBytes, err := io.ReadAll(io.LimitReader(res.Body, 10<<20))
	if err != nil {
		panic(err)
	}
	fmt.Println(res.StatusCode)
	fmt.Println(string(bodyBytes))
}
```

```rust:Rust
// cargo add reqwest --features blocking
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::blocking::Client::new();
    let response = client.request(reqwest::Method::POST, "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/pages/string/placement")
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .header("Content-Type", "application/json")
        .body("{\n  \"position\": 0,\n  \"section\": \"string\"\n}")
        .send()?;

    println!("{}", response.status());
    println!("{}", response.text()?);
    Ok(())
}
```

:::

:::details open Parameters

| NAME | IN | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- | --- |
| `workspace` | path | string | yes | Workspace id, or - for the key's bound workspace |
| `slug` | path | string | yes | - |

:::

:::details open Request Body

Required: yes

#### application/json

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `position` | integer | no | - |
| `section` | string | yes | - |

```json
{
  "position": 0,
  "section": "string"
}
```

:::

:::details open Responses

#### 200

Success

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `archived` | boolean | yes | - |
| `author` | string | yes | - |
| `createdAt` | string (date-time) | yes | - |
| `encrypted` | boolean | yes | - |
| `isFolder` | boolean | yes | - |
| `kicker` | string | yes | - |
| `level` | integer | yes | - |
| `locked` | boolean | yes | - |
| `markdown` | string | yes | - |
| `method` | string | no | - |
| `nav` | string | yes | - |
| `navLabel` | string | yes | - |
| `section` | string | yes | - |
| `slug` | string | yes | - |
| `sort` | integer | yes | - |
| `source` | string | no | - |
| `sourceRef` | string | no | - |
| `status` | string | yes | - |
| `title` | string | yes | - |
| `updatedAt` | string (date-time) | yes | - |
| `updatedLabel` | string | yes | - |
| `views` | integer | yes | - |
| `visibility` | string | yes | - |

```json
{
  "archived": true,
  "author": "string",
  "createdAt": "string",
  "encrypted": true,
  "isFolder": true,
  "kicker": "string",
  "level": 0,
  "locked": true,
  "markdown": "string",
  "method": "string",
  "nav": "string",
  "navLabel": "string",
  "section": "string",
  "slug": "string",
  "sort": 0,
  "source": "string",
  "sourceRef": "string",
  "status": "string",
  "title": "string",
  "updatedAt": "string",
  "updatedLabel": "string",
  "views": 0,
  "visibility": "string"
}
```

#### 400

Bad request

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 401

Unauthorized

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 403

Forbidden

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 404

Not found

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 429

Rate limited

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

:::

## POST /api/v1/workspaces/{workspace}/openapi/sections

Create a section for generated OpenAPI pages

**Auth:** bearerAuth

:::codesamples Code examples

```bash:curl
curl -X POST "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sections" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  --data '{
  "label": "string"
}'
```

```java:Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder()
        .uri(URI.create("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sections"))
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .header("Content-Type", "application/json")
        .method("POST", HttpRequest.BodyPublishers.ofString("{\n  \"label\": \"string\"\n}"))
        .build();

    var response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
  }
}
```

```python:Python
import urllib.request

url = "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sections"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json",
}
data = "{\n  \"label\": \"string\"\n}".encode("utf-8")
req = urllib.request.Request(url, data=data, headers=headers, method="POST")
with urllib.request.urlopen(req) as res:
    print(res.status)
    print(res.read().decode())
```

```typescript:TypeScript
const response = await fetch("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sections", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "label": "string"
  })
});

console.log(response.status);
console.log(await response.json());
```

```go:Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"strings"
	"time"
)

func main() {
	body := strings.NewReader(`{
  "label": "string"
}`)
	req, err := http.NewRequest("POST", "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sections", body)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	client := &http.Client{Timeout: 30 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	bodyBytes, err := io.ReadAll(io.LimitReader(res.Body, 10<<20))
	if err != nil {
		panic(err)
	}
	fmt.Println(res.StatusCode)
	fmt.Println(string(bodyBytes))
}
```

```rust:Rust
// cargo add reqwest --features blocking
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::blocking::Client::new();
    let response = client.request(reqwest::Method::POST, "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sections")
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .header("Content-Type", "application/json")
        .body("{\n  \"label\": \"string\"\n}")
        .send()?;

    println!("{}", response.status());
    println!("{}", response.text()?);
    Ok(())
}
```

:::

:::details open Parameters

| NAME | IN | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- | --- |
| `workspace` | path | string | yes | Workspace id, or - for the key's bound workspace |

:::

:::details open Request Body

Required: yes

#### application/json

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `label` | string | yes | - |

```json
{
  "label": "string"
}
```

:::

:::details open Responses

#### 201

Success

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `key` | string | yes | - |
| `label` | string | yes | - |

```json
{
  "key": "string",
  "label": "string"
}
```

#### 400

Bad request

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 401

Unauthorized

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 403

Forbidden

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 404

Not found

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 429

Rate limited

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

:::

## POST /api/v1/workspaces/{workspace}/openapi/sync

Regenerate pages from the attached spec

**Auth:** bearerAuth

:::codesamples Code examples

```bash:curl
curl -X POST "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sync" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <token>"
```

```java:Java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder()
        .uri(URI.create("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sync"))
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .method("POST", HttpRequest.BodyPublishers.noBody())
        .build();

    var response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
  }
}
```

```python:Python
import urllib.request

url = "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sync"
headers = {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
}
data = None
req = urllib.request.Request(url, data=data, headers=headers, method="POST")
with urllib.request.urlopen(req) as res:
    print(res.status)
    print(res.read().decode())
```

```typescript:TypeScript
const response = await fetch("https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sync", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer <token>",
  }
});

console.log(response.status);
console.log(await response.json());
```

```go:Go
package main

import (
	"fmt"
	"io"
	"net/http"
	"time"
)

func main() {
	req, err := http.NewRequest("POST", "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sync", nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Accept", "application/json")
	req.Header.Set("Authorization", "Bearer <token>")
	client := &http.Client{Timeout: 30 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	bodyBytes, err := io.ReadAll(io.LimitReader(res.Body, 10<<20))
	if err != nil {
		panic(err)
	}
	fmt.Println(res.StatusCode)
	fmt.Println(string(bodyBytes))
}
```

```rust:Rust
// cargo add reqwest --features blocking
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::blocking::Client::new();
    let response = client.request(reqwest::Method::POST, "https://contextowl.co/api/v1/api/v1/workspaces/string/openapi/sync")
        .header("Accept", "application/json")
        .header("Authorization", "Bearer <token>")
        .send()?;

    println!("{}", response.status());
    println!("{}", response.text()?);
    Ok(())
}
```

:::

:::details open Parameters

| NAME | IN | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- | --- |
| `workspace` | path | string | yes | Workspace id, or - for the key's bound workspace |

:::

:::details open Responses

#### 200

Success

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `configured` | boolean | yes | - |
| `lastError` | string | no | - |
| `lastSyncedAt` | string (date-time) | no | - |
| `sourceType` | string | no | - |
| `sourceUrl` | string | no | - |
| `specTitle` | string | no | - |
| `specVersion` | string | no | - |
| `stats` | OpenAPISyncStats object | no | - |
| `updatedAt` | string (date-time) | no | - |

```json
{
  "configured": true,
  "lastError": "string",
  "lastSyncedAt": "string",
  "sourceType": "string",
  "sourceUrl": "string",
  "specTitle": "string",
  "specVersion": "string",
  "stats": {
    "created": 0,
    "deleted": 0,
    "unchanged": 0,
    "updated": 0
  },
  "updatedAt": "string"
}
```

#### 400

Bad request

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 401

Unauthorized

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 403

Forbidden

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 404

Not found

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

#### 429

Rate limited

**Content-Type:** `application/json`

| FIELD | TYPE | REQUIRED | DESCRIPTION |
| --- | --- | --- | --- |
| `error` | object | yes | - |

```json
{
  "error": {
    "code": "string",
    "details": null,
    "message": "string",
    "status": 0
  }
}
```

:::
