Organization
One endpoint. Returns the organization your API key belongs to.
An organization is the top-level container: it owns the subscription, the workspaces, the people, and the API keys. A key belongs to exactly one organization, so you never pass an organization id — it is inferred from the key.
Get organization
GET
/organization Read the organization behind your API key, with its workspaces and members.
Returns the organization's profile, your workspaces, the people in the organization, and any invites that have not been accepted. This is the cheapest way to discover the workspace ids you will pass to the other endpoints.
Example request
cURL
curl https://api.proxycharm.com/api/v1/public/organization \
-H "Authorization: Bearer $PROXYCHARM_API_KEY" Python
import os
import requests
API_KEY = os.environ["PROXYCHARM_API_KEY"]
response = requests.get(
"https://api.proxycharm.com/api/v1/public/organization",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=30,
)
payload = response.json()
if not payload["success"]:
raise RuntimeError(payload["error"]["message"])
print(payload["data"]) Node.js
const apiKey = process.env.PROXYCHARM_API_KEY;
const response = await fetch("https://api.proxycharm.com/api/v1/public/organization", {
method: "GET",
headers: {
Authorization: `Bearer ${apiKey}`,
},
});
const payload = await response.json();
if (!payload.success) {
throw new Error(payload.error.message);
}
console.log(payload.data); Go
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
type envelope struct {
Success bool `json:"success"`
Data json.RawMessage `json:"data"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
func main() {
req, err := http.NewRequest("GET", "https://api.proxycharm.com/api/v1/public/organization", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("PROXYCHARM_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var payload envelope
if err := json.NewDecoder(resp.Body).Decode(&payload); err != nil {
panic(err)
}
if !payload.Success {
panic(payload.Error.Message)
}
fmt.Println(string(payload.Data))
} PHP
<?php
$apiKey = getenv("PROXYCHARM_API_KEY");
$ch = curl_init("https://api.proxycharm.com/api/v1/public/organization");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . $apiKey,
],
]);
$payload = json_decode(curl_exec($ch), true);
curl_close($ch);
if (!$payload["success"]) {
throw new RuntimeException($payload["error"]["message"]);
}
print_r($payload["data"]); Example response
200 OK
{
"success": true,
"data": {
"id": "0e4c9a71-5f3b-4d8e-9c02-1a6b8d4f7e35",
"name": "Northwind Data",
"website": "https://northwind.example",
"country": "US",
"use_case": "price_monitoring",
"use_case_note": null,
"team_size": "2-10",
"role": "owner",
"accounts": [
{
"id": "3b7d2c48-6e19-4a5f-8b0c-9d1e2f3a4b5c",
"name": "Scraper US",
"address": "500 W Madison St, Chicago, IL",
"country": "US",
"status": "active"
},
{
"id": "5d9f4e6a-8c2b-4713-9e5d-0f1a2b3c4d5e",
"name": "Scraper EU",
"address": null,
"country": "DE",
"status": "pending_provision"
}
],
"members": [
{
"profile_id": "c4e6a8b0-1d3f-4527-9a6b-8c0d2e4f6a81",
"email": "ops@northwind.example",
"role": "owner"
}
],
"pending_invites": []
},
"error": null,
"context": {
"affected_entities": [],
"suggested_next_actions": [
"list_workspaces",
"list_proxies"
],
"warnings": []
},
"request_id": null,
"timestamp": "2026-02-18T09:31:04.512Z"
} Response fields
| Name | Type | Description |
|---|---|---|
id | string | Organization id. |
name | string | Organization display name. |
website | string | null | Website recorded at signup. |
country | string | null | ISO 3166-1 alpha-2 country the organization operates from. |
use_case | string | null | What the organization said it would use the product for. |
use_case_note | string | null | Free-text note, set only when use_case is other. |
team_size | string | null | Team-size band selected at signup. Not a billing quantity. |
role | string | Role of the profile that created the API key: owner or admin. Owner-only endpoints check this. |
accounts | array<object> | Workspaces in the organization. Empty until the first plan is paid for. |
id | string | Workspace id. Use this wherever an endpoint takes {account_id}. |
name | string | Display name you chose for the workspace. |
address | string | null | Optional operating address recorded for the workspace. |
country | string | null | Optional ISO 3166-1 alpha-2 country the workspace operates from. |
status | string | Lifecycle state. pending_payment is awaiting checkout, pending_provision is paid but waiting for an IP, active has live proxies, removed is retired. |
members | array<object> | Active people in the organization. People are not billed seats. |
profile_id | string | Profile id. |
email | string | Member email address. |
role | string | owner or admin. |
pending_invites | array<object> | Email invitations that have not been accepted yet. |
id | string | Invite id. |
email | string | Invited email address. |
role | string | Role the invite grants. |
Errors
| Code | HTTP | What it means |
|---|---|---|
ORGANIZATION_NOT_FOUND | 200 | The organization record could not be loaded. |
PROFILE_NOT_FOUND | 200 | The profile that created the key no longer exists. |
PROFILE_SUSPENDED | 200 | The profile that created the key is suspended. |
API_KEY_INVALID | 401 | The Authorization header is missing the key prefix, the key does not exist, or its organization has been deleted. |
API_KEY_REVOKED | 401 | The key was revoked in the dashboard. |
API_KEY_EXPIRED | 401 | The key passed the expiry date it was created with. |
RATE_LIMIT_EXCEEDED | 429 | The key exceeded its request budget for the current window. |