Skip to main content

Using the RB2B Profiles API

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.

  1. Open My Account in your RB2B dashboard.

  2. Click Account Details, then Account Settings.

  3. 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

limit

100

Number of profiles per page. Maximum 250.

cursor

none

The next_cursor from the previous response. Leave it out for the first page.

since

none

ISO 8601 date or time. Returns only profiles last seen on or after this. Can't be more than 90 days back.

until

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.

  1. Make your first request without a cursor.

  2. Take the next_cursor value from the response and pass it as cursor on the next request.

  3. Repeat until next_cursor is null. 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 since set to the time of your last pull.

  • No total count is returned, so loop on next_cursor instead 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-After header 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

error

What it means

What to do

401

missing_api_key

No key was sent.

Add the Api-Key or Authorization: Bearer header.

401

invalid_api_key_format

The key isn't in the expected format.

Copy the key again from My Account. Check for missing characters or extra spaces.

401

invalid_api_key

The key isn't recognised. It may have been deleted or regenerated.

Copy the current key from My Account.

403

api_access_not_allowed

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

oem_only

The endpoint is only available to OEM partner accounts.

Use /api/v1/profiles.

429

rate_limited

You've gone over a rate limit.

Wait the number of seconds in Retry-After, then retry.

Did this answer your question?