curl --request GET \
--url https://sandbox.api.meet-oj.com/partner/v0/referrals \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox.api.meet-oj.com/partner/v0/referrals"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox.api.meet-oj.com/partner/v0/referrals', 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://sandbox.api.meet-oj.com/partner/v0/referrals",
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://sandbox.api.meet-oj.com/partner/v0/referrals"
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://sandbox.api.meet-oj.com/partner/v0/referrals")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.meet-oj.com/partner/v0/referrals")
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{
"data": [
{
"id": "ref_01K5X3K7Q2",
"external_id": "<string>",
"status": "received",
"status_label": "In review",
"progress": {
"step": "received",
"steps": [
{
"key": "received",
"label": "In review",
"state": "done"
}
],
"ended": true
},
"intent": "work_this_deal",
"business": {
"legal_name": "<string>",
"dba": "<string>",
"city": "<string>",
"state": "<string>"
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"object": "referral",
"status_reason": "Two lenders are reviewing your file. Most answer within two business days.",
"todos": [
{
"id": "act_01K5X3T5E9",
"who": "borrower",
"kind": "upload_documents",
"label": "Upload Feb and Mar 2026 bank statements",
"url": "<string>",
"purpose": "statements",
"document_request_id": "<string>",
"detail": "<string>",
"due_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"reminders": {
"cadence_days": [
2,
5,
9
],
"sent_count": 123,
"next_at": "2023-11-07T05:31:56Z",
"via": "oj_channels"
}
}
],
"next_action": {
"id": "act_01K5X3T5E9",
"who": "borrower",
"kind": "upload_documents",
"label": "Upload Feb and Mar 2026 bank statements",
"url": "<string>",
"purpose": "statements",
"document_request_id": "<string>",
"detail": "<string>",
"due_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"reminders": {
"cadence_days": [
2,
5,
9
],
"sent_count": 123,
"next_at": "2023-11-07T05:31:56Z",
"via": "oj_channels"
}
},
"requested_amount": 123,
"matches": [
{
"id": "mat_01K5X3M1A4",
"lender": "Example Capital",
"product": "revenue_based_financing",
"state": "matched",
"program": "Revenue-based financing",
"amount_max": 123,
"term_months": [
6,
12
],
"speed": "1–2 business days"
}
],
"offers_available": 123,
"credit": {
"status": "authorization_needed",
"type": "soft",
"completed_at": "2023-11-07T05:31:56Z"
},
"outcome": {
"status": "declined",
"reason": "lender_declined",
"message": "Example Capital didn't approve this request. They'll send you a notice explaining their decision.",
"lender": "<string>",
"decided_at": "2023-11-07T05:31:56Z"
},
"funded": {
"lender": "<string>",
"amount": 123,
"funded_at": "2023-11-07T05:31:56Z",
"account": {
"institution": "Example Bank",
"mask": "4471"
},
"lender_contact": {
"name": "<string>",
"phone": "<string>",
"email": "jsmith@example.com",
"url": "<string>"
}
},
"payout": {
"status": "estimated",
"status_label": "Held until Nov 4",
"commission": 123,
"oj_fee": 123,
"partner_share": 123,
"scheduled_for": "2023-12-25",
"paid_at": "2023-11-07T05:31:56Z"
},
"conversation": {
"id": "conv_01K5X3K7Q2",
"last_message_at": "2023-11-07T05:31:56Z",
"last_message_preview": "O.J.: Thanks, Feb is in. Still need Mar.",
"last_channel": "embed",
"unread_for_partner": 123
},
"hosted_url": "<string>",
"metadata": {}
}
],
"has_more": true
}List referrals
Returns your referrals, newest first, one page at a time. Filter by status to build a work queue (for
example, everything in needs_partner), or by external_id to find the referral for one of your own
customer records. To page, pass the last id you received as starting_after.
curl --request GET \
--url https://sandbox.api.meet-oj.com/partner/v0/referrals \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox.api.meet-oj.com/partner/v0/referrals"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox.api.meet-oj.com/partner/v0/referrals', 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://sandbox.api.meet-oj.com/partner/v0/referrals",
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://sandbox.api.meet-oj.com/partner/v0/referrals"
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://sandbox.api.meet-oj.com/partner/v0/referrals")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.meet-oj.com/partner/v0/referrals")
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{
"data": [
{
"id": "ref_01K5X3K7Q2",
"external_id": "<string>",
"status": "received",
"status_label": "In review",
"progress": {
"step": "received",
"steps": [
{
"key": "received",
"label": "In review",
"state": "done"
}
],
"ended": true
},
"intent": "work_this_deal",
"business": {
"legal_name": "<string>",
"dba": "<string>",
"city": "<string>",
"state": "<string>"
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"object": "referral",
"status_reason": "Two lenders are reviewing your file. Most answer within two business days.",
"todos": [
{
"id": "act_01K5X3T5E9",
"who": "borrower",
"kind": "upload_documents",
"label": "Upload Feb and Mar 2026 bank statements",
"url": "<string>",
"purpose": "statements",
"document_request_id": "<string>",
"detail": "<string>",
"due_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"reminders": {
"cadence_days": [
2,
5,
9
],
"sent_count": 123,
"next_at": "2023-11-07T05:31:56Z",
"via": "oj_channels"
}
}
],
"next_action": {
"id": "act_01K5X3T5E9",
"who": "borrower",
"kind": "upload_documents",
"label": "Upload Feb and Mar 2026 bank statements",
"url": "<string>",
"purpose": "statements",
"document_request_id": "<string>",
"detail": "<string>",
"due_at": "2023-11-07T05:31:56Z",
"expires_at": "2023-11-07T05:31:56Z",
"reminders": {
"cadence_days": [
2,
5,
9
],
"sent_count": 123,
"next_at": "2023-11-07T05:31:56Z",
"via": "oj_channels"
}
},
"requested_amount": 123,
"matches": [
{
"id": "mat_01K5X3M1A4",
"lender": "Example Capital",
"product": "revenue_based_financing",
"state": "matched",
"program": "Revenue-based financing",
"amount_max": 123,
"term_months": [
6,
12
],
"speed": "1–2 business days"
}
],
"offers_available": 123,
"credit": {
"status": "authorization_needed",
"type": "soft",
"completed_at": "2023-11-07T05:31:56Z"
},
"outcome": {
"status": "declined",
"reason": "lender_declined",
"message": "Example Capital didn't approve this request. They'll send you a notice explaining their decision.",
"lender": "<string>",
"decided_at": "2023-11-07T05:31:56Z"
},
"funded": {
"lender": "<string>",
"amount": 123,
"funded_at": "2023-11-07T05:31:56Z",
"account": {
"institution": "Example Bank",
"mask": "4471"
},
"lender_contact": {
"name": "<string>",
"phone": "<string>",
"email": "jsmith@example.com",
"url": "<string>"
}
},
"payout": {
"status": "estimated",
"status_label": "Held until Nov 4",
"commission": 123,
"oj_fee": 123,
"partner_share": 123,
"scheduled_for": "2023-12-25",
"paid_at": "2023-11-07T05:31:56Z"
},
"conversation": {
"id": "conv_01K5X3K7Q2",
"last_message_at": "2023-11-07T05:31:56Z",
"last_message_preview": "O.J.: Thanks, Feb is in. Still need Mar.",
"last_channel": "embed",
"unread_for_partner": 123
},
"hosted_url": "<string>",
"metadata": {}
}
],
"has_more": true
}Authorizations
One client per partner per environment. Access tokens expire after 15 minutes. Scopes are granted per client. Sandbox clients use https://sandbox.api.meet-oj.com/oauth/token.
Query Parameters
Only return referrals in this status.
Where the referral is, for logic. Use progress and status_label for anything a person reads.
The normal path is received, then prequalified once the business has matches, then submitted when
the file has gone to lenders, then offer when a lender has made one, then funded. A referral pauses in
needs_borrower when the borrower has a to-do, or needs_partner when someone at your company does.
Two statuses are final. declined means a lender reviewed the file and did not approve it; the lender, not
O.J., sends the borrower its notice. closed means the referral ended without a lender decision, for
example because no lender matched, the borrower withdrew, or the business funded elsewhere.
received, prequalified, needs_partner, needs_borrower, submitted, offer, funded, declined, closed Only return the referral you created with this external_id (your own identifier for the business).
Only return referrals created after this time.
1 <= x <= 100Cursor — the id of the last object on the previous page.

