API Reference¶
██████╗ ███████╗████████╗
██╔════╝ ██╔════╝╚══██╔══╝
██║ ███╗█████╗ ██║
██║ ██║██╔══╝ ██║
╚██████╔╝███████╗ ██║
╚═════╝ ╚══════╝ ╚═╝
██████╗ ██████╗ ███╗ ██╗███╗ ██╗███████╗ ██████╗████████╗███████╗██████╗
██╔════╝██╔═══██╗████╗ ██║████╗ ██║██╔════╝██╔════╝╚══██╔══╝██╔════╝██╔══██╗
██║ ██║ ██║██╔██╗ ██║██╔██╗ ██║█████╗ ██║ ██║ █████╗ ██║ ██║
██║ ██║ ██║██║╚██╗██║██║╚██╗██║██╔══╝ ██║ ██║ ██╔══╝ ██║ ██║
╚██████╗╚██████╔╝██║ ╚████║██║ ╚████║███████╗╚██████╗ ██║ ███████╗██████╔╝
╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═╝ ╚══════╝╚═════╝
██████╗██╗ ██╗███████╗███╗ ██╗████████╗
██╔════╝██║ ██║██╔════╝████╗ ██║╚══██╔══╝
██║ ██║ ██║█████╗ ██╔██╗ ██║ ██║
██║ ██║ ██║██╔══╝ ██║╚██╗██║ ██║
╚██████╗███████╗██║███████╗██║ ╚████║ ██║
╚═════╝╚══════╝╚═╝╚══════╝╚═╝ ╚═══╝ ╚═╝
A typed Python client (and optional CLI) for Galaxy Digital’s Get Connected API
- exception get_connected_client.AuthError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyHTTPError401/403 — bad or missing credentials.
- class get_connected_client.GalaxyClient(api_key: str | None = None, base_url: str = 'https://api.galaxydigital.com/api', *, token: str | None = None, read_only: bool = False, timeout: float = 30.0, retries: int = 3)[source]¶
Bases:
objectEntry point to the API.
All requests funnel through
request(), which enforces read-only mode before anything reaches the network.Two credentials, two jobs. The site API key (
api_key, a UUID) is not an access credential: the API rejects it as anAuthorizationvalue, raw orBearer-prefixed. Its only job is to identify the site in the body oflogin(). What authenticates ordinary requests is the session token (token) thatlogin()returns – a long-lived JWT (roughly a year) sent asAuthorization: Bearer <token>.A client built with only an
api_keyis therefore useful for exactly one thing: callinglogin()to obtain a token. It is still allowed (and sends the key Bearer-prefixed, so nothing breaks for callers who have not migrated), but the server will answer 401 for anything else.retriescounts retries, not attempts:retries=3means up to four requests (the original plus three), with exponential backoff of 0.5s, 1s and 2s between them – roughly 3.5s of sleeping in the worst case. Only idempotent methods are retried on 5xx or transport failures; a 429 is retried for every method, since a rejected request was never processed.- property read_only: bool¶
True when writes are forbidden, by constructor flag or the
GALAXY_READ_ONLYenv var.The two sources are OR’d, never overridden:
GALAXY_READ_ONLY=0does not unblock a client constructed withread_only=True.
- property http: Client¶
The underlying
httpx.Client, a supported escape hatch.Use it for anything
request()does not model (streaming, odd content types, raw responses). It carries the same auth headers and base URL, and writes issued through it are still refused in read-only mode by the_guard()request hook – but it does not retry, unwrap envelopes, or map statuses onto exceptions.Built lazily and cached, which is also how a fresh token takes effect:
login()drops the cached transport so the next access rebuilds it around the new credential.
- request(method: str, path: str, *, params: dict[str, Any] | None = None, json: Any = None, treat_as_write: bool = False) Any[source]¶
Perform a single request, the sole gateway to the network.
Blocks writes in read-only mode before any I/O, retries with exponential backoff (honoring
Retry-Afteron a 429), and maps error statuses onto theGalaxyHTTPErrorhierarchy.A 429 is retried for every method – the request was rejected, not processed. A 5xx or a transport failure is retried only for idempotent methods; a POST or PATCH raises on the first failure rather than risk duplicating a write the server may have committed.
treat_as_writealso disables those retries: the whole point of the flag is that the request is not really idempotent, so repeating it could send a second email (or mint a second artifact).- Parameters:
treat_as_write – enforce the read-only guard for endpoints whose GET has side effects (e.g. /users/{id}/welcomeEmail), and suppress retries for them.
- Raises:
ReadOnlyError – a write was attempted in read-only mode.
GalaxyConnectionError – the request never completed.
GalaxyHTTPError – the API answered 4xx/5xx.
- login(user_email: str, user_password: str, key: str | None = None) LoginResult | dict[str, Any] | None[source]¶
Exchange credentials for a session token and start using it.
keydefaults toapi_key– the site key’s whole purpose. On success the returned token becomes this client’s credential:tokenis replaced and the cached transport is dropped, so the next request is built withAuthorization: Bearer <token>.This is a POST, so it goes through
request()like any other write and is refused in read-only mode.- Raises:
ReadOnlyError – the client is in read-only mode. Checked before the missing-key error below: a read-only client with only a token and no site key should be told it is read-only, not that it is missing a key it was never going to use.
MissingAPIKeyError – no
keywas given and the client has noapi_keyto fall back on.
- exception get_connected_client.GalaxyConnectionError[source]¶
Bases:
GalaxyErrorThe request never completed — DNS, TCP, TLS, or timeout failure.
- exception get_connected_client.GalaxyError[source]¶
Bases:
ExceptionBase for all errors raised by this library.
- exception get_connected_client.GalaxyHTTPError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyErrorAn HTTP-level error response from the API.
- classmethod for_status(status_code: int, detail: str = '') GalaxyHTTPError[source]¶
- exception get_connected_client.MissingAPIKeyError[source]¶
Bases:
GalaxyErrorNo API key was provided or discoverable.
- exception get_connected_client.NotFoundError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyHTTPError404 — the API also uses this for empty list results.
- exception get_connected_client.RateLimitError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyHTTPError429 — too many requests.
- exception get_connected_client.ReadOnlyError[source]¶
Bases:
GalaxyErrorA write was attempted while the client is in read-only mode.
- exception get_connected_client.ValidationFailedError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyHTTPError422 — the API rejected the payload.
Client¶
Sync HTTP client for the Galaxy Digital Get Connected API.
- class get_connected_client.client.GalaxyClient(api_key: str | None = None, base_url: str = 'https://api.galaxydigital.com/api', *, token: str | None = None, read_only: bool = False, timeout: float = 30.0, retries: int = 3)[source]¶
Bases:
objectEntry point to the API.
All requests funnel through
request(), which enforces read-only mode before anything reaches the network.Two credentials, two jobs. The site API key (
api_key, a UUID) is not an access credential: the API rejects it as anAuthorizationvalue, raw orBearer-prefixed. Its only job is to identify the site in the body oflogin(). What authenticates ordinary requests is the session token (token) thatlogin()returns – a long-lived JWT (roughly a year) sent asAuthorization: Bearer <token>.A client built with only an
api_keyis therefore useful for exactly one thing: callinglogin()to obtain a token. It is still allowed (and sends the key Bearer-prefixed, so nothing breaks for callers who have not migrated), but the server will answer 401 for anything else.retriescounts retries, not attempts:retries=3means up to four requests (the original plus three), with exponential backoff of 0.5s, 1s and 2s between them – roughly 3.5s of sleeping in the worst case. Only idempotent methods are retried on 5xx or transport failures; a 429 is retried for every method, since a rejected request was never processed.- property read_only: bool¶
True when writes are forbidden, by constructor flag or the
GALAXY_READ_ONLYenv var.The two sources are OR’d, never overridden:
GALAXY_READ_ONLY=0does not unblock a client constructed withread_only=True.
- property http: Client¶
The underlying
httpx.Client, a supported escape hatch.Use it for anything
request()does not model (streaming, odd content types, raw responses). It carries the same auth headers and base URL, and writes issued through it are still refused in read-only mode by the_guard()request hook – but it does not retry, unwrap envelopes, or map statuses onto exceptions.Built lazily and cached, which is also how a fresh token takes effect:
login()drops the cached transport so the next access rebuilds it around the new credential.
- request(method: str, path: str, *, params: dict[str, Any] | None = None, json: Any = None, treat_as_write: bool = False) Any[source]¶
Perform a single request, the sole gateway to the network.
Blocks writes in read-only mode before any I/O, retries with exponential backoff (honoring
Retry-Afteron a 429), and maps error statuses onto theGalaxyHTTPErrorhierarchy.A 429 is retried for every method – the request was rejected, not processed. A 5xx or a transport failure is retried only for idempotent methods; a POST or PATCH raises on the first failure rather than risk duplicating a write the server may have committed.
treat_as_writealso disables those retries: the whole point of the flag is that the request is not really idempotent, so repeating it could send a second email (or mint a second artifact).- Parameters:
treat_as_write – enforce the read-only guard for endpoints whose GET has side effects (e.g. /users/{id}/welcomeEmail), and suppress retries for them.
- Raises:
ReadOnlyError – a write was attempted in read-only mode.
GalaxyConnectionError – the request never completed.
GalaxyHTTPError – the API answered 4xx/5xx.
- login(user_email: str, user_password: str, key: str | None = None) LoginResult | dict[str, Any] | None[source]¶
Exchange credentials for a session token and start using it.
keydefaults toapi_key– the site key’s whole purpose. On success the returned token becomes this client’s credential:tokenis replaced and the cached transport is dropped, so the next request is built withAuthorization: Bearer <token>.This is a POST, so it goes through
request()like any other write and is refused in read-only mode.- Raises:
ReadOnlyError – the client is in read-only mode. Checked before the missing-key error below: a read-only client with only a token and no site key should be told it is read-only, not that it is missing a key it was never going to use.
MissingAPIKeyError – no
keywas given and the client has noapi_keyto fall back on.
Exceptions¶
Exception hierarchy for the Galaxy Digital API client.
- exception get_connected_client.exceptions.GalaxyError[source]¶
Bases:
ExceptionBase for all errors raised by this library.
- exception get_connected_client.exceptions.MissingAPIKeyError[source]¶
Bases:
GalaxyErrorNo API key was provided or discoverable.
- exception get_connected_client.exceptions.ReadOnlyError[source]¶
Bases:
GalaxyErrorA write was attempted while the client is in read-only mode.
- exception get_connected_client.exceptions.GalaxyConnectionError[source]¶
Bases:
GalaxyErrorThe request never completed — DNS, TCP, TLS, or timeout failure.
- exception get_connected_client.exceptions.GalaxyHTTPError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyErrorAn HTTP-level error response from the API.
- classmethod for_status(status_code: int, detail: str = '') GalaxyHTTPError[source]¶
- exception get_connected_client.exceptions.AuthError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyHTTPError401/403 — bad or missing credentials.
- exception get_connected_client.exceptions.NotFoundError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyHTTPError404 — the API also uses this for empty list results.
- exception get_connected_client.exceptions.ValidationFailedError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyHTTPError422 — the API rejected the payload.
- exception get_connected_client.exceptions.RateLimitError(status_code: int, detail: str = '')[source]¶
Bases:
GalaxyHTTPError429 — too many requests.
Configuration¶
Settings resolution: explicit args > env vars > defaults.
There is no configuration file. Anything the CLI does not receive as an
explicit flag comes from GALAXY_API_KEY, GALAXY_API_TOKEN,
GALAXY_API_URL or GALAXY_READ_ONLY, and failing those from the
built-in defaults (server us1, read-only off, no credentials).
The two credentials are not interchangeable: GALAXY_API_KEY is the site
key, which only ever identifies the site in a login body, while
GALAXY_API_TOKEN is the session token galaxy auth login mints and
the only thing that authenticates a request.
- get_connected_client.config.parse_bool(value: str) bool[source]¶
Coerce a string to a boolean by membership in the truthy set.
- get_connected_client.config.env_read_only() bool | None[source]¶
Read the GALAXY_READ_ONLY env var as a tri-state boolean.
- get_connected_client.config.resolve_url(url: str) str[source]¶
Resolve a server alias (us1/us2/ca) to its full URL, or pass through.
- class get_connected_client.config.Settings(api_key: str | None, url: str, read_only: bool, token: str | None = None)[source]¶
Bases:
objectResolved settings for the Galaxy Digital API client.
tokendefaults to None so callers constructing aSettingspositionally keep working; it is the session credential,api_keythe site key used to log in.
- get_connected_client.config.load_settings(api_key: str | None = None, url: str | None = None, read_only: bool | None = None, token: str | None = None) Settings[source]¶
Resolve settings with precedence: explicit args > env vars > defaults.
tokenresolves from the argument, thenGALAXY_API_TOKEN, then None – the same shape asapi_keyandGALAXY_API_KEY.
Resources¶
Base classes¶
Declarative plumbing shared by all resource namespaces.
- class get_connected_client.resources.base.Resource(client: GalaxyClient)[source]¶
Bases:
Generic[M]Base for a resource namespace: one API endpoint and its model.
Subclasses declare two attributes and inherit whichever CRUD mixins the endpoint supports:
path– the endpoint’s path relative to the API root, e.g."/users". It is the base for every URL the namespace builds.model– theGalaxyModelsubclass rows of this endpoint validate into. It is also the type parameter, so the mixins’ return types stay precise:class Users(ListMixin[User], GetMixin[User], Resource[User]): path = "/users" model = User
Users(client).get(5)then types asUser, notGalaxyModel.modelis deliberately not aClassVar: aClassVarmay not reference a type variable.
- class get_connected_client.resources.base.ListMixin(client: GalaxyClient)[source]¶
Bases:
Resource[M]Adds
list()to a namespace whose endpoint is paginated.- list(*, per_page: int = 150, since_id: int | None = None, since_created: str | None = None, since_updated: str | None = None, show_inactive: bool | None = None, **filters: Any) Iterator[M][source]¶
Iterate every row of the endpoint, paging transparently.
Rows stream as they arrive; the iterator issues one request per page and stops when the server runs out of rows.
- Parameters:
per_page – rows per request, clamped by the client to the API maximum of
MAX_PER_PAGE. Tunes request count, not results.since_id – return only rows with an id greater than this. The client also uses it as the paging cursor.
since_created – server-side filter on creation time, formatted
"YYYY-MM-DD HH:MM".since_updated – server-side filter on last-modified time, same format as since_created.
show_inactive –
Truesends"Yes"andFalsesends"No";None(the default) omits the parameter entirely and takes the server default, which excludes inactive records.filters – any further endpoint-specific query parameters, passed through verbatim.
Nonevalues are dropped.
- Returns:
an iterator of
modelinstances.
- class get_connected_client.resources.base.GetMixin(client: GalaxyClient)[source]¶
Bases:
Resource[M]Adds
get()to a namespace whose endpoint serves single rows.- get(id: int) M[source]¶
Fetch the row with this id.
- Raises:
NotFoundError – no such row.
- Returns:
the parsed
modelinstance.
- class get_connected_client.resources.base.CreateMixin(client: GalaxyClient)[source]¶
Bases:
Resource[M]Adds
create()to a namespace whose endpoint accepts POSTs.- create(**fields: Any) M | dict[str, Any] | None[source]¶
POST fields to the endpoint to create a row.
- Parameters:
fields – the new row’s attributes, sent as the JSON body.
- Raises:
ReadOnlyError – the client is in read-only mode.
- Returns:
the parsed model when the API returns a
dataobject; otherwise the raw response payload, since some endpoints return nothing or a bare message.
- class get_connected_client.resources.base.UpdateMixin(client: GalaxyClient)[source]¶
Bases:
Resource[M]Adds
update()to a namespace whose endpoint accepts PUTs.- update(id: int, **fields: Any) M | dict[str, Any] | None[source]¶
PUT fields to the row with this id.
Only the supplied fields are sent, so this is a partial update.
- Parameters:
id – the row to modify.
fields – the attributes to change, sent as the JSON body.
- Raises:
ReadOnlyError – the client is in read-only mode.
- Returns:
the parsed model when the API returns a
dataobject; otherwise the raw response payload, since some endpoints return nothing or a bare message.
- class get_connected_client.resources.base.DeleteMixin(client: GalaxyClient)[source]¶
Bases:
Resource[M]Adds
delete()to a namespace whose endpoint accepts DELETEs.- delete(id: int) None[source]¶
Delete the row with this id.
- Raises:
ReadOnlyError – the client is in read-only mode.
NotFoundError – no such row.
Agencies¶
The /agencies namespace: CRUD plus every agency sub-resource.
- class get_connected_client.resources.agencies.Agencies(client: GalaxyClient)[source]¶
Bases:
ListMixin[Agency],GetMixin[Agency],CreateMixin[Agency],UpdateMixin[Agency],DeleteMixin[Agency],Resource[Agency]Agencies and everything hanging off them.
This namespace covers every
/agenciesendpoint indoc/api.yml– 10 of 10 paths, 17 of 17 operations, full coverage, nothing excluded. They group as:CRUD on the collection and the row –
list(),get(),create(),update(),delete(), inherited from the mixins.Membership sub-resources, each a read plus add/remove –
causes(),clusters(),managers()andtags().
list()accepts the endpoint’s standard paging filters – seelist()–/agenciesdefines no filters of its own beyond those.
Auth¶
The credential-exchange namespace: /users/login and
/users/authenticate – the pair
Users deliberately leaves out.
- class get_connected_client.resources.auth.Auth(client: GalaxyClient)[source]¶
Bases:
Resource[LoginResult]Credential exchange, covering the two paths
Usersexcludes.2 of 2 paths, 2 of 2 operations, full coverage of the pair. Combined with
Users’s 21 of 23, the API is now covered end to end – 66 of 66 paths across the whole client.Both
login()andauthenticate()are POSTs and so pass through the client’s ordinary read-only choke point:client.requestrefuses every write when the client is in read-only mode, and login/authenticate are no exception – a login mints a bearer token, which is a side effect worth gating even though it changes nothing about a stored record.--read-onlytherefore blocks both commands on the CLI just as it blockscreate/update/deleteelsewhere.- model¶
alias of
LoginResult
- login(user_email: str, user_password: str, key: str | None = None) LoginResult | dict[str, Any] | None[source]¶
Exchange credentials (and the site key) for a session token.
The spec marks
keyrequired, and the API means it – the body is validated before authentication, so a missing key is a 422 rather than a 401.None(the default) therefore falls back to the client’sapi_key, which is what that key exists for.Prefer
login(): it does the same exchange and then adopts the token, so subsequent requests authenticate. This method only returns it.- Returns:
a
LoginResultwhen the API answers with adataobject; otherwise the raw response payload, mirroringcreate().- Raises:
MissingAPIKeyError – no
keywas given and the client has noapi_keyto fall back on.
- authenticate(user_email: str, user_password: str) list[UserOneclick][source]¶
Verify credentials and mint a one-click login link.
The spec has
dataanswer with an array ofUserOneclickrows rather than a bare object – confirmed againstdoc/api.yml’sauthenticateResponse.
Benchmarks¶
The /benchmarks namespace: full CRUD plus the users sub-list.
- class get_connected_client.resources.benchmarks.Benchmarks(client: GalaxyClient)[source]¶
Bases:
ListMixin[Benchmark],GetMixin[Benchmark],CreateMixin[Benchmark],UpdateMixin[Benchmark],DeleteMixin[Benchmark],Resource[Benchmark]Benchmarks – service milestones volunteers can earn.
This namespace covers every
/benchmarksendpoint indoc/api.yml– 3 of 3 paths, 6 of 6 operations, full coverage. They group as:CRUD –
list(),get(),create(),update(),delete(), inherited from the mixins.Membership –
users(), the volunteers who have earned this benchmark. The spec answers withuserMiniObjectrows, not the fullbenchmarkMiniObject-flavored user – confirmed againstdoc/api.yml’slistBenchmarkUsersResponse.
Events¶
The /events namespace: plain CRUD, no sub-resources.
- class get_connected_client.resources.events.Events(client: GalaxyClient)[source]¶
Bases:
ListMixin[Event],GetMixin[Event],CreateMixin[Event],UpdateMixin[Event],DeleteMixin[Event],Resource[Event]Agency events.
This namespace covers every
/eventsendpoint indoc/api.yml– 2 of 2 paths, 5 of 5 operations, full coverage. There are no sub-resources: just CRUD on the collection and the row –list(),get(),create(),update(),delete(), inherited from the mixins.Note
Unlike most other list endpoints,
/eventsdoes not acceptshow_inactive– the spec’slistEventsoperation only takesper_page,since_id,since_createdandsince_updated.list()still inherits the parameter fromListMixin, but passing it has no effect on the server; the CLI does not expose it for this resource.
Groups¶
The /groups namespace: CRUD plus needs/users membership.
- class get_connected_client.resources.groups.Groups(client: GalaxyClient)[source]¶
Bases:
ListMixin[Group],GetMixin[Group],CreateMixin[Group],UpdateMixin[Group],DeleteMixin[Group],Resource[Group]User groups and everything hanging off them.
This namespace covers every
/groupsendpoint indoc/api.yml– 4 of 4 paths, 9 of 9 operations, full coverage, nothing excluded. They group as:CRUD on the collection and the row –
list(),get(),create(),update(),delete(), inherited from the mixins.Membership, add/remove only (the API has no dedicated read endpoint for either – both live on the
needs/usersarrays of the group object itself) –add_need()/remove_need()andadd_user()/remove_user().
list()acceptsshow_inactivein addition to the standard paging filters – seelist().
Hours¶
The /hours namespace: plain CRUD, no sub-resources.
- class get_connected_client.resources.hours.Hours(client: GalaxyClient)[source]¶
Bases:
ListMixin[Hour],GetMixin[Hour],CreateMixin[Hour],UpdateMixin[Hour],DeleteMixin[Hour],Resource[Hour]Volunteer hour records.
This namespace covers every
/hoursendpoint indoc/api.yml– 2 of 2 paths, 5 of 5 operations, full coverage. There are no sub-resources: just CRUD on the collection and the row –list(),get(),create(),update(),delete(), inherited from the mixins.Unlike
/events,/hourslist does acceptshow_inactive:client.hours.list(show_inactive=True)
Misc (clusters, lookups)¶
The /clusters namespace, plus the site’s read-only lookup lists.
Clusters is a small CRUD-minus-two namespace (agencies attach to
clusters; see clusters()).
Lookups bundles four unrelated flat GET-only endpoints – /causes,
/interests, /impacts and /questions/registration – that share
no {id} and no request shape, only the fact that each is a fixed list
the site defines up front.
- class get_connected_client.resources.misc.Clusters(client: GalaxyClient)[source]¶
Bases:
ListMixin[Cluster],CreateMixin[Cluster],DeleteMixin[Cluster],Resource[Cluster]Clusters – named groupings agencies attach to.
This namespace covers every
/clustersendpoint indoc/api.yml– 2 of 2 paths, 3 of 3 operations, full coverage. There is noGetMixin/UpdateMixin: the spec defines neitherGET /clusters/{id}norPUT /clusters/{id}.GET /clustersdeclares no query parameters at all in the spec – not even the usual paging trioper_page/since_id/since_created– unlike every other list endpoint in this API.list()still accepts them, for the same call signature as every other namespace; any unrecognized parameter is simply not documented as doing anything.
- class get_connected_client.resources.misc.Lookups(client: GalaxyClient)[source]¶
-
Read-only site-wide lookups, each with no
{id}of its own.Covers
/causes,/interests,/impactsand/questions/registration– 4 of 4 paths, 4 of 4 operations, full coverage.path/modelare unused placeholders required byResource: each method below names its own endpoint and return model directly, since the four endpoints have nothing in common but being flat, unpaginated, GET-only lists.
Needs¶
The /needs namespace: CRUD plus every need sub-resource.
- class get_connected_client.resources.needs.Needs(client: GalaxyClient)[source]¶
Bases:
ListMixin[Need],GetMixin[Need],CreateMixin[Need],UpdateMixin[Need],DeleteMixin[Need],Resource[Need]Needs (volunteer opportunities) and everything hanging off them.
This namespace covers every
/needsendpoint indoc/api.yml– 8 of 8 paths, 13 of 13 operations, full coverage, nothing excluded. They group as:CRUD on the collection and the row –
list(),get(),create(),update(),delete(), inherited from the mixins.Read-only sub-resources –
responses()andquestions().Shifts –
add_shift()andremove_shift().Membership sub-resources, add/remove only (the API has no read endpoint for either) –
add_interest()/remove_interest()andadd_qualification()/remove_qualification().
list()accepts the endpoint’s own filters on top of the standard paging ones:client.needs.list(agency_id=9, need_status="active")
Supported filters:
agency_id,need_titleandneed_status.Note
/needs/{id}/shiftsdoes not useshiftRequestSchema(that schema’sslots/start_date/start_time/durationfields are only used insideneedRequestSchema’s embeddedshiftsarray, i.e. when shifts are supplied as part of a need create/update). The dedicated endpoint has its own inline schema instead: ashiftsarray of{"start", "slots", "duration"}objects, with one combinedstartdatetime rather than a separate date/time pair.add_shift()keeps the friendlier separatestart_date/start_timearguments and joins them intostartto match what the endpoint actually expects on the wire.- add_shift(id: int, *, slots: int, start_date: str, start_time: str, duration: str) Any[source]¶
Add a shift to this need.
See the class docstring’s note: the wire body is
{"shifts": [{"start": ..., "slots": ..., "duration": ...}]}, not the four flat fields ofshiftRequestSchema. start_date and start_time are joined with a space to buildstart.
- add_qualification(id: int, qualification_id: int) Any[source]¶
Attach qualification_id to this need.
Qualifications¶
The /qualifications namespace: full CRUD plus the users sub-list.
- class get_connected_client.resources.qualifications.Qualifications(client: GalaxyClient)[source]¶
Bases:
ListMixin[Qualification],GetMixin[Qualification],CreateMixin[Qualification],UpdateMixin[Qualification],DeleteMixin[Qualification],Resource[Qualification]Qualifications – credentials a volunteer can hold or be asked for.
This namespace covers every
/qualificationsendpoint indoc/api.yml– 3 of 3 paths, 6 of 6 operations, full coverage. They group as:CRUD –
list(),get(),create(),update(),delete(), inherited from the mixins.Membership –
users(), the volunteers who hold this qualification.
- model¶
alias of
Qualification
- users(id: int) list[QualificationUser][source]¶
The users who hold this qualification.
Responses¶
The /responses namespace: plain CRUD, no sub-resources.
- class get_connected_client.resources.responses.Responses(client: GalaxyClient)[source]¶
Bases:
ListMixin[Response],GetMixin[Response],CreateMixin[Response],UpdateMixin[Response],DeleteMixin[Response],Resource[Response]Volunteer responses (sign-ups) to needs.
This namespace covers every
/responsesendpoint indoc/api.yml– 2 of 2 paths, 5 of 5 operations, full coverage. There are no sub-resources: just CRUD on the collection and the row –list(),get(),create(),update(),delete(), inherited from the mixins.list()acceptsshow_inactivein addition to the standard paging filters – seelist():client.responses.list(show_inactive=True)
Teams¶
The /teams namespace: list/get/create/delete plus membership.
- class get_connected_client.resources.teams.Teams(client: GalaxyClient)[source]¶
Bases:
ListMixin[Team],GetMixin[Team],CreateMixin[Team],DeleteMixin[Team],Resource[Team]Teams – a group of volunteers responding together to a single need.
This namespace covers every
/teamsendpoint indoc/api.yml– 3 of 3 paths, 6 of 6 operations, full coverage, nothing excluded. They group as:CRUD, minus update –
list(),get(),create(),delete(), inherited from the mixins. There is noUpdateMixin: the spec defines noPUT /teams/{id}.Membership –
add_member()/remove_member().
list()acceptsshow_inactivein addition to the standard paging filters – seelist().
Users¶
The /users namespace: CRUD plus every user sub-resource.
- class get_connected_client.resources.users.Users(client: GalaxyClient)[source]¶
Bases:
ListMixin[User],GetMixin[User],CreateMixin[User],UpdateMixin[User],DeleteMixin[User],Resource[User]Users and everything hanging off them.
This namespace covers every
/usersendpoint indoc/api.ymlexcept the credential-exchange pair –/users/authenticateand/users/login– which live onAuthinstead: 21 of 23 paths, 32 of 34 operations, one method apiece. Rather than enumerate the rest here (a list that rots the moment one is added), they group as:CRUD on the collection and the row –
list(),get(),create(),update(),delete(), inherited from the mixins.Membership sub-resources, each a read plus add/remove –
agencies(),causes(),interests()andtags(), withbenchmarks()read-and-remove only.Read-only sub-resources –
hours(),qualifications(),responses()andtracks().Read/replace sub-resources, where the write supersedes everything stored –
extras()/set_extras(),registration_answers()/set_registration_answers()andoptouts()/add_optout()/remove_optout().Actions –
send_welcome_email()andoneclick().
list()accepts the endpoint’s own filters on top of the standard paging ones:client.users.list(user_status="active", user_email_like="@example.com")
Supported filters:
user_status,user_fname,user_lname,user_email,user_fname_like,user_lname_likeanduser_email_like.- agencies(id: int) list[AgencyMini][source]¶
The agencies this user has fanned.
- remove_agency(id: int, agency_id: int) Any[source]¶
Drop this user’s fan relationship with agency_id.
- benchmarks(id: int) list[BenchmarkMini][source]¶
The benchmarks (service milestones) this user has earned.
- extras(id: int, subset: str | None = None) list[Extra][source]¶
This user’s custom key/value data.
- Parameters:
subset –
"regExtra"(the server default) or"profile".- Returns:
the stored pairs, or
[]when the user has none – the API answers 404 rather than an empty list.
- set_extras(id: int, extras: list[dict[str, Any]] | dict[str, Any], subset: str | None = None) Any[source]¶
Replace this user’s extras with extras.
The spec’s shape is
{"extras": [{"key": ..., "value": ...}, ...]}. The payload is the entirety of the user’s extras for the subset, so an update must resend the pairs it wants to keep.- Parameters:
extras – either the bare
[{"key": ..., "value": ...}, ...]list – wrapped in the{"extras": ...}envelope for you – or a dict that already contains that envelope, sent verbatim.subset –
"regExtra"(the server default) or"profile".
- send_welcome_email(id: int) Any[source]¶
Send this user the site’s welcome email.
A GET with a side effect: the spec models it as a read, but it puts mail in someone’s inbox. Treat it as a write.
- oneclick(id: int) UserOneclick[source]¶
Mint a one-click (passwordless) login link for this user.
A GET with a side effect: it issues a credential, so it is treated as a write and refused in read-only mode (see the note above this method).
- Raises:
ReadOnlyError – the client is in read-only mode.
- optouts(id: int) UserOptouts[source]¶
The message areas this user has opted out of.
- Raises:
NotFoundError – the user has not opted out of anything.
- add_optout(id: int, optout_areas: list[str]) Any[source]¶
Opt this user out of messaging.
- Parameters:
optout_areas –
area names, or
["all"]. The list supersedes whatever was stored before:client.users.add_optout(5, ["blast"])
- remove_optout(id: int, optout_areas: list[str]) Any[source]¶
Remove areas from this user’s opt-out list.
- Parameters:
optout_areas – unlike
add_optout(), this names only the areas to lift, leaving the rest of the opt-outs in place.
- qualifications(id: int) list[UserQualification][source]¶
The qualifications this user holds.
- registration_answers(id: int) list[RegistrationAnswer][source]¶
This user’s answers to the site’s custom registration questions.
- set_registration_answers(id: int, answers: list[dict[str, Any]]) Any[source]¶
Store this user’s answers to the custom registration questions.
- Parameters:
answers – the spec’s
answersarray – objects of{"question_id": ..., "answer": [...]}. It is wrapped in the required{"answers": ...}envelope for you.
- responses(id: int) list[UserResponse][source]¶
The needs this user has signed up for.
Models¶
Base¶
Base model preserving unknown fields (the API schema is loose).
- class get_connected_client.models.base.GalaxyModel(**extra_data: Any)[source]¶
Bases:
BaseModelBase for all Galaxy Digital API models.
The Get Connected API returns loose data - ids are sometimes strings, responses may include fields not documented in the OpenAPI spec, and integer fields occasionally arrive as
""or non-numeric strings. This base preserves unknown fields so round-tripping throughmodel_dump()does not silently drop data, and degrades unparseable numerics toNoneinstead of refusing the whole record.- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Common¶
Small shared models used across Galaxy Digital API resources.
Each class corresponds to a schema in components.schemas of the
vendored OpenAPI spec (doc/api.yml). Field names match the spec
verbatim. The API represents numeric ids as strings; pydantic coerces
those to int on validation.
- class get_connected_client.models.common.Tag(*, id: int | None = None, name: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModeltagObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.Cause(*, id: int | None = None, name: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelcauseObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.Cluster(*, id: int | None = None, name: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelclusterObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.Interest(*, id: int | None = None, name: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelinterestObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.Impact(*, id: int | None = None, impact_name: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelimpactObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.Category(*, id: int | None = None, name: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelcategoryObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.Extra(*, key: str | None = None, value: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelextraObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.Question(*, id: int | None = None, q_type: str | None = None, q_label: str | None = None, q_options: list[str] | None = None, q_area: str | None = None, q_area_id: int | None = None, q_status: str | None = None, created_at: str | None = None, updated_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelquestionObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.Shift(*, id: int | None = None, start: str | None = None, end: str | None = None, duration: str | None = None, slots: int | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelshiftObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.TrackMini(*, id: int | None = None, name: str | None = None, created_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModeltrackMiniObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.BenchmarkMini(*, id: int | None = None, benchmark_status: str | None = None, benchmark_title: str | None = None, benchmark_icon: str | None = None, benchmark_hours: str | None = None, benchmark_date_start: str | None = None, benchmark_date_end: str | None = None, created_at: str | None = None, update_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelbenchmarkMiniObject.
update_atis spelled that way in the spec – the API’s own typo, kept verbatim so payloads round-trip.- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.UserMini(*, id: int | None = None, domain_id: int | None = None, user_fname: str | None = None, user_lname: str | None = None, user_email: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModeluserMiniObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.AgencyMini(*, id: int | None = None, domain_id: int | None = None, agency_name: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelagencyMiniObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.NeedMini(*, id: int | None = None, domain_id: int | None = None, need_title: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelneedMiniObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.GroupMini(*, id: int | None = None, domain_id: int | None = None, group_title: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelgroupMiniObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.InitiativeMini(*, id: int | None = None, domain_id: int | None = None, init_title: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelinitiativeMiniObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.common.TeamMini(*, id: int | None = None, domain_id: int | None = None, team_name: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelteamMiniObject.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Agencies¶
Models for the /agencies endpoints.
Field names are copied verbatim from doc/api.yml; the API sends numeric
ids as strings and pydantic coerces them.
- class get_connected_client.models.agencies.Agency(*, id: int | None = None, domain_id: int | None = None, agency_name: str | None = None, agency_link: str | None = None, agency_address: str | None = None, agency_address2: str | None = None, agency_city: str | None = None, agency_state: str | None = None, agency_postal: str | None = None, agency_extra_location: str | None = None, agency_phone: str | None = None, agency_phone_extension: str | None = None, agency_fax: str | None = None, agency_twitter_link: str | None = None, agency_facebook_link: str | None = None, agency_instagram_link: str | None = None, agency_youtube_link: str | None = None, agency_linkedin_link: str | None = None, agency_email: str | None = None, agency_video: str | None = None, agency_url: str | None = None, agency_ein: str | None = None, agency_comments: str | None = None, agency_status: str | None = None, agency_latitude: str | None = None, agency_longitude: str | None = None, agency_contact: str | None = None, agency_contact_title: str | None = None, agency_news: str | None = None, agency_mission: str | None = None, agency_contacts: list[str] | None = None, agency_hours: str | None = None, agency_partner: str | None = None, logo: str | None = None, created_at: str | None = None, updated_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelagencyObject – an organization on the site.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Auth¶
Models for the credential-exchange endpoints.
/users/authenticate answers with an array of
UserOneclick rows directly, so it
needs no model of its own here – only /users/login’s response shape,
loginObject, does.
- class get_connected_client.models.auth.LoginResult(*, user: User | None = None, token: str | None = None, expires: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelloginObject – the outcome of
POST /users/login.useris typed as the fullUsermodel even though the spec’s nested object documents only five of its fields – everyUserfield is optional, so the smaller payload parses cleanly and callers get the same shape asclient.users.get.- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Benchmarks¶
Models for the /benchmarks endpoints.
Field names are copied verbatim from doc/api.yml; the API sends numeric
ids as strings and pydantic coerces them.
- class get_connected_client.models.benchmarks.Benchmark(*, id: int | None = None, benchmark_status: str | None = None, benchmark_title: str | None = None, benchmark_icon: str | None = None, benchmark_hours: str | None = None, benchmark_date_start: str | None = None, benchmark_date_end: str | None = None, benchmark_approval_required: str | None = None, benchmark_allow_indv_hours: str | None = None, benchmark_group_id: int | None = None, created_at: str | None = None, update_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelbenchmarkObject – a service milestone volunteers can earn.
update_atis spelled that way in the spec – the API’s own typo, kept verbatim so payloads round-trip (see alsoBenchmarkMini, which carries the same typo).- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Events¶
Models for the /events endpoints.
Field names are copied verbatim from doc/api.yml; the API sends numeric
ids as strings and pydantic coerces them.
- class get_connected_client.models.events.Event(*, id: int | None = None, domain_id: int | None = None, event_area: str | None = None, event_area_id: int | None = None, event_title: str | None = None, event_description: str | None = None, event_location: str | None = None, event_address: str | None = None, event_address2: str | None = None, event_city: str | None = None, event_state: str | None = None, event_postal: str | None = None, event_email: str | None = None, event_rsvp: str | None = None, event_date_start: str | None = None, event_date_end: str | None = None, event_all_day: str | None = None, event_comments: str | None = None, tags: list[Tag] | None = None, created_at: str | None = None, update_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModeleventObject – an agency event.
update_atis spelled that way in the spec – the API’s own typo (see alsobenchmarkMiniObject), kept verbatim so payloads round-trip.- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Groups¶
Models for the /groups endpoints.
Field names are copied verbatim from doc/api.yml; the API sends numeric
ids as strings and pydantic coerces them.
- class get_connected_client.models.groups.GroupUser(*, id: int | None = None, domain_id: int | None = None, user_fname: str | None = None, user_lname: str | None = None, user_email: str | None = None, leader: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelGroupUserMiniObject – one user attached to a user group.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.groups.Group(*, id: int | None = None, domain_id: int | None = None, ug_status: str | None = None, ug_title: str | None = None, ug_description: str | None = None, ug_description_private: str | None = None, ug_domains: str | None = None, ug_color: str | None = None, ug_text_color: str | None = None, ug_icon: str | None = None, ug_suppress_resume: str | None = None, ug_allow_member_remove: str | None = None, ug_submitted_hours: str | None = None, ug_block_id: str | None = None, ug_limit: str | None = None, ug_goal: str | None = None, ug_approval: str | None = None, created_at: str | None = None, updated_at: str | None = None, needs: list[NeedMini] | None = None, users: list[GroupUser] | None = None, agencies: list[AgencyMini] | None = None, questions_reflection: list[Question] | None = None, questions_join: list[Question] | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelgroupObject – a user group.
Called “team” in some Get Connected UI copy, but this is a distinct resource from
teamObject/Team.- agencies: list[AgencyMini] | None¶
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Hours¶
Models for volunteer hour records (hourObject).
- class get_connected_client.models.hours.Hour(*, id: int | None = None, domain_id: int | None = None, user: UserMini | None = None, groups: list[GroupMini] | None = None, need: NeedMini | None = None, hour_description: str | None = None, hour_date_start: str | None = None, hour_date_end: str | None = None, hour_hours: str | None = None, hour_miles: str | None = None, hour_location: str | None = None, hour_contact_name: str | None = None, hour_contact_details: str | None = None, hour_relationship: str | None = None, hour_parent: str | None = None, hour_source: str | None = None, hour_status: str | None = None, hour_type: str | None = None, created_at: str | None = None, updated_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelhourObject – one submitted block of volunteer time.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Needs¶
Models for the /needs endpoints.
Field names are copied verbatim from doc/api.yml; the API sends numeric
ids as strings and pydantic coerces them.
- class get_connected_client.models.needs.Need(*, id: int | None = None, domain_id: int | None = None, agency: AgencyMini | None = None, initiative: InitiativeMini | None = None, groups: list[GroupMini] | None = None, need_title: str | None = None, need_body: str | None = None, need_address: str | None = None, need_address2: str | None = None, need_city: str | None = None, need_state: str | None = None, need_postal: str | None = None, need_type: str | None = None, need_contact: str | None = None, need_response_notify: str | None = None, need_date: str | None = None, need_date_type: str | None = None, need_impact_area: str | None = None, need_volunteers_needed: str | None = None, need_public: str | None = None, need_allow_groups: str | None = None, need_hours: str | None = None, need_comments: str | None = None, need_latitude: str | None = None, need_longitude: str | None = None, need_date_close: str | None = None, family_friendly: str | None = None, outdoors: str | None = None, outdoors_plan: str | None = None, accessible: str | None = None, tags: list[Tag] | None = None, shifts: list[Shift] | None = None, need_status: str | None = None, created_at: str | None = None, background_check_required: str | None = None, updated_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelneedObject – an opportunity an agency has posted.
- agency: AgencyMini | None¶
- initiative: InitiativeMini | None¶
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Qualifications¶
Models for the /qualifications endpoints.
Field names are copied verbatim from doc/api.yml; the API sends numeric
ids as strings and pydantic coerces them.
- class get_connected_client.models.qualifications.Qualification(*, id: int | None = None, domain_id: int | None = None, qualification_title: str | None = None, qualification_cat_id: int | None = None, qualification_question: str | None = None, qualification_type: str | None = None, qualification_options: list[str] | None = None, qualification_link_url: str | None = None, qualification_link_text: str | None = None, qualification_level: str | None = None, qualification_duration: str | None = None, qualification_approval: str | None = None, qualification_status: str | None = None, created_at: str | None = None, updated_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelqualificationObject – a credential a volunteer can hold or be asked for.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.qualifications.QualificationUser(*, id: int | None = None, domain_id: int | None = None, user_fname: str | None = None, user_lname: str | None = None, user_email: str | None = None, status: str | None = None, expires: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelqualificationUsersObject – one user’s standing on a qualification.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Responses¶
Models for the /needs/{id}/responses endpoint.
Field names are copied verbatim from doc/api.yml; the API sends numeric
ids as strings and pydantic coerces them.
- class get_connected_client.models.responses.ResponseAnswer(*, type: str | None = None, key: str | None = None, area: str | None = None, question: str | None = None, answer: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelResponseAnswerObject – one answer on a response’s question set.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.responses.Response(*, id: int | None = None, domain_id: int | None = None, agency: AgencyMini | None = None, shift: Shift | None = None, need: NeedMini | None = None, user: UserMini | None = None, initiative: InitiativeMini | None = None, team: TeamMini | None = None, response_phone: str | None = None, response_address: str | None = None, response_note: str | None = None, response_date_added: str | None = None, response_date_updated: str | None = None, response_source: str | None = None, response_status: str | None = None, response_comments: str | None = None, answers: list[ResponseAnswer] | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelresponseObject – a volunteer’s response to a need.
- agency: AgencyMini | None¶
- initiative: InitiativeMini | None¶
- answers: list[ResponseAnswer] | None¶
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Teams¶
Models for the /teams endpoints.
Field names are copied verbatim from doc/api.yml; the API sends numeric
ids as strings and pydantic coerces them.
- class get_connected_client.models.teams.TeamMember(*, id: int | None = None, domain_id: int | None = None, user_fname: str | None = None, user_lname: str | None = None, user_email: str | None = None, leader: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelteamMembersObject – one member of a team.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.teams.Team(*, id: int | None = None, domain_id: int | None = None, team_status: str | None = None, team_title: str | None = None, team_description: str | None = None, creator: UserMini | None = None, agency: AgencyMini | None = None, need: NeedMini | None = None, members: list[TeamMember] | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelteamObject – a group of volunteers responding together to one need.
- agency: AgencyMini | None¶
- members: list[TeamMember] | None¶
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
Users¶
Models for the /users endpoints.
Field names are copied verbatim from doc/api.yml; the API sends numeric
ids as strings and pydantic coerces them.
- class get_connected_client.models.users.User(*, id: int | None = None, domain_id: int | None = None, domain_sitename: str | None = None, user_reference_id: str | None = None, user_fname: str | None = None, user_mname: str | None = None, user_lname: str | None = None, user_email: str | None = None, user_phone: str | None = None, user_phone_cell: str | None = None, user_username: str | None = None, user_address: str | None = None, user_address2: str | None = None, user_city: str | None = None, user_state: str | None = None, user_postal: str | None = None, user_county: str | None = None, user_country: str | None = None, user_age_range: str | None = None, user_disaster: str | None = None, user_birthday: str | None = None, user_company: str | None = None, user_company_title: str | None = None, user_department: str | None = None, user_ethnicity: str | None = None, user_gender: str | None = None, user_grad_semester: str | None = None, user_grad_year: str | None = None, user_notes: str | None = None, user_comments: str | None = None, user_status: str | None = None, created_at: str | None = None, updated_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModeluserObject – a site user (volunteer, manager or admin).
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.users.UserOneclick(*, link: str | None = None, expires: str | None = None, now: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModeluserOneclickObject – a short-lived passwordless login link.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.users.UserOptouts(*, id: int | None = None, email: str | None = None, optout_areas: list[str] | None = None, date_added: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModeluserOptoutsObject – the message areas a user has opted out of.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.users.UserQualification(*, id: int | None = None, domain_id: int | None = None, qualification_id: int | None = None, qualification_title: str | None = None, status: str | None = None, expires: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModeluserQualificationsObject – one qualification held by a user.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.users.UserResponse(*, id: int | None = None, need_id: int | None = None, date_start: str | None = None, duration: str | None = None, status: str | None = None, created_at: str | None = None, updated_at: str | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModeluserResponseObject – a user’s signup for a need.
- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class get_connected_client.models.users.RegistrationAnswer(*, type: str | None = None, key: str | None = None, area: str | None = None, question_id: int | None = None, question: str | None = None, answer: str | list[str] | None = None, **extra_data: Any)[source]¶
Bases:
GalaxyModelRegistrationResponseAnswerObject – one answer to a registration question.
answeris deliberately widened tostr | list[str]: the read spec types it as a string, but the write shape (and multi-select questions on the wire) send a list of choices. Accepting both keeps a round trip – read, edit, write back – from failing validation.- model_config = {'extra': 'allow', 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].