Get a party's partner-terms consent state
curl --request GET \
--url https://api.venlyfinance.com/v1/parties/{partyId}/partner-terms \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.venlyfinance.com/v1/parties/{partyId}/partner-terms"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.venlyfinance.com/v1/parties/{partyId}/partner-terms', 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.venlyfinance.com/v1/parties/{partyId}/partner-terms",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.venlyfinance.com/v1/parties/{partyId}/partner-terms"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.venlyfinance.com/v1/parties/{partyId}/partner-terms")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.venlyfinance.com/v1/parties/{partyId}/partner-terms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"result": {
"partyId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"status": "REQUIRED",
"consentUrl": "https://onboard.venly.io/partner-terms?token=cons-tok-9f3a2b"
}
}{
"success": false,
"errors": [
{
"code": "unauthenticated",
"message": "Please authenticate to perform this action."
}
]
}{
"success": false,
"errors": [
{
"code": "forbidden",
"message": "You do not have permission to access this resource."
}
]
}{
"success": false,
"errors": [
{
"code": "account-not-found",
"message": "The requested resource was not found."
}
]
}{
"success": false,
"errors": [
{
"code": "invalid-request",
"message": "The request contains invalid parameters."
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": "invalid-request",
"message": "The request contains invalid parameters."
}
],
"result": {}
}Parties
Get partner-terms consent state
Whether the end customer still has to accept our partners’ terms — and the link to hand them.
GET
/
parties
/
{partyId}
/
partner-terms
Get a party's partner-terms consent state
curl --request GET \
--url https://api.venlyfinance.com/v1/parties/{partyId}/partner-terms \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.venlyfinance.com/v1/parties/{partyId}/partner-terms"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.venlyfinance.com/v1/parties/{partyId}/partner-terms', 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.venlyfinance.com/v1/parties/{partyId}/partner-terms",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.venlyfinance.com/v1/parties/{partyId}/partner-terms"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.venlyfinance.com/v1/parties/{partyId}/partner-terms")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.venlyfinance.com/v1/parties/{partyId}/partner-terms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"result": {
"partyId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"status": "REQUIRED",
"consentUrl": "https://onboard.venly.io/partner-terms?token=cons-tok-9f3a2b"
}
}{
"success": false,
"errors": [
{
"code": "unauthenticated",
"message": "Please authenticate to perform this action."
}
]
}{
"success": false,
"errors": [
{
"code": "forbidden",
"message": "You do not have permission to access this resource."
}
]
}{
"success": false,
"errors": [
{
"code": "account-not-found",
"message": "The requested resource was not found."
}
]
}{
"success": false,
"errors": [
{
"code": "invalid-request",
"message": "The request contains invalid parameters."
}
],
"result": {}
}{
"success": false,
"errors": [
{
"code": "invalid-request",
"message": "The request contains invalid parameters."
}
],
"result": {}
}Requires scope:
Each call returns the current state and link, so an expiring or re-issued link is never stale. If you’d rather poll the plain party read,
A
manage:parties — see Required scopes.
Returns one status and, while acceptance is outstanding, one consentUrl — covering every partner the party is onboarding to. You never deal with partners individually.
status | Meaning | What you do |
|---|---|---|
NOT_REQUIRED | Nothing outstanding — including a party that hasn’t passed KYC yet | Nothing |
REQUIRED | The end customer must accept before onboarding proceeds | Hand them consentUrl |
ACCEPTED | Every enabled partner’s currently-active terms are accepted, so onboarding is not blocked on consent | Nothing |
REQUIRED always comes with a consentUrl. That pairing is guaranteed — if the platform reports terms outstanding without a link, you get a retryable 503 instead of a REQUIRED you can’t act on.partnerTermsStatus on Get party details carries the same value.
ACCEPTED is not the end. It is evaluated against the terms active now, so enabling a new partner — or a partner publishing a new terms version — supersedes what was accepted and moves the party back to REQUIRED. Re-read it; don’t record it as a done milestone.Errors
| HTTP | code | When | Retry? |
|---|---|---|---|
500 | identity-verification-rejected | Verification refused the request itself | No |
503 | identity-verification-unavailable | Platform unreachable, or it answered but the state couldn’t be resolved safely | Yes, with backoff |
503 here never means “nothing outstanding”. The endpoint fails closed rather than guessing, so treating it as NOT_REQUIRED would skip the gate.
See Partner-terms consent.Authorizations
OAuth2 client credentials flow. Token endpoints:
Path Parameters
Unique party identifier
Was this page helpful?

