KYC Documents & the Compliance-Profile Lifecycle
Regulated markets don’t accept “trust me” — a carrier or regulator wants proof of who you are before it lets a phone number activate or a Sender ID carry traffic. Orbit models that proof as two things you own: a document library (the files themselves) and compliance profiles (the structured identity the documents back up). This page explains what a profile captures, how documents move from upload to reuse to renewal, where the same document gets referenced, and how to see an expiry coming before it costs you a number. All endpoints below are rooted athttps://api.orbit.devotel.io/api/v1/compliance.
Orbit stores your documents, carries them to the carrier, and surfaces
their review status — final approval is always granted by the carrier or
regulator in each country, not by the platform. Supplying and renewing
the documents themselves stays with you.
What a compliance profile is
A compliance profile (cprof_…) is one regulatory identity bundle: who
the end user is, for which use case, in which country. Carriers review the
profile as a unit — approve it once and every number or sender that profile
covers can use it.
A profile’s own status moves
draft → pending_review → approved (or
rejected / partially_rejected), and to expired when its validity
window closes. Only an approved profile satisfies a country’s checks.
Configure in the dashboard
Every step on this page also runs in the Orbit console. The three surfaces below call the same API endpoints shown in the curl examples, and the documents are the same library either way — upload in one place and the other sees it.
Upload a document. Open Settings → Compliance → Documents and click
Upload. Choose the document type (the same eleven values the API
accepts), set the country, and pick the file — JPEG, PNG, WebP, or PDF, up
to 10 MB. The upload returns the
doc_… library ID the API calls below
reference.
Attach it to a profile. Open Settings → Compliance → Profiles,
create or open a profile, and use its Documents section to attach a
library document in a role. The console lists your existing library, so
you attach by picking the document rather than re-uploading it. The same
doc_… ID can take a different role on a different profile.
Renew before expiry. Upload the replacement to the Documents library,
attach it to the profile in the same role, then detach the expired one.
The expiry-alerts banner on the Numbers page reads the same
GET /numbers/document-expiry-alerts feed as the API, so a console
operator sees the same renew / renew_or_release prompts.
The console drives the same compliance records the API returns. Mix
freely: a document uploaded in the dashboard can be attached via the API,
and a profile built by script can have its documents swapped from the
console.
The document lifecycle
Documents live in a tenant-wide library, separate from any single profile. Upload a passport once and you can attach it to a German phone-number profile today and reuse the same file for a Sender-ID registration tomorrow — no second upload.1. Upload
POST /compliance/documents takes a multipart/form-data upload and
returns the document’s library ID, which always starts with doc_:
Files are encrypted before they leave the API and held in private storage;
nothing about a
doc_… ID is guessable or shareable outside your
organization. List the library any time with GET /compliance/documents.
2. Reference by doc_… ID
A document by itself is inert — it does regulatory work only when it is
attached to a profile with a role:
id_proof, address_proof, business_doc, authorization,
other) tell the carrier which requirement the document satisfies. The
same doc_… ID may play a different role in a different profile.
3. Expiry
Many regulators treat documents as stale after a fixed age — UK Ofcom, Germany’s BNetzA, and France’s ARCEP, among others, generally require ID or address proof to be no older than 3–12 months. Orbit records anexpires_at
per attached document; once a document lapses, it stops counting toward the
country’s requirements even while the file itself is still in your library.
4. Renewal
Renewing is a fresh upload, not an edit: upload the replacement document, attach it to the profile in the same role, then detach (and optionally delete, withDELETE /compliance/documents/:id) the expired one. Profiles
already approved stay approved while you swap the document — the
submission is re-reviewed on next use.
Where documents are reused
Thedoc_… ID is the single pointer three product surfaces share:
- Sender-ID registration. Each country entry in
Sender-ID Registration carries
document_refs: a list ofdoc_…IDs backing that country’s filing. The registration route never accepts files — reference the library IDs you already uploaded, and the same document backs as many countries as accept it. - Numbers regulatory preview. The
regulatory-preview check returns
compliance_profile_satisfies: trueonly when a profile covers every required field and its attached documents are non-expired — an expired document flips the flag tofalseeven on an otherwise complete profile. - Number purchase gating. Buying a number in a regulated country
without a satisfying profile lands the number at
pending_compliance: it’s debited, but it won’t activate until an approved profile is attached. If the carrier’s verify-by deadline passes while the number is still waiting, the number can be auto-released — see Number Lifecycle for release and recovery.
Monitor expiry before it costs you a number
Orbit derives per-number expiry alerts from the timestamps it already stores: each document’sexpires_at, and the carrier verify-by deadline on
numbers waiting at pending_compliance. Read them with:
earliest_expiry_at), whether it came from a document or the carrier
deadline (earliest_expiry_source), the whole days until it lapses
(negative once it already has), and a suggested_action:
renew— still valid but inside your alert window; upload the replacement now.renew_or_release— already lapsed; renew immediately or decide to let the number go.
numbers.document_expiry_alert_days setting (1–365 days), or preview a
different window ad hoc with the ?days= query parameter. Response rows
are sorted most-urgent first; a very large at-risk inventory is capped and
reports truncated: true, so narrow the window if you hit the cap.
Tenant-owned by design
The split of responsibility is deliberate:
Orbit never invents or auto-renews identity documents on your behalf — the
regulator is verifying your identity, so a renewal always starts with a
new upload from you. What the platform guarantees is that a document you
supply once is reusable everywhere it’s accepted, and that you’ll see its
expiry coming with enough lead time to act.
Related references
- Assemble a Shared Compliance Profile Across Gated Surfaces — the end-to-end pattern that reuses this document library across numbers, Sender IDs, brands, and campaigns.
- Sender-ID Registration — per-country
registration backed by
document_refs. - Regulatory Preview — check which fields and documents a country requires before purchase.
- Number Lifecycle — what happens to a number stuck at
pending_compliance, and release/recovery. - Country Compliance Requirements — which sender types and documents each country accepts.
- API Reference → Compliance — full request/response schemas.
- KYC Submissions & Documents: Troubleshooting — when a submission, upload, carrier review, or renewal fails: the symptom-to-fix map for this page’s lifecycle.