The RB2B Profiles API lets you pull your identified visitor profiles as JSON, so you can send them to your own systems without a manual export. It has one endpoint, GET /api/v1/profiles, which returns profiles newest first.
This article covers who can use the Profiles API, where to find your key, how to make requests, and what each error means.
Who can use the Profiles API
API access is included with premium plans. Free and Starter plans don't include it. Your account also needs to be in good standing, which means one of the following:
An active subscription
A trial
If your subscription is cancelled, past due or unpaid, API requests are refused even when the key itself is valid. The same applies on Free and Starter. In each case the API returns a 403 with {"error": "api_access_not_allowed"}.
Access comes back once the account is on a qualifying plan and in good standing again. OEM partner accounts also have API access.
Get your API key
Your key is generated for you and lives in your dashboard.
Open My Account in your RB2B dashboard.
Click Account Details, then Account Settings.
Find the API Key section.
From there you can:
Copy the key to use in your requests.
Regenerate the key. This replaces the existing key, so update anything that uses the old one.
Delete the key. Anything still using it will stop working.
Keys look like r_live_XXXXXXXXXXXXXXXXXXXXXXXXXX_abc123. Treat yours like a password: keep it on your server and out of client-side code, shared documents and screenshots. If a key is exposed, regenerate it.
Authentication
Send your key with every request in one of these two headers. Either works, so use whichever suits your tooling.
Api-Key: r_live_XXXXXXXXXXXXXXXXXXXXXXXXXX_abc123
Authorization: Bearer r_live_XXXXXXXXXXXXXXXXXXXXXXXXXX_abc123
A missing or invalid key returns a 401. The Errors section lists the exact values.
The profiles endpoint
GET https://app.rb2b.com/api/v1/profiles
All query parameters are optional.
Parameter | Default | Notes |
| 100 | Number of profiles per page. Maximum 250. |
| none | The |
| none | ISO 8601 date or time. Returns only profiles last seen on or after this. Can't be more than 90 days back. |
| none | ISO 8601 date or time. Returns only profiles last seen before this. |
Example request for everyone seen since 1 October 2026, 250 per page:
curl "https://app.rb2b.com/api/v1/profiles?limit=250&since=2026-10-01" \ -H "Api-Key: r_live_XXXXXXXXXXXXXXXXXXXXXXXXXX_abc123"
Pagination
Results come back newest first, one page at a time.
Make your first request without a
cursor.Take the
next_cursorvalue from the response and pass it ascursoron the next request.Repeat until
next_cursorisnull. That's the last page.
A few things to know:
The cursor is opaque. Pass it back exactly as you received it, and don't build or edit one yourself.
Paging is stable while new visitors arrive. Profiles identified after you start aren't added to later pages, and none get skipped.
To pick up new profiles, start again from the first page with
sinceset to the time of your last pull.No total count is returned, so loop on
next_cursorinstead of calculating a page count.
Response
A successful request returns a profiles array and a next_cursor.
{ "profiles": [ { "LinkedIn URL": "https://www.linkedin.com/in/jane-doe", "First Name": "Jane", "Last Name": "Doe", "Title": "VP Marketing", "Company Name": "Acme", "Business Email": "[email protected]", "Website": "acme.com", "Industry": "Software", "Employee Count": "51-200", "Estimate Revenue": "$10M-$50M", "City": "Austin", "State": "TX", "Zipcode": "78701", "Seen At": "2026-10-01T14:05:00Z", "Referrer": "google.com", "Captured URL": "https://acme.com/pricing", "Tags": "Hot Lead" } ], "next_cursor": "eyJpZCI6MTIzNDV9" }Field names contain spaces and capital letters, so match them exactly as shown when you map them in your code. next_cursor is null on the last page.
Rate limits
Each API key can make 20 requests per minute. At limit=250, that's up to 5,000 profiles a minute.
There is also a limit of 60 requests per minute from a single IP address, counted across all keys. You'll only meet it if you run several keys from the same server.
If you go over either limit, you get a 429 with:
A
Retry-Afterheader giving the number of seconds to wait.A JSON body showing the limit you hit, for example
{"error": "rate_limited", "limit_per_minute": 20}.
Wait for the Retry-After period, then carry on from the same cursor. For larger history pulls, use the CSV export on the Profiles page instead.
Errors
Errors come back as JSON with an error value you can check in your code.
Status |
| What it means | What to do |
401 |
| No key was sent. | Add the |
401 |
| The key isn't in the expected format. | Copy the key again from My Account. Check for missing characters or extra spaces. |
401 |
| The key isn't recognised. It may have been deleted or regenerated. | Copy the current key from My Account. |
403 |
| The key is valid, but the account's plan or billing status doesn't include API access. | Check your plan and billing status against the requirements in Who can use the API. |
403 |
| The endpoint is only available to OEM partner accounts. | Use |
429 |
| You've gone over a rate limit. | Wait the number of seconds in |
