NDA status

Check whether a Hack Club member has signed the current NDA. No authentication is required.

OpenAPI 3.1 specification
GET /api/v1/nda_status/:info

Replace :info with a Slack ID or URL-encoded email address.

Examples

Slack ID

GET /api/v1/nda_status/U0123ABCDEF

Email

GET /api/v1/nda_status/orpheus%40example.com

Slack IDs begin with U or W. Emails are case-insensitive; encode @ as %40.

Email lookup checks signing and verified account emails. Email responses omit slack_id and are not cached.

Responses

Signed

200 OK

An approved current signature or legacy import returns signed.

{
  "slack_id": "U0123ABCDEF",
  "status": "signed",
  "nda_version": "2026-09-17",
  "signed_at": "2025-04-02T15:04:05Z",
  "signature_type": "native"
}

Not signed

200 OK

Unknown or unsigned members return not_signed, without signing details.

{
  "slack_id": "U0123ABCDEF",
  "status": "not_signed",
  "nda_version": "2026-09-17"
}

Invalid input

400 Bad Request

Malformed Slack IDs return invalid_slack_id; malformed emails containing @ return invalid_email.

{
  "error": "invalid_slack_id"
}

Rate limit

429 Too Many Requests

Each client IP may make up to 10 requests per second across the site. Additional requests receive 429 Too Many Requests with a Retry-After header.

Every API response, including errors, reports the budget after the request:

  • RateLimit-Limit: requests allowed per window.
  • RateLimit-Remaining: requests left the current window.
  • RateLimit-Reset: seconds until the window resets
  • RateLimit-Policy and RateLimit: the same quota and budget in the IETF draft format

The budget is shared across the site by client IP, including failed requests. When remaining reaches zero, wait for reset. On a 429, wait at least Retry-After seconds before retrying. Concurrent requests may consume the remaining budget.

HTTP/1.1 200 OK
RateLimit-Limit: 10
RateLimit-Remaining: 9
RateLimit-Reset: 1
RateLimit-Policy: "requests-per-ip";q=10;w=1
RateLimit: "requests-per-ip";r=9;t=1
HTTP/1.1 429 Too Many Requests
Content-Type: text/plain
RateLimit-Limit: 10
RateLimit-Remaining: 0
RateLimit-Reset: 1
RateLimit-Policy: "requests-per-ip";q=10;w=1
RateLimit: "requests-per-ip";r=0;t=1
Retry-After: 1

Retry later