A read-only API for the partners an agency invites.
An agency on RenewRig can give a partner — a fleet-safety vendor, a premium-finance company, its own reporting tool — a read-only partner key that reads a chosen set of its trucking clients. Nothing more: a partner key cannot write, and the agency can switch it off at any moment.
What it is for
The API lets a partner read an agency’s client records with that agency’s permission: company identity (name, DBA, USDOT, MC), where the client stands (prospect or client, pipeline stage, renewal date), its contacts, and summaries of its policies. The agency decides which clients a key sees — between 1 and 50 — and which of those three kinds of data it may read.
It is version 1, served at https://www.renewrig.com/api/v1, HTTPS only, JSON only, and read-only for a partner key: every endpoint documented here answers GET (and HEAD); write methods get a 405. This page covers read-only partner keys only.
Keys and authentication
There is no partner sign-up. A key is created by the agency’s Principal (the owner’s seat) in Settings › API access, and handed to you by the agency. Send it as a bearer token from your server:
curl "https://www.renewrig.com/api/v1/clients?limit=2" \
-H "Authorization: Bearer $RENEWRIG_API_KEY"- Test and live. A key looks like
rr_test_<16 hex characters>.<43 characters>, startingrr_test_orrr_live_. A test key reads only the agency’s practice clients (made-up files;isDemoistrue), so you can build against it safely. A live key reads only real clients. The two never mix. - Shown once. RenewRig shows the full key one time, when it is created, and stores only a one-way hash of it. If it is lost, the agency revokes it and creates a new one.
- Always expires. The agency picks a lifetime of 1 to 90 days when creating the key; after that it stops working.
/connectiontells you the date. - Revocable at any time. Revoking takes effect on the next request. A key also stops working if the person who created it is no longer the agency’s Principal, and while the agency requires two-step login that person has not set up.
- One key per partner is the intent: a Principal can hold up to 25 active keys, each with its own name, clients, scopes and expiry.
Keys go in the Authorization header only — never in a URL, browser code or a log. Requests made from a browser on another site are refused.
Scopes
A key carries one or more of these. clients:read is always included.
| Scope | Reads |
|---|---|
clients:read | Client status: Company identity, DOT / MC, stage and renewal dates. Required. |
contacts:read | Contact details: Names, roles, phone numbers and emails for selected clients. |
policies:read | Policy summaries: Insurer, coverage, term dates and policy status. No payments or financial details. |
Rate limits
Each key may make 60 requests per minute and 1,000 per day (UTC). Every request a valid key makes that passes its checks counts, including ones that then return an error. Every response says where you stand:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests allowed per minute (60). |
X-RateLimit-Remaining | Requests left in the current minute. |
X-RateLimit-Reset | When the minute resets, in Unix seconds. |
X-RateLimit-Daily-Limit | Requests allowed per UTC day (1000). |
X-RateLimit-Daily-Remaining | Requests left today. |
X-RateLimit-Daily-Reset | When the day resets (midnight UTC), in Unix seconds. |
Retry-After | On a 429 only: seconds to wait. |
Endpoints
Paths are relative to https://www.renewrig.com/api/v1. The sample bodies below are made-up practice data in the exact shape the API returns. Dates are ISO 8601 in UTC; empty values are null.
Check the connection
GET /connection needs clients:read
Confirms the key works and shows what it may do: its name, test or live mode, scopes and expiry. No client data. Takes no parameters.
{
"data": {
"name": "Example partner sync",
"mode": "TEST",
"scopes": [
"clients:read",
"contacts:read",
"policies:read"
],
"expiresAt": "2026-12-31T00:00:00.000Z",
"readOnly": true,
"version": "v1"
}
}List clients
GET /clients needs clients:read
The clients the agency selected for this key, ordered by id. Search narrows the list; it never widens it.
q(query) — Optional search, up to 100 characters: company name or DBA (any case), or part of a USDOT or MC number.limit(query) — Rows per page, 1–50. Default 25.cursor(query) — The nextCursor from the previous page. Omit it for the first page.
{
"data": [
{
"id": "3f2a9c1e-7b4d-4e8a-9c21-5d6e7f8a9b01",
"companyName": "Sample Haulers LLC",
"dba": "Sample Freight",
"usdot": "1234567",
"mc": "765432",
"relationship": "CLIENT",
"lifecycle": "BOUND",
"newBusinessStage": null,
"renewalStage": "WAITING_CLIENT",
"renewalDate": "2027-03-01T00:00:00.000Z",
"updatedAt": "2026-10-20T15:04:05.000Z",
"isDemo": true
},
{
"id": "3f2a9c1e-7b4d-4e8a-9c21-5d6e7f8a9b02",
"companyName": "Example Express Inc",
"dba": null,
"usdot": "2345678",
"mc": null,
"relationship": "PROSPECT",
"lifecycle": "QUOTING",
"newBusinessStage": "QUOTING",
"renewalStage": null,
"renewalDate": null,
"updatedAt": "2026-10-20T15:04:05.000Z",
"isDemo": true
}
],
"pagination": {
"limit": 2,
"hasMore": true,
"nextCursor": "3f2a9c1e-7b4d-4e8a-9c21-5d6e7f8a9b02"
}
}Get one client
GET /clients/{id} needs clients:read
One selected client. A client that is not selected for this key, archived, or in the other mode answers 404. Takes no query parameters.
id(path) — A client id returned by /clients.
{
"data": {
"id": "3f2a9c1e-7b4d-4e8a-9c21-5d6e7f8a9b01",
"companyName": "Sample Haulers LLC",
"dba": "Sample Freight",
"usdot": "1234567",
"mc": "765432",
"relationship": "CLIENT",
"lifecycle": "BOUND",
"newBusinessStage": null,
"renewalStage": "WAITING_CLIENT",
"renewalDate": "2027-03-01T00:00:00.000Z",
"updatedAt": "2026-10-20T15:04:05.000Z",
"isDemo": true
}
}List a client’s contacts
GET /clients/{id}/contacts needs contacts:read
Names, roles, phone numbers and emails. A client whose contact was only ever typed on the client record returns that one person with id null and source "legacy".
id(path) — A client id returned by /clients.limit(query) — Rows per page, 1–50. Default 25.cursor(query) — The nextCursor from the previous page. Omit it for the first page.
{
"data": [
{
"id": "8b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"name": "Pat Example",
"role": "OWNER",
"title": "Owner",
"phone": "(555) 010-0199",
"email": "pat@example.com",
"isPrimary": true
}
],
"pagination": {
"limit": 25,
"hasMore": false,
"nextCursor": null
}
}List a client’s policy summaries
GET /clients/{id}/policies needs policies:read
Each policy with its newest term: status, dates, insurer, writing carrier and coverage codes (up to 50; coverageTruncated says if there were more). No premiums, payments, limits or documents. An insurer not on file is null.
id(path) — A client id returned by /clients.limit(query) — Rows per page, 1–50. Default 25.cursor(query) — The nextCursor from the previous page. Omit it for the first page.
{
"data": [
{
"id": "c4d5e6f7-0819-4a2b-9c3d-4e5f6a7b8c9d",
"status": "ACTIVE",
"primaryLine": "AL",
"updatedAt": "2026-10-18T09:30:00.000Z",
"latestTerm": {
"status": "ACTIVE",
"effectiveDate": "2026-03-01T00:00:00.000Z",
"expirationDate": "2027-03-01T00:00:00.000Z",
"insurerName": "Example Mutual",
"writingCarrier": "Example Specialty Insurance Co",
"coverageCodes": [
"AL",
"MTC",
"PD"
],
"coverageTruncated": false
}
}
],
"pagination": {
"limit": 25,
"hasMore": false,
"nextCursor": null
}
}Pagination
Lists return data and pagination. While hasMore is true, ask again with cursor set to nextCursor; the order is stable (by id). Unknown or repeated query parameters are refused rather than ignored.
Errors
Errors are JSON with a human sentence, a stable code to branch on, and a requestId (also sent on every response as X-Request-Id):
{
"error": "A valid API key is required.",
"code": "INVALID_API_KEY",
"requestId": "0f1e2d3c-4b5a-4968-8776-655443322110"
}| Status | Code | When |
|---|---|---|
| 400 | HTTPS_REQUIRED | The request was made over plain HTTP. |
| 400 | INVALID_QUERY | An unknown or repeated query parameter, a limit outside 1–50, a cursor that is not a valid id, or a search over 100 characters or with control characters. |
| 401 | INVALID_API_KEY | No key, a malformed key, or a key that is revoked, expired or no longer valid (for example, the person who created it is no longer the agency’s Principal). |
| 403 | SERVER_TO_SERVER_ONLY | The call came from a browser on another site. Call from your server. |
| 403 | INSUFFICIENT_SCOPE | The key does not have the scope this endpoint needs. |
| 403 | TWO_STEP_SETUP_REQUIRED | The agency requires two-step login and the person who created the key has not set it up. |
| 404 | NOT_FOUND | The client does not exist for this key: not selected, archived, or in the other mode. |
| 405 | METHOD_NOT_ALLOWED | A write method (POST, PUT, PATCH, DELETE). The API is read-only; this answer may come without a JSON body. |
| 429 | RATE_LIMITED | The per-minute or per-day limit is used up. Wait for the number of seconds in Retry-After. |
| 503 | UNAVAILABLE | A temporary problem on our side. Retry later with backoff; quote the requestId if it persists. |
Security and logging
- HTTPS only. Plain HTTP is refused, and responses are marked not to be cached.
- Read-only. None of the partner endpoints documented here creates, changes or deletes anything, and a partner key cannot reach anything else.
- Every call is recorded. Each request a key makes that passes its checks (a valid, active key within its limits) is written to the agency’s audit log — endpoint, method, status and request id — and the Principal sees each key’s recent activity in Settings › API access.
- Narrow by design. A key sees only the clients it was given, in its own mode, and only inside the issuing Principal’s own book. It never sees payments, premiums, documents, notes, drivers’ licences or anything else not listed above.
Not available yet
Version 1 is deliberately small. These are not offered today:
- Writing or changing data through a partner key
- Webhooks or change notifications
- OAuth or “Sign in with RenewRig”
- Self-service partner accounts
Building something for a trucking-insurance agency and need more? Ask the agency to put you in touch, or reach us through About.