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

# Create a job post

POST https://api.yunojuno.com/job_posts/
Content-Type: application/json

Create a job post.

Create an open job post for a hirer at your client account. If the hirer does not already exist, one is provisioned and invited. For onsite, any and hybrid work, the job post uses the given client address, or the client's default address if none is given.

Reference: https://docs.yunojuno.com/client-api/job-posts/create

## 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 a CreateJobPost.

- `hirer` (CreateJobPostHirer, required) — The hirer the job post is created for. If the email does not match an existing hirer at your client account, one is provisioned and sent an invitation. The names are only used when a hirer is created; an existing hirer is returned unchanged.
- `discipline` (string, required) — The identifier of the discipline. Get valid identifiers from GET /disciplines/.
- `title` (string, required) — The job post title.
- `description` (string, required) — Free text describing the role. At least 50 characters and 10 words.
- `duration` (string, required) — Free text for the expected duration, e.g. "3 months".
- `currency` (enum, required) — The currency for the day rate. Must be a currency your client account allows. * `AUD` - $ AUD * `CAD` - $ CAD * `CHF` - ₣ CHF * `CZK` - Kč CZK * `DKK` - kr DKK * `EUR` - € EUR * `GBP` - £ GBP * `HKD` - $ HKD * `INR` - ₹ INR * `NOK` - kr NOK * `NZD` - $ NZD * `PLN` - zł PLN * `SEK` - kr SEK * `SGD` - $ SGD * `AED` - د.إ AED * `USD` - $ USD * `ZAR` - R ZAR
  - Allowed values: `AUD`, `CAD`, `CHF`, `CZK`, `DKK`, `EUR`, `GBP`, `HKD`, `INR`, `NOK`, `NZD`, `PLN`, `SEK`, `SGD`, `AED`, `USD`, `ZAR`
- `day_rate` (string, required) — The day rate, in the given currency.
- `remote_working` (enum, required) — Where the contractor will work. * `onsite` - Fully on-site * `remote` - Fully remote * `any` - Can work on-site or remote * `hybrid` - Required on-site some days a week
  - Allowed values: `onsite`, `remote`, `any`, `hybrid`
- `start_date` (string, required) — The expected start date. Cannot be in the past.
- `client_address` (string, optional) — The identifier of the client address for on-site work. Get valid identifiers from GET /client_addresses/. Only allowed when remote_working is onsite, any or hybrid. If left out, the client's default address is used. If left out and the client has no default address, the request fails with a 422.
- `days_onsite_per_week` (integer, optional, nullable) — Days on-site per week. Only allowed when remote_working is hybrid.
- `disclose_rate` (boolean, optional, default: true) — Whether freelancers can see the day rate. Defaults to true.
- `is_solo_project` (boolean, optional, default: true) — Whether the contractor works alone rather than in a team. Defaults to true.
- `is_date_flexible` (boolean, optional, default: true) — Whether the start date can move. Defaults to true.
- `has_project_started` (boolean, optional, default: false) — Whether the work is already under way. Defaults to false.

## Response

### 201

- `data` (JobPost, required) — The job post object (a `Brief` internally).

## Errors

### 400 Bad Request Error

A field is missing or invalid, for example a start date in the past, a description under 50 characters, or client_address sent with remote work. `details` lists each field and what is wrong.

- `error` (Error, required)

### 401 Unauthorized Error

The access token is missing or invalid.

- `error` (Error, required)

### 403 Forbidden Error

The token is valid but is a client API token. This endpoint needs an OAuth client-credentials token, because the hirer it identifies invites any new hirer.

- `error` (Error, required)

### 404 Not Found Error

The discipline, or the client_address, does not exist for your client account.

- `error` (Error, required)

### 409 Conflict Error

The hirer email cannot be used for a new hirer.

- `error` (Error, required)

### 422 Unprocessable Entity Error

The request breaks a rule of your client account: the currency is not allowed; the hirer email does not match the required email domain; or the work can be on-site, no client_address was sent, and there is no default address.

- `error` (Error, required)

## Types

### CreateJobPostHirer

The hirer the job post is created for. Provisioned if new.

- `email` (string, required) — The hirer's email address.
- `first_name` (string, required)
- `last_name` (string, required)

### JobPost

The job post object (a `Brief` internally).

- `job_post_id` (string, required)
- `hirer_id` (string, required)
- `title` (string, required)
- `description` (string, required)
- `discipline_id` (string, required)
- `duration` (string, required)
- `currency` (string, required)
- `rate_unit` (string, required)
- `rate_amount` (string, required, nullable)
- `disclose_rate` (boolean, required)
- `start_date` (string, required, nullable)
- `is_date_flexible` (boolean, required)
- `has_project_started` (boolean, required, nullable)
- `is_solo_project` (boolean, required, nullable)
- `remote_working` (string, required)
- `days_onsite_per_week` (integer, required, nullable)
- `work_location` (Address, required, nullable) — Where the work happens. Null for fully remote job posts.
- `url` (string, required) — The job post on YunoJuno. Opening it needs a hirer login.

### Error

- `code` (string, required) — A machine-readable code, such as AUTH_TOKEN_INVALID.
- `message` (string, required) — A description you can show to a person.
- `details` (list of ErrorDetail, optional) — Present on validation errors, one entry per failing field.
- `sentry_id` (string, optional) — Present on server errors. Quote it when you contact support.

### Address

A postal address.

- `line_1` (string, required)
- `line_2` (string, required)
- `line_3` (string, required)
- `city` (string, required)
- `state_province_county` (string, required)
- `postcode` (string, required)
- `country` (string, required) — The ISO 3166-1 two-character country code.

### ErrorDetail

One field-level problem, listed on a validation error.

- `code` (string, required) — A machine-readable code, such as VALIDATION_REQUIRED.
- `field` (string, required) — The input field at fault. Nested fields and list indexes are dot-separated, such as data.1.contract.
- `message` (string, required) — What is wrong with the field.

## Examples

**Request**

```json
{
  "hirer": {
    "email": "string",
    "first_name": "string",
    "last_name": "string"
  },
  "discipline": "string",
  "title": "string",
  "description": "string",
  "duration": "string",
  "currency": "AUD",
  "day_rate": "string",
  "remote_working": "onsite",
  "start_date": "2023-01-15"
}
```

**Response**

```json
{
  "data": {
    "job_post_id": "string",
    "hirer_id": "string",
    "title": "string",
    "description": "string",
    "discipline_id": "string",
    "duration": "string",
    "currency": "string",
    "rate_unit": "string",
    "rate_amount": "string",
    "disclose_rate": true,
    "start_date": "2023-01-15",
    "is_date_flexible": true,
    "has_project_started": true,
    "is_solo_project": true,
    "remote_working": "string",
    "days_onsite_per_week": 1,
    "work_location": {
      "line_1": "string",
      "line_2": "string",
      "line_3": "string",
      "city": "string",
      "state_province_county": "string",
      "postcode": "string",
      "country": "string"
    },
    "url": "string"
  }
}
```

**SDK Code**

```python
import requests

url = "https://api.yunojuno.com/job_posts/"

payload = {
    "hirer": {
        "email": "string",
        "first_name": "string",
        "last_name": "string"
    },
    "discipline": "string",
    "title": "string",
    "description": "string",
    "duration": "string",
    "currency": "AUD",
    "day_rate": "string",
    "remote_working": "onsite",
    "start_date": "2023-01-15"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript
const url = 'https://api.yunojuno.com/job_posts/';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"hirer":{"email":"string","first_name":"string","last_name":"string"},"discipline":"string","title":"string","description":"string","duration":"string","currency":"AUD","day_rate":"string","remote_working":"onsite","start_date":"2023-01-15"}'
};

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.yunojuno.com/job_posts/"

	payload := strings.NewReader("{\n  \"hirer\": {\n    \"email\": \"string\",\n    \"first_name\": \"string\",\n    \"last_name\": \"string\"\n  },\n  \"discipline\": \"string\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"duration\": \"string\",\n  \"currency\": \"AUD\",\n  \"day_rate\": \"string\",\n  \"remote_working\": \"onsite\",\n  \"start_date\": \"2023-01-15\"\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.yunojuno.com/job_posts/")

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  \"hirer\": {\n    \"email\": \"string\",\n    \"first_name\": \"string\",\n    \"last_name\": \"string\"\n  },\n  \"discipline\": \"string\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"duration\": \"string\",\n  \"currency\": \"AUD\",\n  \"day_rate\": \"string\",\n  \"remote_working\": \"onsite\",\n  \"start_date\": \"2023-01-15\"\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.yunojuno.com/job_posts/")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"hirer\": {\n    \"email\": \"string\",\n    \"first_name\": \"string\",\n    \"last_name\": \"string\"\n  },\n  \"discipline\": \"string\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"duration\": \"string\",\n  \"currency\": \"AUD\",\n  \"day_rate\": \"string\",\n  \"remote_working\": \"onsite\",\n  \"start_date\": \"2023-01-15\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.yunojuno.com/job_posts/', [
  'body' => '{
  "hirer": {
    "email": "string",
    "first_name": "string",
    "last_name": "string"
  },
  "discipline": "string",
  "title": "string",
  "description": "string",
  "duration": "string",
  "currency": "AUD",
  "day_rate": "string",
  "remote_working": "onsite",
  "start_date": "2023-01-15"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.yunojuno.com/job_posts/");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"hirer\": {\n    \"email\": \"string\",\n    \"first_name\": \"string\",\n    \"last_name\": \"string\"\n  },\n  \"discipline\": \"string\",\n  \"title\": \"string\",\n  \"description\": \"string\",\n  \"duration\": \"string\",\n  \"currency\": \"AUD\",\n  \"day_rate\": \"string\",\n  \"remote_working\": \"onsite\",\n  \"start_date\": \"2023-01-15\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "hirer": [
    "email": "string",
    "first_name": "string",
    "last_name": "string"
  ],
  "discipline": "string",
  "title": "string",
  "description": "string",
  "duration": "string",
  "currency": "AUD",
  "day_rate": "string",
  "remote_working": "onsite",
  "start_date": "2023-01-15"
] as [String : Any]

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

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