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

# Creates an absence.

POST https://api.awork.com/api/v1/absences
Content-Type: application/json

Creates an absence with dates rounded to 00:00:00, 12:00:00, or 23:59:59 UTC to support full-day and half-day periods. The end date must be the same as or later than the start date, and overlapping absences are rejected unless the provider allows them.The user must own the absence, be an admin, or have `user-planning-data:write` permission.

Reference: https://developers.awork.com/apiv1/absences/post-absence

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Body (application/json)

This endpoint expects an AbsenceForm.

- `userId` (string, required) — The id of the user to create the absence for.
- `startOn` (string, optional) — The start time of the absence. The time of the date will be ignored.
- `endOn` (string, optional) — The end time of the absence. The time of the date will be ignored.
- `description` (string, optional, nullable) — The reason for the absence.
- `externalProvider` (string, optional, nullable) — The external provider for the absence. If this value is set, the absence is treated as externally managed and therefore read-only in awork. This means users in awork can no longer edit or delete the absence.
- `isHalfDayOnStart` (boolean, optional) — If it's true and it's a single day absence means that the absence to create is for the first half of the workday. If it's a multi day absence it started on the second half of the first day of the absence period.
- `isHalfDayOnEnd` (boolean, optional) — If it's true and it's a single day absence means that the absence to create is for the second half of the workday. If it's a multi day absence it ended on the first half of the last day of the absence period.
- `isSingleDayAbsence` (boolean, optional)

## Response

### 200

OK

- `id` (string, optional) — The id of the entity.
- `createdOn` (string, optional) — The date this entity was created.
- `createdBy` (string, optional) — The id of the user who created this entity.
- `updatedOn` (string, optional) — The date this entity was last modified.
- `updatedBy` (string, optional) — The id of the user who last modified this entity.
- `userId` (string, optional, nullable) — The id of the user to create the absence for.
- `startOn` (string, optional) — The start time of the absence.
- `endOn` (string, optional) — The end time of the absence.
- `description` (string, optional, nullable) — The reason for the absence.
- `externalProvider` (string, optional, nullable) — The external provider for the absence. If this value is set, the absence is treated as externally managed and therefore read-only in awork. This means users in awork can no longer edit or delete the absence.
- `deletedOn` (string, optional, nullable) — The date the absence was deleted.
- `deletedBy` (string, optional, nullable) — The id of the user that deleted the absence.
- `isReadOnly` (boolean, optional) — If it's true it means that this Absence is read-only and cannot be edited/deleted by the user.
- `isHalfDayOnStart` (boolean, optional) — If it's true and it's a single day absence means that the absence is for the first half of the workday. If it's a multi day absence it started on the second half of the first day of the absence period.
- `isHalfDayOnEnd` (boolean, optional) — If it's true and it's a single day absence means that the absence is for the second half of the workday. If it's a multi day absence it ended on the first half of the last day of the absence period.

## Errors

### 400 Bad Request Error

Bad Request

- `code` (string, required) — The error code.
- `description` (string, required) — The description of the error.
- `link` (string, required) — The link to the API documentation page.
- `details` (list of string, optional, nullable) — A list of details describing the error.
- `validationErrors` (list of ValidationErrorResponse, optional, nullable) — If a validation error occurred, this contains the validation errors for each property.
- `traceId` (string, optional, nullable) — The request trace id for tracking the request.

### 401 Unauthorized Error

Unauthorized

- `code` (string, required) — The error code.
- `description` (string, required) — The description of the error.
- `link` (string, required) — The link to the API documentation page.
- `details` (list of string, optional, nullable) — A list of details describing the error.
- `validationErrors` (list of ValidationErrorResponse, optional, nullable) — If a validation error occurred, this contains the validation errors for each property.
- `traceId` (string, optional, nullable) — The request trace id for tracking the request.

## Types

### ValidationErrorResponse

The validation error response.

- `property` (string, optional, nullable) — The name of the property that failed validation.
- `message` (string, optional, nullable) — The reason why this property failed validation.

## Examples

**Request**

```json
{
  "userId": "123e4567-e89b-12d3-a456-426614174000"
}
```

**Response**

```json
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "createdOn": "2022-03-11T15:33:47.100Z",
  "createdBy": "123e4567-e89b-12d3-a456-426614174000",
  "updatedOn": "2022-03-11T21:15:00.100Z",
  "updatedBy": "123e4567-e89b-12d3-a456-426614174000",
  "userId": "123e4567-e89b-12d3-a456-426614174000",
  "startOn": "2022-03-01T00:00:00Z",
  "endOn": "2022-03-03T00:00:00Z",
  "description": "Workation by the beach",
  "externalProvider": "string",
  "deletedOn": "2024-01-15T09:30:00Z",
  "deletedBy": "123e4567-e89b-12d3-a456-426614174000",
  "isReadOnly": true,
  "isHalfDayOnStart": true,
  "isHalfDayOnEnd": true
}
```

**SDK Code**

```python
import requests

url = "https://api.awork.com/api/v1/absences"

payload = { "userId": "123e4567-e89b-12d3-a456-426614174000" }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript
const url = 'https://api.awork.com/api/v1/absences';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"userId":"123e4567-e89b-12d3-a456-426614174000"}'
};

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://api.awork.com/api/v1/absences"

	payload := strings.NewReader("{\n  \"userId\": \"123e4567-e89b-12d3-a456-426614174000\"\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://api.awork.com/api/v1/absences")

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  \"userId\": \"123e4567-e89b-12d3-a456-426614174000\"\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://api.awork.com/api/v1/absences")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"userId\": \"123e4567-e89b-12d3-a456-426614174000\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.awork.com/api/v1/absences', [
  'body' => '{
  "userId": "123e4567-e89b-12d3-a456-426614174000"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.awork.com/api/v1/absences");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"userId\": \"123e4567-e89b-12d3-a456-426614174000\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["userId": "123e4567-e89b-12d3-a456-426614174000"] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.awork.com/api/v1/absences")! 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()
```