const url = 'https://app.caprid.com/v1/login';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"email":"hello@example.com","password":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://app.caprid.com/v1/login \ --header 'Content-Type: application/json' \ --data '{ "email": "hello@example.com", "password": "example" }'Exchanges an email and password for a session cookie. Sessions last 14 days. Scripts should use an API key instead.
Failed logins are limited to 10 per 15 minutes, counted separately per email and per client address.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Example generated
{ "email": "hello@example.com", "password": "example"}Responses
Section titled “Responses”Logged in.
object
object
The person signed in. Absent for an API key.
When the person signed up. Absent for an API key.
The API key making the call, with its namespaces limit if it
has one. A limited key can’t list its Organization’s Namespaces,
so this is how it finds the ones it can reach. Absent for a
session.
object
Identifies the key for revoking it. Not a secret.
The first 6 characters of the secret after sb_, so you can tell keys apart.
Absent for a key that never expires.
Absent for a key that has never been used.
The Namespaces the key is limited to, by name. Absent for a key
with no limit. A deleted Namespace drops out, so a key whose
Namespaces have all been deleted has [] here and can do nothing.
A customer of Switchboard. It owns its Namespaces, and the API keys, Nodes and enrollments that serve them. Its Members manage all of it.
object
Identifies the Organization in routes. It never changes.
For display. Any Member can change it.
Your role in it. Absent for an API key, which has none.
When a Trial Organization lapses, so its Agent knows how long it has to get a person to claim it. Absent for every other Organization.
The one Namespace you can reach, as this reported before Organizations. Absent unless you reach exactly one.
That Namespace’s platform_peering. Absent along with namespace.
Example
{ "account": { "api_key": { "id": "3f9a1c07be42", "namespaces": [ "acme-staging" ] }, "organizations": [ { "id": 4, "name": "Acme", "role": "owner", "trial_expires_at": 1760604800 } ], "namespace": "acme" }}Headers
Section titled “Headers”__Host-switchboard_session over HTTPS, switchboard_session over plain HTTP: HttpOnly, SameSite=Lax, Path=/, valid for 14 days.
The request is malformed or a field is invalid. The message says which.
object
Example
{ "error": "the requested grants exceed the key's scope"}The email and password don’t match an Account. The response is the same whether or not the email exists.
object
Example
{ "error": "the requested grants exceed the key's scope"}This server logs people in through WorkOS, and passwords no longer work.
object
Example
{ "error": "the requested grants exceed the key's scope"}Rate limited. Try again later.
object
Example
{ "error": "the requested grants exceed the key's scope"}