curl --request POST \
--url https://api.monid.ai/v1/identities/{provider}/link \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"returnTo": "/wallet"
}
'import requests
url = "https://api.monid.ai/v1/identities/{provider}/link"
payload = { "returnTo": "/wallet" }
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({returnTo: '/wallet'})
};
fetch('https://api.monid.ai/v1/identities/{provider}/link', 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.monid.ai/v1/identities/{provider}/link",
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([
'returnTo' => '/wallet'
]),
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.monid.ai/v1/identities/{provider}/link"
payload := strings.NewReader("{\n \"returnTo\": \"/wallet\"\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.monid.ai/v1/identities/{provider}/link")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"returnTo\": \"/wallet\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.monid.ai/v1/identities/{provider}/link")
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 \"returnTo\": \"/wallet\"\n}"
response = http.request(request)
puts response.read_body{
"authorizationUrl": "<string>",
"expiresAt": "2023-11-07T05:31:56Z"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}Start linking an external identity
Begins the OpenID Connect authorization-code flow for provider and returns the URL to send the browser to. The flow is completed by POST /v1/identities/{provider}/link/complete with the code and state the provider redirects back with. Requires a signed-in session (not an API key).
curl --request POST \
--url https://api.monid.ai/v1/identities/{provider}/link \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"returnTo": "/wallet"
}
'import requests
url = "https://api.monid.ai/v1/identities/{provider}/link"
payload = { "returnTo": "/wallet" }
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({returnTo: '/wallet'})
};
fetch('https://api.monid.ai/v1/identities/{provider}/link', 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.monid.ai/v1/identities/{provider}/link",
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([
'returnTo' => '/wallet'
]),
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.monid.ai/v1/identities/{provider}/link"
payload := strings.NewReader("{\n \"returnTo\": \"/wallet\"\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.monid.ai/v1/identities/{provider}/link")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"returnTo\": \"/wallet\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.monid.ai/v1/identities/{provider}/link")
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 \"returnTo\": \"/wallet\"\n}"
response = http.request(request)
puts response.read_body{
"authorizationUrl": "<string>",
"expiresAt": "2023-11-07T05:31:56Z"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}{
"code": 400,
"message": "Bad Request",
"hints": {},
"errorCode": "RATE_LIMITED"
}Authorizations
Monid API key (Authorization: Bearer mk_...) or Clerk-issued JWT. Each operation lists the ONE scope an API key needs. {resource}:* grants every action on that resource; * grants everything; Clerk sessions hold *. Operations with an empty list need no scope. Scope catalog: GET /v1/api-keys/scopes.
Headers
Model driving the calling agent. Optional; a value that is empty, longer than 256 characters or not printable ASCII is ignored (never an error).
256Agent harness or client making the call (e.g. a coding agent, an agent framework). Optional; a value that is empty, longer than 256 characters or not printable ASCII is ignored (never an error).
256Caller-side session identifier, so the calls of one agent session (discover → inspect → run → polling) can be correlated. Optional; a value that is empty, longer than 256 characters or not printable ASCII is ignored (never an error).
256Path Parameters
Identity provider key, e.g. world.
"world"
Body
Dashboard path to return to after the link completes (same-origin path only, e.g. /wallet?promoResume=1).
512"/wallet"