List your edit proposals
:::openapi-operation GET /api/v1/workspaces/{workspace}/proposals AUTH bearerAuth :::
Lists the proposals that the owner of the key made, newest first, as compact rows, also the ones that writes filed when the org reviews changes from agent keys. Each row has the objectType, the target and a one-line summary, and withdrawn is true when a later write of the key withdrew the proposal. A pending row has stale true when its target changed after the proposal. With id, the array holds that one proposal with its baseRevision and currentRevision, and with its proposed markdown when it changes the text.
:::codesamples open Code examples
curl -X GET "https://contextowl.co/api/v1/workspaces/string/proposals?id=example-id&status=pending" \
-H "Accept: application/json" \
-H "Authorization: Bearer <token>"
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/workspaces/string/proposals?id=example-id&status=pending"))
.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());
}
}
import urllib.request
url = "https://contextowl.co/api/v1/workspaces/string/proposals?id=example-id&status=pending"
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())
const response = await fetch("https://contextowl.co/api/v1/workspaces/string/proposals?id=example-id&status=pending", {
method: "GET",
headers: {
"Accept": "application/json",
"Authorization": "Bearer <token>",
}
});
console.log(response.status);
console.log(await response.json());
package main
import (
"fmt"
"io"
"net/http"
"time"
)
func main() {
req, err := http.NewRequest("GET", "https://contextowl.co/api/v1/workspaces/string/proposals?id=example-id&status=pending", 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))
}
// 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/workspaces/string/proposals?id=example-id&status=pending")
.header("Accept", "application/json")
.header("Authorization", "Bearer <token>")
.send()?;
println!("{}", response.status());
println!("{}", response.text()?);
Ok(())
}
:::
:::details open Parameters (3)
| NAME | IN | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|---|
workspace |
path | string | yes | Workspace id, or - for the key's bound workspace |
status |
query | string enum: pending, approved, rejected, all | no | pending, approved, rejected, or all. The default is pending, or all with id. |
id |
query | integer | no | Id of one proposal to read in full |
:::
:::details open Success responses (200)
200
Success
Content-Type: application/json
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
[]author |
string | yes | - |
[]baseRevision |
string | no | - |
[]createdAt |
string (date-time) | yes | - |
[]currentRevision |
string | no | - |
[]id |
integer | yes | - |
[]markdown |
string | no | - |
[]note |
string | yes | - |
[]objectType |
string | yes | article, landing, changelog, placement, openapi or workspace |
[]reviewNote |
string | yes | - |
[]reviewedAt |
string (date-time) | no | - |
[]slug |
string | yes | - |
[]stale |
boolean | no | - |
[]status |
string | yes | - |
[]summary |
string | yes | One line that says what the proposal changes |
[]target |
string | yes | The object that a proposal of a write under review changes, such as article:42, or empty |
[]title |
string | yes | - |
[]withdrawn |
boolean | no | True when a later write of the key withdrew the proposal, because that write needed no review |
[
{
"author": "string",
"baseRevision": "string",
"createdAt": "string",
"currentRevision": "string",
"id": 0,
"markdown": "string",
"note": "string",
"objectType": "string",
"reviewNote": "string",
"reviewedAt": "string",
"slug": "string",
"stale": true,
"status": "string",
"summary": "string",
"target": "string",
"title": "string",
"withdrawn": true
}
]
:::
:::details Error responses (400, 401, 402, 403, 404, 429, 500)
400
invalid_request: a parameter or the body is not valid.
Content-Type: application/json
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
error |
object | yes | - |
{
"error": {
"code": "string",
"details": null,
"message": "string",
"status": 0
}
}
401
unauthorized: the access key is missing, invalid or expired.
Content-Type: application/json
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
error |
object | yes | - |
{
"error": {
"code": "string",
"details": null,
"message": "string",
"status": 0
}
}
402
upgrade_required: the plan of the org does not include this operation.
Content-Type: application/json
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
error |
object | yes | - |
{
"error": {
"code": "string",
"details": null,
"message": "string",
"status": 0
}
}
403
permission_denied: the key lacks the permission. two_factor_required: the org requires admins to turn on two-factor authentication.
Content-Type: application/json
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
error |
object | yes | - |
{
"error": {
"code": "string",
"details": null,
"message": "string",
"status": 0
}
}
404
not_found: the object does not exist, or the key cannot reach it.
Content-Type: application/json
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
error |
object | yes | - |
{
"error": {
"code": "string",
"details": null,
"message": "string",
"status": 0
}
}
429
rate_limited: too many requests. Wait for the time in the Retry-After header.
Content-Type: application/json
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
error |
object | yes | - |
{
"error": {
"code": "string",
"details": null,
"message": "string",
"status": 0
}
}
500
internal: the server failed.
Content-Type: application/json
| FIELD | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
error |
object | yes | - |
{
"error": {
"code": "string",
"details": null,
"message": "string",
"status": 0
}
}
:::