API reference

Update project

POST /projects/{project}. Parameters, permissions, request and response schemas.

POST /projects/{project}

Update project. Requires the REST write token ability. The bearer token selects the Team; a supplied team_id cannot switch tenants. Additional role, entity-policy and plan requirements vary by operation. A Team in blocked billing mode cannot write and receives 402.

Authentication

Use a team API key as Authorization: Bearer YOUR_API_KEY. The token ability and the user’s role must both allow this operation. See authentication.

{
  "ability": "write",
  "team": "Token-bound Team",
  "authorization": "Additional role, entity-policy and plan requirements vary by operation.",
  "billing": "Blocked billing mode rejects writes with 402."
}

Parameters

NameLocationRequiredDescription
projectpathYesThe project ID

project

{
  "type": "integer",
  "minimum": 1
}

Request body

The request body is optional.

multipart/form-data

{
  "type": "object",
  "properties": {
    "state": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "active",
            "archived"
          ],
          "title": "ProjectState"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string",
      "maxLength": 255,
      "description": "Must be unique among projects in this Team, excluding the project being updated."
    },
    "cover": {
      "type": [
        "string",
        "null"
      ],
      "format": "binary",
      "contentMediaType": "application/octet-stream",
      "description": "Maximum file size: 1024 kilobytes."
    },
    "color": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "gray",
            "red",
            "orange",
            "green",
            "blue",
            "purple",
            "rose"
          ],
          "title": "ProjectColor"
        },
        {
          "type": "null"
        }
      ]
    },
    "prio_model_id": {
      "type": [
        "integer",
        "null"
      ]
    }
  },
  "title": "UpdateProjectRequest"
}
{
  "name": "Checkout delivery estimate"
}

Example request

For file fields, replace the synthetic local filename with an existing file of the documented type and size. Let curl set the multipart boundary.

curl --request POST 'https://api.example.test/api/projects/1' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Accept: application/json' \
  --form-string 'name=Checkout delivery estimate' \
  --form 'cover=@./screenshot.png'

Examples use fictional data. Replace resource IDs and the API host with your environment’s values.

Responses

200

ProjectResource

Content type: application/json.

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer"
        },
        "import_source": {
          "type": [
            "string",
            "null"
          ]
        },
        "import_source_ref": {
          "type": [
            "string",
            "null"
          ]
        },
        "import_source_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "data_import_id": {
          "type": [
            "integer",
            "null"
          ]
        },
        "imported_at": {
          "type": [
            "string",
            "null"
          ]
        },
        "public_id": {
          "type": "string"
        },
        "state": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "active",
                "archived"
              ],
              "title": "ProjectState"
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string"
        },
        "cover": {
          "type": [
            "string",
            "null"
          ],
          "description": "URL of the uploaded cover, or null."
        },
        "color": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "gray",
                "red",
                "orange",
                "green",
                "blue",
                "purple",
                "rose"
              ],
              "title": "ProjectColor"
            },
            {
              "type": "null"
            }
          ]
        },
        "prio_model_id": {
          "type": [
            "integer",
            "null"
          ]
        },
        "created_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "updated_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        }
      },
      "required": [
        "id",
        "import_source",
        "import_source_ref",
        "import_source_id",
        "data_import_id",
        "imported_at",
        "public_id",
        "state",
        "name",
        "cover",
        "color",
        "prio_model_id",
        "created_at",
        "updated_at"
      ],
      "title": "ProjectResource"
    }
  },
  "required": [
    "data"
  ]
}
{
  "data": {
    "id": 101,
    "import_source": null,
    "import_source_ref": null,
    "import_source_id": null,
    "data_import_id": null,
    "imported_at": null,
    "public_id": "example-101",
    "state": null,
    "name": "Checkout delivery estimate",
    "cover": null,
    "color": null,
    "prio_model_id": null,
    "created_at": null,
    "updated_at": null
  }
}

401

Unauthenticated

Content type: application/json.

{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "description": "Error overview."
    }
  },
  "required": [
    "message"
  ]
}
{
  "message": "The request could not be completed."
}

402

The Team is in read-only billing mode.

Content type: application/json.

{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "const": "subscription_required"
    },
    "mode": {
      "type": "string",
      "const": "blocked"
    },
    "message": {
      "type": "string",
      "example": "Your team is in read-only mode. Update billing to make changes."
    },
    "grace_period_ends_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    }
  },
  "required": [
    "error",
    "mode",
    "message",
    "grace_period_ends_at"
  ]
}
{
  "error": "subscription_required",
  "mode": "blocked",
  "message": "Your team is in read-only mode. Update billing to make changes.",
  "grace_period_ends_at": null
}

403

Authorization error

Content type: application/json.

{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "description": "Error overview."
    }
  },
  "required": [
    "message"
  ]
}
{
  "message": "The request could not be completed."
}

404

Not found

Content type: application/json.

{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "description": "Error overview."
    }
  },
  "required": [
    "message"
  ]
}
{
  "message": "The request could not be completed."
}

422

Validation error

Content type: application/json.

{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "description": "Errors overview."
    },
    "errors": {
      "type": "object",
      "description": "A detailed description of each field that failed validation.",
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    }
  },
  "required": [
    "message",
    "errors"
  ]
}
{
  "message": "The request could not be completed.",
  "errors": {
    "name": [
      "The name field is required."
    ]
  }
}

429

Rate limit exceeded. Honor Retry-After before retrying.

Response headers:

{
  "Retry-After": {
    "description": "Seconds before retrying.",
    "schema": {
      "type": "integer"
    }
  }
}

Content type: application/json.

{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "example": "Too Many Attempts."
    }
  },
  "required": [
    "message"
  ]
}
{
  "message": "Too Many Attempts."
}

See API conventions for error handling, rate limits, pagination, and uploads.

Was this article helpful?

Need more help? Copy this article's details and paste them into a request on our feedback portal. You may need to sign in.

Open feedback portal

On this page