Sense Street · Authentication Profile
Sense Street Authentication
Authentication
Sense Street secures its APIs with http across 2 declared security schemes, as derived from its OpenAPI definitions.
CompanyCapital MarketsTradingArtificial IntelligenceFintechConversation IntelligenceOTCMarket DataNatural Language ProcessingCommoditiesFixed Income
Methods: http
Schemes: 2
OAuth flows:
API key in: header
Security Schemes
BearerJWT http
scheme: bearer
· in: header ()
XKeyPublicKey apiKey
· in: header ()
Source
Authentication Profile
generated: '2026-08-14'
method: derived
source: >-
src/sensestreet/auth_header_builder.py in the first-party PyPI package
`sensestreet` 1.0.16 (published 2025-10-07), plus the published description of
https://docs.sensestreet.com/authentication
docs: https://docs.sensestreet.com/authentication
docs_gated: true
summary:
types: [http]
scheme: bearer
bearer_format: JWT
signing_algorithm: RS256
key_model: client-held RSA key pair, public key registered with Sense Street
api_key_in: [header]
oauth2_flows: []
note: >-
Sense Street does NOT run OAuth 2.0 or OIDC. There is no authorization
server, no /.well-known/openid-configuration, and no scope surface — so this
repo carries no scopes/ artifact. Authentication is a client-signed JWT
bearer assertion: the customer generates an RSA key pair, registers the
public key with Sense Street, and the SDK mints a short-lived RS256 JWT
locally for every request. That is a self-issued assertion model, not a
token-grant model.
schemes:
- name: BearerJWT
type: http
scheme: bearer
bearerFormat: JWT
algorithm: RS256
in: header
header: Authorization
value_format: 'Bearer <RS256 JWT signed with the client private key>'
token_lifetime_seconds: 900
not_before_skew_seconds: -300
claims:
- {claim: exp, meaning: expiry, value: now + 15 minutes}
- {claim: nbf, meaning: not before, value: now - 5 minutes}
- {claim: aud, meaning: audience, value: api.sensestreet.com}
- {claim: application_id, meaning: the customer app id issued by Sense Street}
- {claim: public_key_id, meaning: identifies which registered public key signed this, default 'default.pub'}
- {claim: server_id, meaning: target server identifier, default 'default'}
- {claim: server_role, meaning: target server role, default 'default'}
source: packages/sense-street-packages.yml
- name: XKeyPublicKey
type: apiKey
in: header
header: X-key
value_format: PEM-encoded RSA public key
required: false
description: >-
The client's RSA PUBLIC key is sent verbatim in the X-key header alongside
the signed bearer token, so the server can verify the assertion without a
prior key exchange for that request. Sending a public key is not a secret
disclosure.
source: packages/sense-street-packages.yml
network_controls:
- control: vpn
description: >-
"Enterprise API access is secured with VPN connectivity" — published on the
Sense Street authentication docs page description.
source: https://docs.sensestreet.com/authentication
- control: ip-allowlisting
description: >-
Static source IPs are allowlisted per customer; the implementation page
states integration requires "secure API integration with static IPs and
authentication".
source: https://docs.sensestreet.com/implementation-data-requirements
- control: edge-auth-gate
description: >-
Observed live: every path under /api/ on portal.sensestreet.com returns
HTTP 401 with the plain-text body "Invalid or missing token", including
/api/v1/openapi.json, /api/v1/docs and /api/v1/redoc. The gate is applied at
the nginx edge ahead of the application, so unauthenticated callers cannot
enumerate the surface.
source: probed 2026-08-14
always_sent_headers:
- {header: Authorization, note: only when a private key is configured}
- {header: X-key, note: PEM public key, only when a public key path is configured}
- {header: X-client-version, note: SDK version string, e.g. 1.0.16}
- {header: Date, note: 'client local timestamp, format MM/DD/YYYY, HH:MM:SS'}
- {header: Content-Type, note: application/json except on multipart file uploads}
dashboard_authentication:
method: sso
description: >-
The Sense Street dashboard (portal.sensestreet.com) is separate from the API
and uses Single Sign-On with role-based access control and MFA. Google
Identity Services is loaded on the portal login page.
source: https://docs.sensestreet.com/dashboard-authentication
x-evidence:
- url: https://pypi.org/pypi/sensestreet/json
status: 200
- url: https://docs.sensestreet.com/authentication
status: 200
note: page renders, body content requires sign-in; the published meta description is the readable part
- url: https://portal.sensestreet.com/api/v1/ping
status: 401
note: 'body "Invalid or missing token"'