> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://api-docs.hindsiteind.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://api-docs.hindsiteind.com/_mcp/server.

# Post Consumed Parts

POST https://app.hindsiteind.com/api/v2/consumed_parts
Content-Type: application/json

Records a quantity of a part as consumed on a work order task, for users who can start that task (managers of the work order, users assigned to the work order or task, or members of its location), provided the organisation's plan includes parts.

Reference: https://api-docs.hindsiteind.com/hindsite-api/consumed-parts/post-consumed-parts

## Authentication

- `Authorization` header (bearer token, required) — OAuth 2.0 Client Credentials Flow. To obtain an access token: 1. Request API credentials from HINDSITE support to receive your `client_id` and `client_secret` 2. Make a POST request to obtain an access token: ``` POST https://app.hindsiteind.com/oauth/token Content-Type: application/x-www-form-urlencoded grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET ``` 3. The response will contain your access token: ```json { "access_token": "your_access_token_here", "token_type": "Bearer", "expires_in": 7200, "created_at": 1234567890 } ``` 4. Include the token in subsequent API requests: ``` Authorization: Bearer your_access_token_here ```

## Request

### Body (application/json)

This endpoint expects a postV2ConsumedParts.

- `work_order_task_id` (string, required) — ULID of the work order task the part was consumed on
- `part_id` (string, required) — ULID of the part consumed
- `quantity` (integer, required) — How many units of the part were consumed

## Response

### 201

created ConsumedPart

- `id` (string, optional) — ULID
- `part` (Part, optional)
- `quantity` (integer, optional)
- `work_order_task_id` (string, optional) — ULID
- `planned_part` (PlannedPart, optional)
- `created_at` (long, optional) — Unix timestamp (seconds since epoch) when the record was created
- `updated_at` (long, optional) — Unix timestamp (seconds since epoch) when the record was last updated

## Errors

### 400 Bad Request Error

`work_order_task_id`, `part_id` or `quantity` is missing or not the right type

- `error` (string, optional)

### 402 Payment Required Error

The organisation's plan does not include parts. The body carries `error`, `feature` (`parts`) and an `upgrade_url`.

- `error` (string, optional)
- `feature` (enum, optional)
  - Allowed values: `parts`
- `upgrade_url` (string, optional)

### 403 Forbidden Error

Caller cannot start the work order task

- `error` (string, optional)

### 422 Unprocessable Entity Error

The consumed part is invalid, for example an unknown `part_id` or a negative `quantity`

- `error` (string, optional)

## Types

### Part

- `id` (string, optional) — ULID
- `number` (string, optional)
- `description` (string, optional)
- `unit` (string, optional)
- `created_at` (long, optional) — Unix timestamp (seconds since epoch) when the record was created
- `updated_at` (long, optional) — Unix timestamp (seconds since epoch) when the record was last updated

### PlannedPart

- `id` (string, optional) — ULID
- `quantity` (integer, optional)
- `instruction_revision_id` (string, optional) — ULID
- `part` (Part, optional)
- `created_at` (long, optional) — Unix timestamp (seconds since epoch) when the record was created
- `updated_at` (long, optional) — Unix timestamp (seconds since epoch) when the record was last updated

## Examples

**Request**

```json
{
  "work_order_task_id": "string",
  "part_id": "string",
  "quantity": 1
}
```

**Response**

```json
{
  "id": "string",
  "part": {
    "id": "string",
    "number": "string",
    "description": "string",
    "unit": "string",
    "created_at": 1,
    "updated_at": 1
  },
  "quantity": 1,
  "work_order_task_id": "string",
  "planned_part": {
    "id": "string",
    "quantity": 1,
    "instruction_revision_id": "string",
    "part": {
      "id": "string",
      "number": "string",
      "description": "string",
      "unit": "string",
      "created_at": 1,
      "updated_at": 1
    },
    "created_at": 1,
    "updated_at": 1
  },
  "created_at": 1,
  "updated_at": 1
}
```

**SDK Code**

```python
import requests

url = "https://app.hindsiteind.com/api/v2/consumed_parts"

payload = {
    "work_order_task_id": "string",
    "part_id": "string",
    "quantity": 1
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://app.hindsiteind.com/api/v2/consumed_parts';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"work_order_task_id":"string","part_id":"string","quantity":1}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

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

func main() {

	url := "https://app.hindsiteind.com/api/v2/consumed_parts"

	payload := strings.NewReader("{\n  \"work_order_task_id\": \"string\",\n  \"part_id\": \"string\",\n  \"quantity\": 1\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://app.hindsiteind.com/api/v2/consumed_parts")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"work_order_task_id\": \"string\",\n  \"part_id\": \"string\",\n  \"quantity\": 1\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://app.hindsiteind.com/api/v2/consumed_parts")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"work_order_task_id\": \"string\",\n  \"part_id\": \"string\",\n  \"quantity\": 1\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://app.hindsiteind.com/api/v2/consumed_parts', [
  'body' => '{
  "work_order_task_id": "string",
  "part_id": "string",
  "quantity": 1
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://app.hindsiteind.com/api/v2/consumed_parts");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"work_order_task_id\": \"string\",\n  \"part_id\": \"string\",\n  \"quantity\": 1\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "work_order_task_id": "string",
  "part_id": "string",
  "quantity": 1
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://app.hindsiteind.com/api/v2/consumed_parts")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```