Skip to content

List the partner's leads (partner-api)

Lists the leads of the partner the key belongs to, newest first (same visibility as the Leads page in the partner portal). Leads of other partners are never returned.

Required scopes: partner-api and partner-leads.

Query parameters: status, search (matches the email), per_page (1 to 5000, default 100) and page. Returned as a Laravel paginator: data, links and meta. While the signup funnel is switched off for the platform the endpoint answers 404, like the portal page.

HTTP: PartnerApiKey

Partner API key. A bearer token that a Reseller Admin generates in the partner portal under Settings, API keys. It belongs to the reseller partner, not to a person, and carries the scopes ticked at creation time. Send it on every request as Authorization: Bearer <partner_api_key>.

Every response is confined to the partner the key belongs to. Keep the key secret and call the API from your server only, never from a browser app.

HTTP Authorization Scheme
bearer
Bearer format
Bearer <partner_api_key>
status query · string
Only leads in this status.
enum: new contacted qualified converted lost
search query · string
Case-insensitive text matched against the lead's email. At most 100 characters.
per_page query · integer
Number of items per page, 1 to 5000. Defaults to `100`. A value above 5000 is rejected with `422`.
page query · integer
Page number to fetch, starting at 1. Defaults to `1`.
accept header · string
example: application/json

Responses

Response schema
dataarray<object>
Each item — A lead of the partner that owns the API key: somebody who left an address on your signup link from a country the self-signup funnel does not serve. The dedupe key, signup IP and browser are not exposed.
idstring · uuid
Unique identifier of the lead.
example: 550e8400-e29b-41d4-a716-446655440101
emailstring · email
The address the lead left.
example: prospect@example.com
country_isostring
ISO 3166-1 alpha-2 code of the lead's country (`ZZ` when unknown).
example: CH
localestring | null
Language the lead used on the signup page.
example: fr
plan_idstring | null · uuid
The plan the lead wanted, when known. Cleared if that plan is later deleted.
example: 550e8400-e29b-41d4-a716-446655440201
plan_namestring | null
Name of that plan when the lead arrived (a snapshot, kept if the plan is renamed).
example: Business Trial
statusstring
Follow-up status. `converted` is set only by the convert action.
enum: new contacted qualified converted lost
example: new
sourcestring | null
Where the lead came from, when recorded.
notesstring | null
Free-text notes kept by your team.
example: Asked for a callback on Monday.
contacted_atstring | null · date-time
When the lead was first marked contacted.
odoo_syncedboolean
True when the lead has a matching `crm.lead` in your Odoo.
example:
created_atstring · date-time
When the lead arrived.
example: 2026-10-28T09:12:00+00:00
updated_atstring · date-time
When the lead was last updated.
example: 2026-10-29T14:05:00+00:00
linksobject
firststring
The first page of the resource
example: http://localhost/api/v1/resources?page=1
laststring
The last page of the resource
example: http://localhost/api/v1/resources?page=1
prevnull | string
The previous page of the resource
nextnull | string
The next page of the resource
metaobject
current_pageinteger
The current page of the resource
≥ 1
example: 1
fromnull | integer
The first item of the resource
≥ 1
example: 1
last_pageinteger
The last page of the resource
≥ 1
example: 1
linksarray<object>
urlstring | null
The url of the resource (null for the boundary prev/next links)
example: http://localhost/api/v1/resources?page=1
labelstring
The label of the resource
example: first
activeboolean
The status of the resource
example: 1
pathstring
The path of the resource
example: http://localhost/api/v1/resources
per_pageinteger
The number of items per page of the resource
≥ 1
example: 15
tonull | integer
The last item of the resource
≥ 1
example: 1
totalinteger
The total number of items of the resource
≥ 0
example: 1
Unauthenticated. The `Authorization: Bearer <token>` header was missing, malformed, or names a token that has been revoked or deleted.
Response schema
messagestring
Forbidden. Three different situations share this status, told apart by `message`: * the token is not a partner API key (a user token, a PBX API key, or any other token); * the partner is not an active reseller; * the key lacks a scope the endpoint needs. The body then also lists `required_scopes`.
Response schema
messagestring
Human-readable reason.
example: This API key is missing a required scope.
required_scopesarray<string>
Present on the missing-scope 403 only. Scopes the endpoint needs that the key lacks.
[]string
Not Found. No lead with this id belongs to your partner (a lead of another partner, a nonexistent id and an id that is not a UUID answer the same way), or the signup funnel is switched off for the platform, in which case every leads endpoint answers `404`.
Response schema
messagestring
Human-readable reason.
example: This API key is missing a required scope.
required_scopesarray<string>
Present on the missing-scope 403 only. Scopes the endpoint needs that the key lacks.
[]string
Unprocessable Content. A query parameter failed validation (`search` longer than 100 characters, `per_page` outside 1 to 5000, `page` below 1, or a value of the wrong type). Nothing is returned: correct the query string and retry.
Response schema
messagestring
The first validation error.
errorsobject
Validation errors keyed by parameter name.
Free-form object
Too Many Requests. Two budgets apply: 120 requests per minute per API key, and 600 per minute across all of a partner's keys together. Wait for the number of seconds in the `Retry-After` header before retrying.
Response schema
messagestring
get https://cockpit.voxbi.com/api/v1/api/v1/leads
Base URL
Request sample
curl -X GET 'https://cockpit.voxbi.com/api/v1/api/v1/leads' \
  -H 'Authorization: Bearer YOUR_TOKEN'
const response = await fetch('https://cockpit.voxbi.com/api/v1/api/v1/leads', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${YOUR_TOKEN}`,
  },
});

const data = await response.json();
console.log(data);
import requests

response = requests.get('https://cockpit.voxbi.com/api/v1/api/v1/leads',
    headers={'Authorization': f'Bearer {YOUR_TOKEN}'}
)
response.raise_for_status()
data = response.json()
print(data)
<?php
$context = stream_context_create([
    'http' => [
        'method'  => 'GET',
        'header'  => "Content-Type: application/json\r\nAuthorization: Bearer YOUR_TOKEN",
    ],
]);

$response = file_get_contents('https://cockpit.voxbi.com/api/v1/api/v1/leads', false, $context);
$data = json_decode($response, true);
print_r($data);
{ … }
"data": [ … ],
{ … }
"id": "550e8400-e29b-41d4-a716-446655440101",
"email": "prospect@example.com",
"country_iso": "CH",
"locale": "fr",
"plan_id": "550e8400-e29b-41d4-a716-446655440201",
"plan_name": "Business Trial",
"status": "new",
"source": null,
"notes": null,
"contacted_at": null,
"odoo_synced": false,
"created_at": "2026-10-28T09:12:00+00:00",
"updated_at": "2026-10-29T14:05:00+00:00"
}
],
"links": { … },
"first": "https://partner.voxbi.com/api/v1/leads?page=1",
"last": "https://partner.voxbi.com/api/v1/leads?page=1",
"prev": null,
"next": null
},
"meta": { … }
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [ … ],
{ … },
"url": null,
"label": "&laquo; Previous",
"active": false
},
{ … },
"url": "https://partner.voxbi.com/api/v1/leads?page=1",
"label": "1",
"active": true
},
{ … }
"url": null,
"label": "Next &raquo;",
"active": false
}
],
"path": "https://partner.voxbi.com/api/v1/leads",
"per_page": 100,
"to": 1,
"total": 1
}
}
{ … }
"message": "Unauthenticated."
}
Content-Type string
example: application/json
{ … }
"message": "This endpoint requires a partner API key."
}
Content-Type string
example: application/json
{ … }
"message": "Lead not found."
}
Content-Type string
example: application/json
{ … }
"message": "The per page field must not be greater than 5000.",
"errors": { … }
"per_page": [ … ]
"The per page field must not be greater than 5000."
]
}
}
Content-Type string
example: application/json
{ … }
"message": "Too Many Attempts."
}
Retry-After integer
Seconds to wait before retrying.
example: 30
Content-Type string
example: application/json