GET, POST, PATCH, and DELETE. Other related conventions are described below.
JSON Conventions
- Resources are addressable by a UUID
idproperty. - Property names are always in
snake_case. - Temporal data is encoded in ISO 8601 strings.
- Monetary amounts are integers in the minor units of the transaction currency (e.g.
14999= €149.99). - Currencies are ISO 4217 codes.
Empty Strings and Omitted Fields
The empty string is not a value. A string field is either omitted or present with a real value — and where a field is nullable, an explicitnull unsets it. Never send "".
Where a field is validated as a string, "" is rejected with 422 Unprocessable Entity and a field error
on that path (see Request Errors for the response format). Not every field carries that
validation, so do not treat the rejection as a safety net: where it is absent, "" is accepted and then
stored or forwarded verbatim — an empty string travels further into a request than a missing field ever does.
In Specter, omission also shapes the evaluation itself. A field you omit — or send as null — resolves to
absent in $.-path rule conditions: every predicate over it
abstains, neq and not_in included, so a “not equal” rule never fires on data you never sent. An
empty string or empty array counts as present. Omission also changes derived values: a masked_pan
credential sent without expiry_month and expiry_year yields a different credential_fingerprint than
the same card sent with them, so velocity counts and blacklist entries keyed on $.credential_fingerprint
do not line up across the two.
Authentication
Specter authenticates every request with a signed JSON Web Token (JWT) passed as a bearer token in theAuthorization header. This OAuth2 bearer scheme is the standard across the Hellgate Cloud Platform
services — see Authentication.
API Use
Instance URL
Specter is provided as a service of the Hellgate Cloud Platform implementing the Composable Payment Architecture (CPA). Each instance is accessible at a unique host:{instance} is your unique instance slug and eu1 is the current environment; both are provided during onboarding.
Pagination
Endpoints that return lists of objects support pagination. Specter uses cursor-based pagination with the following query parameters:
Example request:
data and includes a links object for paging forward:
links.next is null.
Request IDs
Every response carries anx-request-id header. Send your own UUID in the same header to
correlate requests with your logs, and include the ID when you contact support. See
Request IDs.
Request Errors
Specter uses standard HTTP status codes to indicate client errors on the API level.- Errors - HTTP 4xx
- Validation Errors - HTTP 422
The response payload for processing errors follows a standard format.
Security Considerations
Specter evaluates sensitive payment data and requires strict security practices:- All communication must use HTTPS.
- Bearer tokens must be stored securely and never exposed to clients.
- The full PAN supplied in a decision request is never persisted. It is used for evaluation and fingerprinting and forwarded to the backends your rulesets invoke — see what a backend receives.
Data Classification
Fields that carry regulated data are marked with a classification pill next to the parameter name in this reference. The marker tells you what kind of data the field holds, so you can see at a glance which parts of a payload attract handling obligations before you write any code against them.
Most fields carry no marker at all. The absence of one is a statement that the field holds none of the
categories above — not that the field has yet to be reviewed. Masked and truncated card numbers are the
common example:
411111 •••••• 1111 identifies nobody on its own, so it carries no marker.
The marker is also a gate, not just a label. Sending values into pci-pan or pci-sad fields requires your
PCI DSS certification on file at SAQ-D or a full Report on Compliance (RoC). Sending
personal data into pii fields requires a data processing
agreement (DPA) between us. Contact support@hellgate.io to put either in place
or to learn more.