Skip to main content
RefurbPassport

Documentation

Partner API v1

Send RefurbPassport what your tools know about a device — tests, part origin, photos, repairs — and give every customer a verifiable passport and certificate.

Getting access

  1. Apply on the Professionals page and tick “connect my tools through the API”.
  2. The RefurbPassport team verifies your organization and decides whether to grant API access.
  3. Your organization's owner creates a password with the invitation link, then generates a key in Merchant area › API keys.
  4. Every call is logged and tied to your organization: it is shown as the author on the passport.

Until access is “granted”, or if it is suspended, every key of the organization gets a 403 response with the code api_access_not_granted.

Authentication

Every request carries an API key in the Authorization header. Keys start with rp_live_ and are created from the merchant workspace, under API keys. Keep them server-side, never in a client application.

Authorization: Bearer rp_live_…

Base URL

All routes are prefixed with /api/v1. The route and scope catalogue is available without authentication:

curl https://refurbpassport.com/api/v1

Endpoints

MethodRouteScopeDescription
GET/api/v1/passportspassports:readList the organisation's passports
POST/api/v1/passportspassports:writeCreate a passport
GET/api/v1/passports/:publicIdpassports:readGet a passport
POST/api/v1/passports/:publicId/inspectionsdiagnostics:writeFull inspection: tests, findings, part origin
POST/api/v1/passports/:publicId/photosphotos:writePublish a photo of the device
POST/api/v1/passports/:publicId/diagnosticsdiagnostics:writeSimplified diagnostic (title and test count)
POST/api/v1/passports/:publicId/repairsrepairs:writeAdd a repair
POST/api/v1/passports/:publicId/documentsdocuments:writeUpload a document
POST/api/v1/passports/:publicId/certificatecertificates:readGenerate the PDF certificate
POST/api/v1/verifyverify:readVerify an IMEI or serial number
POST/api/v1/bulk/importbulk:importBulk CSV import
GET/api/v1/exports/passportsexports:readExport passports

Sending an inspection

An inspection describes one pass of the device on your bench: who tested it, when, where, with which tool, what they found, the result of each test and the origin of each part. This is what buyers see under “Exactly what you are buying”.

curl -X POST https://refurbpassport.com/api/v1/passports/:publicId/inspections \
  -H "Authorization: Bearer rp_live_xxx" \
  -H "Content-Type: application/json" \
  -d @inspection.json
{
  "title": "Contrôle avant mise en vente",
  "completedAt": "2026-11-02T14:30:00Z",
  "technician": { "name": "Technicien n°12" },
  "location": { "name": "Atelier Lyon Est", "city": "Lyon", "country": "FR" },
  "tool": { "name": "Banc de test", "version": "2.4" },
  "summary": "Fonctionnel, micro-rayure sur le cadre.",
  "observations": "Rayure 3 mm côté gauche du cadre.",
  "battery": { "healthPct": 91, "cycleCount": 212 },
  "cosmeticGrade": "A",
  "externalRef": "CERT-2026-004812",
  "externalUrl": "https://example.com/certificats/CERT-2026-004812",
  "checks": [
    { "category": "display", "name": "Écran tactile", "result": "passed", "method": "measured" },
    { "category": "sensors", "name": "Face ID", "result": "passed", "method": "measured" },
    { "category": "cosmetic", "name": "Cadre", "result": "warning", "method": "operator",
      "notes": "Micro-rayure 3 mm" }
  ],
  "parts": [
    { "part": "SCREEN", "origin": "original", "basis": "pairing" },
    { "part": "BATTERY", "origin": "REPLACED_GENUINE", "basis": "SYSTEM_PAIRING" }
  ]
}
  • result: passed, failed, warning, notTested, notApplicable (or PASSED, FAILED…). method: measured, operator, automated, declared.
  • category: display, cameras, audio, connectivity, sensors, buttons, battery, security, cosmetic, other.
  • part: SCREEN, BATTERY, REAR_CAMERA, REAR_ULTRAWIDE_CAMERA, REAR_TELEPHOTO_CAMERA, FRONT_CAMERA, FACE_ID, TOUCH_ID, LIDAR, MAINBOARD, HOUSING, BACK_GLASS, SPEAKER, MICROPHONE, CHARGING_PORT, BUTTONS, OTHER (+ label).
  • origin: ORIGINAL, REPLACED_GENUINE, REPLACED_THIRD_PARTY, REPLACED_UNKNOWN, UNDETERMINED (or original, replaced, unknown). basis: SYSTEM_PAIRING, SERIAL_MATCH, VISUAL_INSPECTION, REPAIR_RECORD, DECLARED.
  • externalRef / externalUrl: your own certificate number and link (https), shown on the passport.

Publishing photos

Photos of the actual device, as multipart/form-data: JPEG, PNG or WebP, 8 MB max, 24 per passport. kind: FRONT, BACK, LEFT, RIGHT, TOP, BOTTOM, SCREEN_ON, DEFECT, ACCESSORIES, OTHER. Link them to an inspection with inspectionId.

curl -X POST https://refurbpassport.com/api/v1/passports/:publicId/photos \
  -H "Authorization: Bearer rp_live_xxx" \
  -F file=@face-arriere.jpg -F kind=BACK \
  -F caption="Dos sans rayure" -F takenBy="Technicien n°12" \
  -F takenAt=2026-11-02T14:35:00Z -F inspectionId=<publicId de l'inspection>

Scopes

A key can only access the scopes granted when it was created.

ScopeAllows
passports:readRead passports
passports:writeCreate passports
devices:writeRegister devices
diagnostics:writeAdd diagnostics
repairs:writeAdd repairs
documents:writeUpload documents
photos:writePublish photos of the device
certificates:readGenerate PDF certificates
verify:readVerify an identifier
bulk:importBulk import (CSV)
exports:readExport data

Rate limits

Limits apply per key, over a one-minute sliding window, depending on the operation type.

OperationLimit
Default120 requests / min
Read180 requests / min
Write60 requests / min
Verification30 requests / min
Certificates20 requests / min
Document upload30 requests / min

Example

Fetch a passport:

curl -H "Authorization: Bearer rp_live_xxx" \
  https://refurbpassport.com/api/v1/passports/demo-iphone15pro-256

Identifiers and privacy

Responses never contain the IMEI or serial number in plain text: only the identifier type and its last 4 characters are returned.

Get an API key

The API is reserved for partner organizations whose access has been validated. Apply, then create your keys from the merchant area.

Partner API v1 documentation | RefurbPassport