Masterworks · Authentication Profile

Masterworks Authentication

Authentication

Masterworks secures its APIs with bearer-token across 2 declared security schemes, as derived from its OpenAPI definitions.

ArtArt InvestingAlternative InvestmentsFintechInvestingSecuritiesFractional OwnershipSecondary MarketWealth ManagementRegulation AGraphQL
Methods: bearer-token Schemes: 2 OAuth flows: API key in:

Security Schemes

authenticate
signoutAuth

Source

Authentication Profile

masterworks-authentication.yml Raw ↑
generated: '2026-08-04'
method: probed
source: https://api.masterworks.com/graphql
note: >-
  Derived from the introspected GraphQL schema (graphql/masterworks-schema.graphql) plus live
  anonymous probes. Masterworks publishes no authentication documentation — there is no developer
  portal, no API reference and no auth guide — so nothing here comes from provider docs.

summary:
  types: [bearer-token]
  documented_by_provider: false
  public_developer_credentials: false
  self_serve_api_keys: false
  oauth2: false
  openid_connect: false
  api_key: false
  mutual_tls: false
  scopes: none-published

model: >-
  Authentication is enforced per field by the server-defined @authenticate directive rather than by a
  declared security scheme (GraphQL has no securitySchemes equivalent). Credentials are user session
  tokens issued to Masterworks' own first-party clients; the directive takes a `clients` argument,
  indicating the server also constrains which client application a token was minted for. There is no
  route for a third-party developer to obtain a token: account creation yields an investor session,
  not an API credential.

schemes:
- name: authenticate
  kind: graphql-directive
  locations: [FIELD_DEFINITION]
  args:
  - name: clients
    note: Restricts which first-party client applications may satisfy the guard.
  - name: allowUserToken
    note: Whether an end-user token (as opposed to a service token) satisfies the guard.
  sources: [graphql/masterworks-schema.graphql]
- name: signoutAuth
  kind: graphql-directive
  locations: [FIELD_DEFINITION]
  note: >-
    Guards the pre-account onboarding funnel. The signed-out surface is not anonymous either — the
    `signedOutDashboard` query requires a `userToken: String!` argument, i.e. a funnel token handed
    to the client earlier in the flow.
  sources: [graphql/masterworks-schema.graphql]

observed_failure:
  http_status: 200
  graphql_errors:
  - message: Invalid authentication
    path: [artists]
    extensions:
      reason: invalidToken
      code: invalidAuthentication
      status: 401
  note: >-
    Errors are returned inside a 200 response body per the GraphQL spec; the transport-level status
    the API intends is carried in extensions.status.

unauthenticated_surface:
  introspection: true
  fields:
  - health          # returns "OK" with no credentials
  - testQuery
  note: >-
    Schema introspection and the `health` liveness field answer anonymously. Every other field
    probed returned invalidAuthentication.

well_known:
  openid_configuration: 404 on api.masterworks.com
  oauth_authorization_server: 404 on api.masterworks.com
  note: >-
    www.masterworks.com answers 200 with an identical 8,531-byte single-page-app shell for every
    /.well-known/* path, so those 200s are catch-all false positives, not discovery documents.

x-evidence:
  fetched: '2026-08-04'
  probes:
  - url: https://api.masterworks.com/graphql
    http_status: 200
    note: anonymous introspection succeeded
  - url: https://api.masterworks.com/graphql
    http_status: 200
    note: 'anonymous data query -> code invalidAuthentication (status 401)'
  - url: https://api.masterworks.com/.well-known/openid-configuration
    http_status: 404
  - url: https://api.masterworks.com/.well-known/oauth-authorization-server
    http_status: 404