curl --request POST \
--url https://api.cloud.corbado.io/v1/observe/identifierSearch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"identifiers": [
{
"value": "<string>"
}
],
"userIDs": [
"<string>"
],
"externalIDs": [
"<string>"
],
"flowIDs": [
"<string>"
],
"page": 1,
"pageSize": 25
}
'import requests
url = "https://api.cloud.corbado.io/v1/observe/identifierSearch"
payload = {
"identifiers": [{ "value": "<string>" }],
"userIDs": ["<string>"],
"externalIDs": ["<string>"],
"flowIDs": ["<string>"],
"page": 1,
"pageSize": 25
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
identifiers: [{value: '<string>'}],
userIDs: ['<string>'],
externalIDs: ['<string>'],
flowIDs: ['<string>'],
page: 1,
pageSize: 25
})
};
fetch('https://api.cloud.corbado.io/v1/observe/identifierSearch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cloud.corbado.io/v1/observe/identifierSearch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'identifiers' => [
[
'value' => '<string>'
]
],
'userIDs' => [
'<string>'
],
'externalIDs' => [
'<string>'
],
'flowIDs' => [
'<string>'
],
'page' => 1,
'pageSize' => 25
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cloud.corbado.io/v1/observe/identifierSearch"
payload := strings.NewReader("{\n \"identifiers\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"userIDs\": [\n \"<string>\"\n ],\n \"externalIDs\": [\n \"<string>\"\n ],\n \"flowIDs\": [\n \"<string>\"\n ],\n \"page\": 1,\n \"pageSize\": 25\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cloud.corbado.io/v1/observe/identifierSearch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"identifiers\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"userIDs\": [\n \"<string>\"\n ],\n \"externalIDs\": [\n \"<string>\"\n ],\n \"flowIDs\": [\n \"<string>\"\n ],\n \"page\": 1,\n \"pageSize\": 25\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloud.corbado.io/v1/observe/identifierSearch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"identifiers\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"userIDs\": [\n \"<string>\"\n ],\n \"externalIDs\": [\n \"<string>\"\n ],\n \"flowIDs\": [\n \"<string>\"\n ],\n \"page\": 1,\n \"pageSize\": 25\n}"
response = http.request(request)
puts response.read_body[
{
"identifierID": "<string>",
"identifierType": "email",
"identifierValue": "<string>",
"subFlowID": "<string>",
"subFlowType": "<string>",
"matchReason": "identifier",
"createdMs": 123,
"flowID": "<string>",
"flowUserID": "<string>",
"flowUserStatus": "confirmed",
"linkedUserID": "<string>"
}
]{
"error": {
"message": "Validation failed",
"details": [
{
"field": "projectID",
"message": "required"
}
]
}
}Search identifier submissions
Finds the identifiers (email, phone number, username) users submitted during authentication, including rejected and failed attempts. Search by identifier to find every attempt that targeted an account, or by user to find the attempts with identifiers linked to that user. Each result states why it matched. A submitted identifier shows which account an attempt targeted, not who made it.
Required API key permission: observe:identifier:read.
curl --request POST \
--url https://api.cloud.corbado.io/v1/observe/identifierSearch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"identifiers": [
{
"value": "<string>"
}
],
"userIDs": [
"<string>"
],
"externalIDs": [
"<string>"
],
"flowIDs": [
"<string>"
],
"page": 1,
"pageSize": 25
}
'import requests
url = "https://api.cloud.corbado.io/v1/observe/identifierSearch"
payload = {
"identifiers": [{ "value": "<string>" }],
"userIDs": ["<string>"],
"externalIDs": ["<string>"],
"flowIDs": ["<string>"],
"page": 1,
"pageSize": 25
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
identifiers: [{value: '<string>'}],
userIDs: ['<string>'],
externalIDs: ['<string>'],
flowIDs: ['<string>'],
page: 1,
pageSize: 25
})
};
fetch('https://api.cloud.corbado.io/v1/observe/identifierSearch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cloud.corbado.io/v1/observe/identifierSearch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'identifiers' => [
[
'value' => '<string>'
]
],
'userIDs' => [
'<string>'
],
'externalIDs' => [
'<string>'
],
'flowIDs' => [
'<string>'
],
'page' => 1,
'pageSize' => 25
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.cloud.corbado.io/v1/observe/identifierSearch"
payload := strings.NewReader("{\n \"identifiers\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"userIDs\": [\n \"<string>\"\n ],\n \"externalIDs\": [\n \"<string>\"\n ],\n \"flowIDs\": [\n \"<string>\"\n ],\n \"page\": 1,\n \"pageSize\": 25\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.cloud.corbado.io/v1/observe/identifierSearch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"identifiers\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"userIDs\": [\n \"<string>\"\n ],\n \"externalIDs\": [\n \"<string>\"\n ],\n \"flowIDs\": [\n \"<string>\"\n ],\n \"page\": 1,\n \"pageSize\": 25\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloud.corbado.io/v1/observe/identifierSearch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"identifiers\": [\n {\n \"value\": \"<string>\"\n }\n ],\n \"userIDs\": [\n \"<string>\"\n ],\n \"externalIDs\": [\n \"<string>\"\n ],\n \"flowIDs\": [\n \"<string>\"\n ],\n \"page\": 1,\n \"pageSize\": 25\n}"
response = http.request(request)
puts response.read_body[
{
"identifierID": "<string>",
"identifierType": "email",
"identifierValue": "<string>",
"subFlowID": "<string>",
"subFlowType": "<string>",
"matchReason": "identifier",
"createdMs": 123,
"flowID": "<string>",
"flowUserID": "<string>",
"flowUserStatus": "confirmed",
"linkedUserID": "<string>"
}
]{
"error": {
"message": "Validation failed",
"details": [
{
"field": "projectID",
"message": "required"
}
]
}
}Authorizations
Use an Observe API key from the management console. The key selects the project and must grant the permission listed on the operation. Keep this key on your server.
Body
Identifiers to search for. Without a type, values of every type match. Mutually exclusive with the user selectors.
Show child attributes
Show child attributes
User IDs (format tus-<number>). Returns the submissions of all identifiers linked to these
users. Mutually exclusive with other selectors.
External user IDs. Returns the submissions of all identifiers linked to these users. Mutually exclusive with other selectors.
Flow IDs (format flw-<number>). Returns every submission made in these flows, whichever
user an identifier is linked to. Mutually exclusive with other selectors.
Page number for pagination (1-based). Defaults to 1.
x >= 1Number of items per page. Defaults to 25, maximum 1000.
1 <= x <= 1000Response
Identifier submissions matching the search, ordered by submission time (newest first).
Identifier ID (format idf-<number>)
Identifier type as sent by the integration.
email, phone, username, unknown Identifier as sent by the integration
Subflow of the submission (format sfl-<number>)
Subflow type that carried the identifier, e.g. provide-identifier
Why the submission matched: identifier (searched identifier), ownFlow (identifier linked
to a searched user, submitted in one of that user's flows), linkedIdentifier (identifier
linked to a searched user, submitted in another user's flow) or flow (submitted in a
searched flow).
identifier, ownFlow, linkedIdentifier, flow Submission time in milliseconds since epoch
Flow of the submission (format flw-<number>)
User the flow is attributed to (format tus-<number>). For failed attempts this is often a
temporary user.
Status of the flow's user: confirmed when the integration identified the user, temporary
for an anonymous attempt attributed to its device. Absent when the flow has no user.
confirmed, temporary Set when this submission links the identifier to a user (format tus-<number>): the last
finished submission before a successful login that verified this identifier.
Was this page helpful?