curl --request GET \
--url https://api.vollna.com/v1/market-insights \
--header 'X-API-TOKEN: <api-key>'import requests
url = "https://api.vollna.com/v1/market-insights"
headers = {"X-API-TOKEN": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-TOKEN': '<api-key>'}};
fetch('https://api.vollna.com/v1/market-insights', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vollna.com/v1/market-insights",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-TOKEN: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vollna.com/v1/market-insights"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-TOKEN", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.vollna.com/v1/market-insights")
.header("X-API-TOKEN", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vollna.com/v1/market-insights")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-TOKEN"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"access": "trial",
"error": true,
"range": "<string>",
"scope": {
"type": "market",
"filterId": 123,
"filterTitle": "<string>",
"verdict": "<string>"
},
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"previousPeriod": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"updatedAt": "2023-11-07T05:31:56Z",
"granularity": "day",
"kpis": {},
"volumeTrend": {},
"categories": {},
"experienceOverall": {},
"jobMix": {},
"skills": {},
"countries": {},
"clientQuality": {},
"proposalOutcomes": {},
"keywordOpportunities": {},
"nicheDifficulty": {
"available": true,
"reason": "<string>",
"jobs": 123,
"avgApplicants": 123,
"interviewRatePct": 123,
"fillRatePct": 123,
"difficulty": 50,
"crowding": 123,
"odds": 123,
"reliability": 123
}
}
}{
"error": "Validation failed",
"message": "<string>",
"fields": {}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "Validation failed",
"message": "<string>",
"fields": {}
}{
"error": "Validation failed",
"message": "<string>",
"fields": {}
}{
"error": "Validation failed",
"message": "<string>",
"fields": {}
}Get market insights
Returns Upwork market analytics for a period: jobs posted, rates, budgets, connects, categories, skills, countries, client quality and proposal outcomes, with how your team compares. Scope it to the whole market, one of your filters or ad-hoc criteria. Plans with the teaser get 30 days and fewer blocks; access says which one. Counts against the daily market_insights cap
curl --request GET \
--url https://api.vollna.com/v1/market-insights \
--header 'X-API-TOKEN: <api-key>'import requests
url = "https://api.vollna.com/v1/market-insights"
headers = {"X-API-TOKEN": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-TOKEN': '<api-key>'}};
fetch('https://api.vollna.com/v1/market-insights', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.vollna.com/v1/market-insights",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-TOKEN: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vollna.com/v1/market-insights"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-TOKEN", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.vollna.com/v1/market-insights")
.header("X-API-TOKEN", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vollna.com/v1/market-insights")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-TOKEN"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"access": "trial",
"error": true,
"range": "<string>",
"scope": {
"type": "market",
"filterId": 123,
"filterTitle": "<string>",
"verdict": "<string>"
},
"period": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"previousPeriod": {
"from": "2023-12-25",
"to": "2023-12-25"
},
"updatedAt": "2023-11-07T05:31:56Z",
"granularity": "day",
"kpis": {},
"volumeTrend": {},
"categories": {},
"experienceOverall": {},
"jobMix": {},
"skills": {},
"countries": {},
"clientQuality": {},
"proposalOutcomes": {},
"keywordOpportunities": {},
"nicheDifficulty": {
"available": true,
"reason": "<string>",
"jobs": 123,
"avgApplicants": 123,
"interviewRatePct": 123,
"fillRatePct": 123,
"difficulty": 50,
"crowding": 123,
"odds": 123,
"reliability": 123
}
}
}{
"error": "Validation failed",
"message": "<string>",
"fields": {}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "Validation failed",
"message": "<string>",
"fields": {}
}{
"error": "Validation failed",
"message": "<string>",
"fields": {}
}{
"error": "Validation failed",
"message": "<string>",
"fields": {}
}Authorizations
API token for authentication
Query Parameters
Period. The teaser always gets 30d
7d, 14d, 30d, 90d, 180d, 365d Whose proposals the outcomes count
all, freelancer, agency Scope to one of your filters
Only the filter's jobs with this AI verdict. Needs a filter with a qualifier
qualified, disqualified Keywords to match
200Upwork category ids, comma-separated (12,40) or repeated (categoryIds[]=12)
Minimum hourly rate
Maximum hourly rate
Minimum fixed budget
Maximum fixed budget
Comma-separated: 1 entry, 2 intermediate, 3 expert
Only clients with a verified payment method
Comma-separated fields the keywords match: title, description, skills. All three when left out
Response
Successful operation
Show child attributes
Show child attributes
Was this page helpful?