Proton is the API middleware of IWG — a set of REST APIs covering locations, sales leads, inventory, and more.
This guide walks you through the four things you need to do before you can call any Proton endpoint: sign up, subscribe to a product, get your subscription key, and make your first request. It is written so you can copy/paste and be successful even if you have never used the APIs before.
Ocp-Apim-Subscription-Key headerTo access the developer portal, register an account:
After signing up, the system sends a notification email to you and to the team that will activate your subscription. Account approval is required before you can subscribe to any product.
UAT and Production are separate environments with separate portal accounts and separate keys. Start in UAT and only move to PROD once your integration is verified.
The portal organises content into a hierarchy:
GET https://api.proton-graph.cloud/public/locations/api/v2/locationfeatures/{id}[?mode]
Ocp-Apim-Subscription-Key).Once your account is approved, request a subscription to the Product you need. The IWG API Portal Admin will be notified and will approve the subscription if all prerequisites are satisfied.
When your subscription is approved, two subscription keys are issued — a Primary and a Secondary. Either one works; the pair exists so you can rotate without downtime. You can also regenerate them at any time from the Profile page in the portal.
Pass the key as a header on every request:
Ocp-Apim-Subscription-Key: <YOUR_KEY>
⚠️ Treat this key as a secret. Don't share it via email or chat, don't commit it to source control, and don't hardcode it into a public website. IWG Admin can deactivate a key at any time.
UAT and PROD keys are environment-specific and cannot be used across environments.
https://api-uat.proton-graph.cloudhttps://api.proton-graph.cloudEndpoint URLs follow this pattern:
{VERB} {baseUrl}/public/{apiName}/api/{version}/{entity}/{param}[?mode]
Concretely, the pieces map as follows:
{VERB} |
{baseUrl} |
/public/ |
{apiName} |
/api/ |
{version}/ |
{entity} |
/{param}[?mode] |
|---|---|---|---|---|---|---|---|
GET |
https://api.proton-graph.cloud |
/public/ |
locations |
/api/ |
v2/ |
locationfeatures |
/1?mode=Extended |
So, to query a specific location feature entity:
GET https://api.proton-graph.cloud/public/locations/api/v2/locationfeatures/1?mode=Extended
Use this against UAT first to confirm everything is wired up. Replace <YOUR_KEY> with your subscription key.
curl -X GET "https://api-uat.proton-graph.cloud/public/locations/api/v2/locationfeatures/1?mode=Extended" \
-H "Ocp-Apim-Subscription-Key: <YOUR_KEY>" \
-H "Accept-Language: en-GB" \
-H "Content-Type: application/json"
A successful request returns a 2xx response. If you get 401/403, jump to Troubleshooting.
Some endpoints reply with202 Acceptedand ajobIdinstead of the entity — these run asynchronously. See Deferred Jobs when you hit one.
These are the headers Proton recognises on every request:
| Mandatory | Key | Value | Source | Notes |
|---|---|---|---|---|
| Optional | Accept-Language |
fr-FR |
Client | Defaults to en-* if not provided. |
| Yes | Ocp-Apim-Subscription-Key |
<YOUR_KEY> |
APIM Subscription | Mandatory for accessing the API. Either Primary or Secondary key works. |
| Conditional | Authorization |
Bearer <YOUR_TOKEN> |
Identity Server | Mandatory only for endpoints that handle sensitive data — see section 6. |
| Optional | Content-Type |
application/json |
Client | Metadata about the request body. |
Some endpoints require a second level of authorisation from the IWG Identity Server. You'll know an endpoint requires a Bearer token because the API definition lists Authorization as a required header.
You don't create this token yourself — Proton authorities will issue you a clientId and clientSecret, which you exchange for a token via the Admin API's Get token by identifier and secret endpoint. Then send it on every request that needs it:
Authorization: Bearer <YOUR_TOKEN>
TreatclientIdandclientSecretthe same way you treat your subscription key — never commit them, never share them with other parties.
Best practice: tokens are long-lived and renewable. Cache and reuse the token until close to its expiry date — don't request a new token for every API call.
These fields appear on most Proton entities. Worth knowing before you start parsing responses:
| Field | Type | Notes |
|---|---|---|
Id |
string |
Even when the underlying value is numeric or a GUID, Proton normalises it to a string by design. |
ExternalReferenceIds |
List<ExternalReferenceInfo> |
References of this entity in other systems. Each entry has a SystemName and Identifier. |
TimeStamp |
string |
Maps to the underlying ETag. Required when modifying or deleting an entity you previously fetched, to avoid a 409 Conflict. |
Links |
List<RestLink> |
HATEOAS links. Each entry has a Rel, Href, and Method. |
CreateDate |
DateTime |
When the entity was created in Proton. |
IsDeleted |
bool |
Soft-delete flag — Proton marks deleted entities rather than removing them. |
Run through these in UAT before requesting PROD access:
Send the cURL example in section 4.3 → expect 2xx.
Send the same request without the Ocp-Apim-Subscription-Key header → expect 401. This confirms your error handling.
If your Product includes restricted endpoints, exchange your clientId/clientSecret for a token, then call a protected endpoint with both headers → expect 2xx.
If your Product exposes async operations, follow the Deferred Jobs self-check.
When you're ready for PROD:
api-uat.proton-graph.cloud → api.proton-graph.cloud)clientId/clientSecret issued for PRODEverything else — endpoint paths, request shapes, headers — stays the same.
Your PROD portal account is also used as the technical contact for your company if we need to reach you.
Ocp-Apim-Subscription-Key header.2026-01-15T12:31:22.000Z).GBR, not ISO2 GB).{apiName}, {version}, and {entity}.TimeStamp on the request — re-fetch the entity and resend with the latest TimeStamp.Your account provisioning hasn't been fully completed. Open a ticket via the Customer Support Portal.
When you're onboarded, a Customer Support Portal account is created for one of your named contacts — preferably a service email (e.g. svc_proton_integration@mycompany.com) rather than a personal one.
Before raising a support ticket, check the API status page for any ongoing incidents.