spicrawl-com · Schema
Session
A session as every session endpoint reports it. Never contains cookies.
CompanyWeb ScrapingData ExtractionAPIAutomationAI
Properties
| Name | Type | Description |
|---|---|---|
| id | string | Session id (26-character ULID). Pass it as `session_id` on `/v1/scrape`. |
| project_id | string | Project the session belongs to (the creating key's project). |
| engine | object | |
| status | string | Derived from the clock, not a stored flag. `active` sessions can be used; `released` and `expired` ones have no context and cannot be revived. Create a new session. |
| sticky_key | string | Exit pin in use. The lowercase session id when you did not set one; empty string when `rotate_ip` was set. |
| proxy | object | |
| created_at | string | Creation time, RFC 3339 UTC. |
| last_used_at | stringnull | Last time a successful scrape used the session. Null means never used. |
| expires_at | string | Current expiry. Each successful scrape moves it to that time + the session's `ttl_seconds` (never earlier than it was, never past `hard_expires_at`). After it passes the context is purged. |
| hard_expires_at | string | Fixed ceiling set at creation from the organization's maximum TTL. Plan a re-login before this time. Omitted only for legacy rows. |
| released_at | string | When the session was released. Present only on released sessions. |
| usage_count | integer | Number of successful scrapes that have used the session. Failed scrapes and `/context` reads do not count. |
| context | object | Size summary of the stored context. Null once the session is not active (the context has been purged). |
| retired | string | Why a worker took this session out of service. Absent while usable. A retired session should be replaced. |
| domain_scores | object | Per-domain block evidence the workers maintain. Omitted when empty. |
| fingerprint | object | Browser fingerprint, as stored. Omitted when none was set. |
| lease | object | |
| warnings | array | Decisions made on your behalf at creation, e.g. a TTL reduced to the organization maximum. Only on the create response; omitted when empty. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/spicrawl-com/json-schema/spicrawl-com-session-schema.json",
"title": "Session",
"description": "A session as every session endpoint reports it. Never contains cookies.",
"x-generated": "2026-10-31",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/spicrawl-com-openapi.yaml#/components/schemas/Session",
"type": "object",
"required": [
"id",
"project_id",
"status",
"sticky_key",
"proxy",
"created_at",
"last_used_at",
"expires_at",
"usage_count",
"context"
],
"properties": {
"id": {
"type": "string",
"description": "Session id (26-character ULID). Pass it as `session_id` on `/v1/scrape`."
},
"project_id": {
"type": "string",
"description": "Project the session belongs to (the creating key's project)."
},
"engine": {
"$ref": "#/$defs/SessionEngine"
},
"status": {
"type": "string",
"enum": [
"active",
"released",
"expired"
],
"description": "Derived from the clock, not a stored flag. `active` sessions can be used; `released` and `expired` ones have no context and cannot be revived. Create a new session."
},
"sticky_key": {
"type": "string",
"description": "Exit pin in use. The lowercase session id when you did not set one; empty string when `rotate_ip` was set."
},
"proxy": {
"$ref": "#/$defs/SessionProxy"
},
"created_at": {
"type": "string",
"format": "date-time",
"description": "Creation time, RFC 3339 UTC."
},
"last_used_at": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "Last time a successful scrape used the session. Null means never used."
},
"expires_at": {
"type": "string",
"format": "date-time",
"description": "Current expiry. Each successful scrape moves it to that time + the session's `ttl_seconds` (never earlier than it was, never past `hard_expires_at`). After it passes the context is purged."
},
"hard_expires_at": {
"type": "string",
"format": "date-time",
"description": "Fixed ceiling set at creation from the organization's maximum TTL. Plan a re-login before this time. Omitted only for legacy rows."
},
"released_at": {
"type": "string",
"format": "date-time",
"description": "When the session was released. Present only on released sessions."
},
"usage_count": {
"type": "integer",
"minimum": 0,
"description": "Number of successful scrapes that have used the session. Failed scrapes and `/context` reads do not count."
},
"context": {
"oneOf": [
{
"$ref": "#/$defs/SessionContextSummary"
},
{
"type": "null"
}
],
"description": "Size summary of the stored context. Null once the session is not active (the context has been purged)."
},
"retired": {
"type": "string",
"enum": [
"expired",
"usage_exhausted",
"explicit"
],
"description": "Why a worker took this session out of service. Absent while usable. A retired session should be replaced."
},
"domain_scores": {
"type": "object",
"description": "Per-domain block evidence the workers maintain. Omitted when empty.",
"additionalProperties": {
"$ref": "#/$defs/SessionDomainScore"
}
},
"fingerprint": {
"type": "object",
"description": "Browser fingerprint, as stored. Omitted when none was set."
},
"lease": {
"$ref": "#/$defs/SessionLease"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
},
"description": "Decisions made on your behalf at creation, e.g. a TTL reduced to the organization maximum. Only on the create response; omitted when empty."
}
},
"$defs": {
"SessionContextSummary": {
"type": "object",
"required": [
"schema_version",
"cookies",
"origins",
"bytes"
],
"description": "Non-secret counts describing the stored context.",
"properties": {
"schema_version": {
"type": "integer",
"description": "Stored context format version. Currently 1."
},
"cookies": {
"type": "integer",
"minimum": 0,
"description": "Number of cookies stored."
},
"origins": {
"type": "integer",
"minimum": 0,
"description": "Distinct origins across local storage, session storage and IndexedDB."
},
"bytes": {
"type": "integer",
"minimum": 0,
"maximum": 1048576,
"description": "Serialised plaintext size in bytes. The limit is 1048576."
}
}
},
"SessionDomainScore": {
"type": "object",
"required": [
"score",
"good",
"bad",
"last_updated",
"retired"
],
"description": "One domain's standing with the session. At a score of 3 or with `retired` true, the session is treated as blocked for that domain.",
"properties": {
"score": {
"type": "number",
"minimum": 0,
"description": "Error score; rises on failures, decays on successes. Blocked at 3."
},
"good": {
"type": "integer",
"minimum": 0,
"description": "Successful requests counted."
},
"bad": {
"type": "integer",
"minimum": 0,
"description": "Failed requests counted."
},
"last_updated": {
"type": "integer",
"format": "int64",
"description": "Last update in Unix milliseconds."
},
"retired": {
"type": "boolean",
"description": "Hard, sticky block for this domain (e.g. a 403 wall). Does not decay; use a new session for this domain."
}
}
},
"SessionEngine": {
"type": "string",
"enum": [
"fetch",
"js",
"browser"
],
"description": "The rendering tier a session is bound to for its lifetime (`fetch` is HTTP only, `js` is JavaScript rendering, `browser` is full-browser rendering). Chosen automatically when the session is created unless the create names one."
},
"SessionLease": {
"type": "object",
"required": [
"expires_at"
],
"description": "Present only while a render holds the single-writer lease. While present, other scrapes, release and delete get 409 `ERR::SESSION::BUSY`.",
"properties": {
"holder": {
"type": "string",
"description": "Identifier of the worker holding the lease. Diagnostic only."
},
"expires_at": {
"type": "string",
"format": "date-time",
"description": "When the lease lapses at the latest. Retry after this time."
}
}
},
"SessionProxy": {
"type": "object",
"required": [
"tier"
],
"description": "The session's exit intent. Not an endpoint or IP.",
"properties": {
"tier": {
"type": "string",
"enum": [
"none",
"datacenter",
"residential"
],
"description": "Exit tier. `residential` when created with `premium_proxy`, otherwise `datacenter`. `none` is reserved and not produced by the create endpoint."
},
"country": {
"type": "string",
"description": "Lowercase alpha-2 exit country. Omitted when no country was requested."
},
"region_pool": {
"type": "string",
"description": "Regional pool requested at creation. Omitted when none."
}
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/spicrawl-com-session"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.