311 endpoints.
One key.
Order, manage, and support broadband, mobile, VoIP, leased lines, and hardware for your customers — from your own code. JSON in, JSON out, one response shape, real HTTP status codes.
- 311
- endpoints
- 49
- groups
- 5
- product lines
$ Account balance — the guide's first call
Nothing to first answer. Five minutes.
No code needed to start — the guide's own five steps, with everything you need to download right here.
- 01
Get a sandbox key
In your client area, open API keys and generate a sandbox key. It reads your real data but never changes anything.
- 02
Install Postman
Free, from postman.com — or use it in your browser.
- 03
Import the API
Import our ready-made collection below, or paste the OpenAPI spec URL into Postman's Import (Folder organisation: Tags).
- 04
Add your key
In the collection's Variables, set bearerToken to your key. Every request now sends Authorization: Bearer …
- 05
Send a request
Try Catalogue and account → Account balance. You get {"data": …} back. Swap in a live key when you're ready.
Real reads. Simulated changes.
A sandbox key (test_…) works exactly like a live one — against your own real data — so you build and test against what you'll actually ship.
Reads are real
Your actual products, balance, orders, and services.
Changes are simulated
Every check runs as it would for real — payment method, product ids, that the service is yours and in the right state — then the answer says it worked. Nothing is ordered, invoiced, or changed.
Rehearse whole flows
Sandbox orders get ids above 900000000, and every other endpoint accepts them — order, then manage, end to end.
Impossible to mistake
Every sandbox answer carries meta.sandbox and an X-Sandbox: true header, and sandbox keys are refused by every other Giant API.
{"data": {"order_id": 48213}}
{"data": {"order_id": 912345678,"message": "Sandbox: the order passed validation. Nothing was created, invoiced or provisioned."},"meta": {"sandbox": true}}
Address to live line. Five calls.
Find the address, check what's available, place the order, track the install, confirm it's online — the whole journey your platform runs, rehearsed on a sandbox key.
$ Find the address — every UPRN at the postcode
The kit, too. Quoted and ordered in code.
8 hardware endpoints: browse the catalogue with live stock and tier pricing, price a basket, order it, and point a zero-touch handset at the right extension before it ships.
See the hardware endpoints →$ Browse the catalogue — categories and how many products in each
All 311. Search them.
Straight from the OpenAPI spec — refreshed hourly. Open any endpoint for its parameters, a copyable curl, and the spec's example answer where it has one.
Catalogue and account3
Orders3
Service lifecycle5
Availability and pricing3
Leased line quotes4
Diagnostics and estate6
Broadband ordering1
Broadband services: status15
Broadband services: line and router control8
UnifiedRPS9
Invoices and payments6
Hardware: catalogue and quotes4
Hardware: orders4
Mobile services: status16
VoIP estate and 999 records13
Mobile services: SIM control16
VoIP: AI agents7
VoIP: Analytics3
VoIP: Phone system API access2
VoIP: Softphone app19
VoIP: Billing and usage3
VoIP: Blocked numbers5
VoIP: Call flow8
VoIP: Call logs and recordings6
VoIP: Outbound campaigns8
VoIP: Conference rooms4
VoIP: Custom destinations4
VoIP: Phones11
VoIP: Dial-in access (DISA)4
VoIP: Extensions8
VoIP: Fax3
VoIP: Feature codes4
VoIP: Lookups and setup8
VoIP: Integrations5
VoIP: IVR menus5
VoIP: Media files6
VoIP: Meetings9
VoIP: Music on hold5
VoIP: Phone numbers9
VoIP: Phone books6
VoIP: Number porting8
VoIP: Queues4
VoIP: Ring groups4
VoIP: Account settings2
VoIP: Short numbers4
VoIP: SMS2
VoIP: Time conditions6
VoIP: Voice agents3
VoIP: Voicemail10
One shape. Every endpoint.
{"data": {"service_id": 2417,"status": "Active","online": true}}
{"data": [{"service_id": 2417},{"service_id": 2398}],"meta": {"total": 42,"limit": 50,"offset": 0}}
{"error": {"code": "not_found","message": "No broadband service with that id on your account."}}
| 200 / 201 | Done — 201 when something was created. |
| 204 | Done, nothing to return. |
| 400 | The request is wrong: a missing or invalid field. |
| 401 | No key, or an unknown or suspended key. |
| 403 | The key may not do this — its permissions, allowed IPs, or the package lacks the feature. |
| 404 | No such route, or no such service, SIM, or order on your account. |
| 409 | Not in a state to do that, e.g. a suspended service. |
| 422 | Understood but refused — the message says why. |
| 429 | Too many calls; slow down. |
| 5xx | Something failed our side or at a carrier. Retry later. |
- Auth:
Authorization: Bearer YOUR_API_KEY, orX-API-Keywhere a tool can't set that header. - Requests: reads are GET; changes are POST, PUT, PATCH, or DELETE. Bodies are JSON. Ids sit in the path; names are snake_case everywhere.
- Keys: each can use everything, or only the endpoints you pick — and only from the IPs you allow.
The same call, three ways.
Every active broadband service on your account, ten at a time.
curl "https://portal.giant.net.uk/partner/api/v1/broadband/services?status=Active&limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"
$ch = curl_init('https://portal.giant.net.uk/partner/api/v1/broadband/services?status=Active&limit=10');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('GIANT_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
foreach ($body['data'] as $service) {
echo $service['service_id'], ' ', $service['status'], "\n";
}const res = await fetch(
"https://portal.giant.net.uk/partner/api/v1/broadband/services?status=Active&limit=10",
{ headers: { Authorization: `Bearer ${process.env.GIANT_API_KEY}` } },
);
const { data, meta } = await res.json();
for (const s of data) console.log(s.service_id, s.status);Straight answers. From the guide.
Build it on Giant.
Not a partner yet? Tell us what you're building and the wholesale team will get you set up.
