SchoolScout API
Unlock

Unlock entities

Spend credits to unlock entity intelligence or contact PII. Idempotent: unlocking an already-unlocked entity costs 0 credits. If an entity hasn't been scouted yet, this triggers the scouting pipeline. **Contact unlock requires the parent district or school to be unlocked first.** If the parent is locked, the response will be 403 PARENT_ENTITY_LOCKED. **Credit costs:** District (6), School (6), Contact (2)

POST
/unlock

Spend credits to unlock entity intelligence or contact PII. Idempotent: unlocking an already-unlocked entity costs 0 credits. If an entity hasn't been scouted yet, this triggers the scouting pipeline.

Contact unlock requires the parent district or school to be unlocked first. If the parent is locked, the response will be 403 PARENT_ENTITY_LOCKED.

Credit costs: District (6), School (6), Contact (2)

AuthorizationBearer <token>

API key (sk_live_... prefix). Generate keys in the UI under Settings > API Keys, then send it as Authorization: Bearer sk_live_...

In: header

Request Body

application/json

entity_type?string

Type of entity to unlock

Value in"district" | "school" | "contact"
entity_id?string

Single entity UUID (for single unlock)

entities?array<>

Array of entities (for bulk unlock)

channel?string
Value in"dashboard" | "mcp" | "api"

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://loading/api/v1/unlock" \  -H "Content-Type: application/json" \  -d '{}'
{
  "unlocked": true,
  "credits_charged": 0,
  "credits_remaining": 0,
  "already_unlocked": true
}
{
  "error": "string",
  "message": "string",
  "statusCode": -9007199254740991
}
{
  "error": "string",
  "message": "string",
  "balance": 0,
  "required": 0
}
{
  "error": "PARENT_ENTITY_LOCKED",
  "message": "string",
  "parent_entity_type": "district",
  "parent_entity_id": "550e8400-e29b-41d4-a716-446655440000",
  "unlock_cost": 0
}