Documentation / API · Authentication / Explicitly confirm an identity link POST Explicitly confirm an identity link/api/v1/auth/entry/link/confirm
Confirm the displayed sign-in provider connection in the original browser. Supply the verification token or challenge_id and code; if mail_verified is true, an empty object confirms the verified connection.
On this page Access and permissions Parameters and headers Request body Responses Retries and asynchronous work Request examples Related guides Confirm the displayed sign-in provider connection in the original browser. Supply the verification token or challenge_id and code; if mail_verified is true, an empty object confirms the verified connection.
Original login browser: __Host-mb_auth cookie.
Field Location Type and limits Required Meaning Origin Header string; {"format":"uri"} Yes The same HTTPS origin as the public browser site. Required for browser login and provider-start requests.
Field Type and limits Required Meaning $ EntryProof | object Yes — $ (anyOf 1) EntryProof No — $ (anyOf 1) (oneOf 1) object; {"additionalProperties":false} No — $ (anyOf 1) (oneOf 1).token string; {"maxLength":64,"minLength":64,"pattern":"^[0-9a-f]{64}$"} Yes One-time token or access token for the purpose documented by the operation. Treat it as a secret. $ (anyOf 1) (oneOf 2) object; {"additionalProperties":false} No — $ (anyOf 1) (oneOf 2).challenge_id string; {"format":"uuid"} Yes UUID of the challenge issued to this browser or machine request. $ (anyOf 1) (oneOf 2).code string; {"pattern":"^[0-9]{6}$"} Yes — $ (anyOf 2) object No —
200 · Successful response. Header Type and limits Meaning Cache-Control string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation. Content-Language string; {"enum":["en","de"]} Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable. Referrer-Policy JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters. Vary string Responses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie. X-Content-Type-Options JSON; {"const":"nosniff"} The browser must use the declared content type. X-Frame-Options JSON; {"const":"DENY"} The response must not be embedded in a frame. X-Request-ID string Server-generated request identifier. Include this when reporting an error; inbound values are not trusted.
application/json
Field Type and limits Required Meaning $ EntryFlow | EntryAuthenticated Yes — $ (anyOf 1) EntryFlow No — $ (anyOf 1).challenge_id string; {"format":"uuid"} No UUID of the challenge issued to this browser or machine request. $ (anyOf 1).email string; {"format":"email"} Yes Email address of the account or operation target. Confirmation rules depend on the operation. $ (anyOf 1).email_verified boolean Yes — $ (anyOf 1).expires_at string; {"format":"date-time"} Yes Expiry timestamp. A successful request does not extend this deadline unless explicitly documented. $ (anyOf 1).mail_verified boolean Yes — $ (anyOf 1).privacy_version string No SHA-256 version returned for the currently published privacy text. $ (anyOf 1).provider string; {"enum":["","google","github"]} Yes Configured identity provider. Availability must be read from the providers endpoint. $ (anyOf 1).resend_at string; {"format":"date-time"} No — $ (anyOf 1).return_to string Yes Allowed local destination after sign-in. External and unsafe destinations are rejected. $ (anyOf 1).status string; {"enum":["verification_required","consent_required","link_confirmation_required"]} Yes — $ (anyOf 1).terms_version string No SHA-256 version returned for the currently published terms. Retrieve the current text before accepting. $ (anyOf 2) EntryAuthenticated No — $ (anyOf 2).account_id string; {"format":"uuid"} Yes UUID of the owning or acting account, as specified by this operation. $ (anyOf 2).email string; {"format":"email"} Yes Email address of the account or operation target. Confirmation rules depend on the operation. $ (anyOf 2).operator boolean Yes Whether the account has the admin role; this does not bypass action-code or last-admin checks. $ (anyOf 2).return_to string Yes Allowed local destination after sign-in. External and unsafe destinations are rejected. $ (anyOf 2).status JSON; {"const":"authenticated"} Yes —
json Copy example
{
"email" : "demo@example.com" ,
"email_verified" : false ,
"expires_at" : "2026-09-30T12:00:00Z" ,
"mail_verified" : false ,
"provider" : "" ,
"return_to" : "demo" ,
"status" : "verification_required"
} 403 · Request rejected. Inspect the stable problem code. Stable error codes invalid_origin
Header Type and limits Meaning Cache-Control string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation. Content-Language string; {"enum":["en","de"]} Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable. Referrer-Policy JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters. Vary string Responses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie. X-Content-Type-Options JSON; {"const":"nosniff"} The browser must use the declared content type. X-Frame-Options JSON; {"const":"DENY"} The response must not be embedded in a frame. X-Request-ID string Server-generated request identifier. Include this when reporting an error; inbound values are not trusted.
application/problem+json
Field Type and limits Required Meaning $ Problem Yes — $.code string Yes Stable machine-readable error code $.detail string Yes Short localized explanation without internal error details $.instance string Yes Unique relative identifier /api/v1/requests/{request_id}; not a retrievable resource $.message string Yes Temporarily identical to detail for existing clients $.message_key string Yes Stable translation key for changing the displayed language without another request $.message_params object; {"additionalProperties":true} Yes Named, safely rendered message parameters; never arbitrary HTML $.request_id string; {"pattern":"^[0-9a-f]{32}$"} Yes Server-generated diagnostic identifier. It contains no login token or credential. $.status integer; {"maximum":599,"minimum":400} Yes — $.title string Yes Localized HTTP status title $.type string; {"const":"about:blank"} Yes —
json Copy example
{
"code" : "demo" ,
"detail" : "Demo error detail; inspect the documented code." ,
"instance" : "demo" ,
"message" : "Demo error detail; inspect the documented code." ,
"message_key" : "errors.requestFailed" ,
"message_params" : {},
"request_id" : "00000000000000000000000000000000" ,
"status" : 403,
"title" : "Demo error" ,
"type" : "about:blank"
} 409 · Request rejected. Inspect the stable problem code. Stable error codes identity_in_use
Header Type and limits Meaning Cache-Control string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation. Content-Language string; {"enum":["en","de"]} Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable. Referrer-Policy JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters. Vary string Responses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie. X-Content-Type-Options JSON; {"const":"nosniff"} The browser must use the declared content type. X-Frame-Options JSON; {"const":"DENY"} The response must not be embedded in a frame. X-Request-ID string Server-generated request identifier. Include this when reporting an error; inbound values are not trusted.
application/problem+json
Field Type and limits Required Meaning $ Problem Yes — $.code string Yes Stable machine-readable error code $.detail string Yes Short localized explanation without internal error details $.instance string Yes Unique relative identifier /api/v1/requests/{request_id}; not a retrievable resource $.message string Yes Temporarily identical to detail for existing clients $.message_key string Yes Stable translation key for changing the displayed language without another request $.message_params object; {"additionalProperties":true} Yes Named, safely rendered message parameters; never arbitrary HTML $.request_id string; {"pattern":"^[0-9a-f]{32}$"} Yes Server-generated diagnostic identifier. It contains no login token or credential. $.status integer; {"maximum":599,"minimum":400} Yes — $.title string Yes Localized HTTP status title $.type string; {"const":"about:blank"} Yes —
json Copy example
{
"code" : "demo" ,
"detail" : "Demo error detail; inspect the documented code." ,
"instance" : "demo" ,
"message" : "Demo error detail; inspect the documented code." ,
"message_key" : "errors.requestFailed" ,
"message_params" : {},
"request_id" : "00000000000000000000000000000000" ,
"status" : 409,
"title" : "Demo error" ,
"type" : "about:blank"
} 422 · Request rejected. Inspect the stable problem code. Stable error codes invalid_input invalid_entry invalid_code
Header Type and limits Meaning Cache-Control string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation. Content-Language string; {"enum":["en","de"]} Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable. Referrer-Policy JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters. Vary string Responses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie. X-Content-Type-Options JSON; {"const":"nosniff"} The browser must use the declared content type. X-Frame-Options JSON; {"const":"DENY"} The response must not be embedded in a frame. X-Request-ID string Server-generated request identifier. Include this when reporting an error; inbound values are not trusted.
application/problem+json
Field Type and limits Required Meaning $ Problem Yes — $.code string Yes Stable machine-readable error code $.detail string Yes Short localized explanation without internal error details $.instance string Yes Unique relative identifier /api/v1/requests/{request_id}; not a retrievable resource $.message string Yes Temporarily identical to detail for existing clients $.message_key string Yes Stable translation key for changing the displayed language without another request $.message_params object; {"additionalProperties":true} Yes Named, safely rendered message parameters; never arbitrary HTML $.request_id string; {"pattern":"^[0-9a-f]{32}$"} Yes Server-generated diagnostic identifier. It contains no login token or credential. $.status integer; {"maximum":599,"minimum":400} Yes — $.title string Yes Localized HTTP status title $.type string; {"const":"about:blank"} Yes —
json Copy example
{
"code" : "demo" ,
"detail" : "Demo error detail; inspect the documented code." ,
"instance" : "demo" ,
"message" : "Demo error detail; inspect the documented code." ,
"message_key" : "errors.requestFailed" ,
"message_params" : {},
"request_id" : "00000000000000000000000000000000" ,
"status" : 422,
"title" : "Demo error" ,
"type" : "about:blank"
} 429 · Request rejected. Inspect the stable problem code. Stable error codes rate_limited
Header Type and limits Meaning Cache-Control string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation. Content-Language string; {"enum":["en","de"]} Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable. Referrer-Policy JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters. Retry-After string; {"pattern":"^[0-9]+$"} Seconds before retry. Preserve supported idempotency identifiers and respect the operation’s mutation semantics. Vary string Responses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie. X-Content-Type-Options JSON; {"const":"nosniff"} The browser must use the declared content type. X-Frame-Options JSON; {"const":"DENY"} The response must not be embedded in a frame. X-Request-ID string Server-generated request identifier. Include this when reporting an error; inbound values are not trusted.
application/problem+json
Field Type and limits Required Meaning $ Problem Yes — $.code string Yes Stable machine-readable error code $.detail string Yes Short localized explanation without internal error details $.instance string Yes Unique relative identifier /api/v1/requests/{request_id}; not a retrievable resource $.message string Yes Temporarily identical to detail for existing clients $.message_key string Yes Stable translation key for changing the displayed language without another request $.message_params object; {"additionalProperties":true} Yes Named, safely rendered message parameters; never arbitrary HTML $.request_id string; {"pattern":"^[0-9a-f]{32}$"} Yes Server-generated diagnostic identifier. It contains no login token or credential. $.status integer; {"maximum":599,"minimum":400} Yes — $.title string Yes Localized HTTP status title $.type string; {"const":"about:blank"} Yes —
json Copy example
{
"code" : "demo" ,
"detail" : "Demo error detail; inspect the documented code." ,
"instance" : "demo" ,
"message" : "Demo error detail; inspect the documented code." ,
"message_key" : "errors.requestFailed" ,
"message_params" : {},
"request_id" : "00000000000000000000000000000000" ,
"status" : 429,
"title" : "Demo error" ,
"type" : "about:blank"
} 503 · Request rejected. Inspect the stable problem code. Stable error codes auth_unavailable
Header Type and limits Meaning Cache-Control string; {"pattern":"(?:^|,\\s*)no-store(?:,|$)"} Private API responses prohibit storage. Public OAuth metadata is cached for 300 seconds; live streams additionally prohibit transformation. Content-Language string; {"enum":["en","de"]} Language of human-readable response text, resolved from Accept-Language or the documented browser preference. Technical codes and identifiers remain stable. Referrer-Policy JSON; {"enum":["strict-origin-when-cross-origin","no-referrer"]} The default referrer policy is strict-origin-when-cross-origin. Provider-login responses use no-referrer to protect login parameters. Retry-After string; {"pattern":"^[0-9]+$"} Seconds before retry. Preserve supported idempotency identifiers and respect the operation’s mutation semantics. Vary string Responses vary by Accept-Language; browser-rendered responses can also vary by the preference cookie. X-Content-Type-Options JSON; {"const":"nosniff"} The browser must use the declared content type. X-Frame-Options JSON; {"const":"DENY"} The response must not be embedded in a frame. X-Request-ID string Server-generated request identifier. Include this when reporting an error; inbound values are not trusted.
application/problem+json
Field Type and limits Required Meaning $ Problem Yes — $.code string Yes Stable machine-readable error code $.detail string Yes Short localized explanation without internal error details $.instance string Yes Unique relative identifier /api/v1/requests/{request_id}; not a retrievable resource $.message string Yes Temporarily identical to detail for existing clients $.message_key string Yes Stable translation key for changing the displayed language without another request $.message_params object; {"additionalProperties":true} Yes Named, safely rendered message parameters; never arbitrary HTML $.request_id string; {"pattern":"^[0-9a-f]{32}$"} Yes Server-generated diagnostic identifier. It contains no login token or credential. $.status integer; {"maximum":599,"minimum":400} Yes — $.title string Yes Localized HTTP status title $.type string; {"const":"about:blank"} Yes —
json Copy example
{
"code" : "demo" ,
"detail" : "Demo error detail; inspect the documented code." ,
"instance" : "demo" ,
"message" : "Demo error detail; inspect the documented code." ,
"message_key" : "errors.requestFailed" ,
"message_params" : {},
"request_id" : "00000000000000000000000000000000" ,
"status" : 503,
"title" : "Demo error" ,
"type" : "about:blank"
} This change does not have a general retry guarantee. If the response is unclear, read the affected resource before trying again. Follow Retry-After waiting times and request new sign-in or action codes when they expire.
Replace demo IDs, timestamps and placeholders with your own values. For a retry, keep the same IDs, time and content. These examples do not run requests on this page.
Keep login links, codes, cookies and keys private. Do not print them in logs or share them in support requests.
shell Copy example
curl --silent --show-error --output /dev/ null --write-out "%{http_code}\n" \
--request POST \
--header @ "$HOME/.config/metribeacon/headers.txt" \
--header "Origin: https://metribeacon.com" \
--header "Content-Type: application/json" \
--data-binary '{"token":"0000000000000000000000000000000000000000000000000000000000000000"}' \
"https://metribeacon.com/api/v1/auth/entry/link/confirm"
python Copy example
import json
from pathlib import Path
from urllib.request import Request, HTTPRedirectHandler, build_opener
from urllib.error import HTTPError
headers = json.loads((Path.home() / ".config/metribeacon/headers.json" ).read_text())
headers[ "Origin" ] = "https://metribeacon.com"
headers[ "Content-Type" ] = "application/json"
request = Request( "https://metribeacon.com/api/v1/auth/entry/link/confirm" , data= "{\"token\":\"0000000000000000000000000000000000000000000000000000000000000000\"}" .encode( "utf-8" ), headers=headers, method= "POST" )
class NoRedirect(HTTPRedirectHandler):
def redirect_request(self, request, fp, code, message, headers, target):
return None
opener = build_opener(NoRedirect())
try:
with opener.open(request, timeout=10) as response:
print(response.status)
except HTTPError as error:
print(error.code)
error.close()
javascript Copy example
import { readFile } from "node:fs/promises" ;
import { homedir } from "node:os" ;
import { join } from "node:path" ;
const headers = JSON.parse(await readFile(join(homedir(), ".config/metribeacon/headers.json" ), "utf8" ));
headers[ "Origin" ] = "https://metribeacon.com" ;
headers[ "Content-Type" ] = "application/json" ;
const response = await fetch( "https://metribeacon.com/api/v1/auth/entry/link/confirm" , {
method: "POST" , headers, redirect: "manual" ,
signal: AbortSignal.timeout(10000), body: "{\"token\":\"0000000000000000000000000000000000000000000000000000000000000000\"}" ,
});
console.log(response.status);
await response.body?.cancel();
go Copy example
package main
import (
"fmt"
"net/http"
"time"
"encoding/json"
"os"
"path/filepath"
"strings"
)
func main() {
home, err := os.UserHomeDir(); if err != nil { panic( "request failed; credentials and response omitted" ) }
raw, err := os.ReadFile(filepath.Join(home, ".config/metribeacon/headers.json" )); if err != nil { panic( "request failed; credentials and response omitted" ) }
var headers map[string]string
if json.Unmarshal(raw, &headers) != nil { panic( "invalid local headers" ) }
request, err := http.NewRequest( "POST" , "https://metribeacon.com/api/v1/auth/entry/link/confirm" , strings.NewReader( "{\"token\":\"0000000000000000000000000000000000000000000000000000000000000000\"}" ))
if err != nil { panic( "request failed; credentials and response omitted" ) }
for name, value := range headers { request.Header.Set(name, value) }
request.Header.Set( "Origin" , "https://metribeacon.com" )
request.Header.Set( "Content-Type" , "application/json" )
client := &http.Client{Timeout: 10*time.Second, CheckRedirect: func (*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
response, err := client.Do(request)
if err != nil { panic( "request failed; credentials and response omitted" ) }
defer response.Body.Close()
fmt.Println(response.StatusCode)
}
Related guides HTTP API, OAuth and MCP Find the user API endpoints, their permissions, fields, examples and response formats.
DELETE Cancel the browser entry flowCancels outstanding email challenges and the browser-bound entry flow, then clears its pre-authentication cookie. It does not revoke an existing application session. Requires the allowed browser origin.
GET Read the current browser entry stepReads the flow bound to __Host-mb_auth without creating an application session. Missing, expired, completed or cancelled flows return status idle. Active flows describe verification, consent or explicit identity linking.
POST Accept current legal documents and finish entryComplete sign-up after identity verification by accepting the current terms and acknowledging the privacy notice. A successful response creates the browser session. New accounts require open registration.