curl --request POST \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt_id": 123,
"value": "<string>"
}
'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond"
payload = {
"prompt_id": 123,
"value": "<string>"
}
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({prompt_id: 123, value: '<string>'})
};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond', 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.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond",
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([
'prompt_id' => 123,
'value' => '<string>'
]),
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.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond"
payload := strings.NewReader("{\n \"prompt_id\": 123,\n \"value\": \"<string>\"\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.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt_id\": 123,\n \"value\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond")
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 \"prompt_id\": 123,\n \"value\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true
}{
"error": "prompt_required"
}{
"error": "missing_bearer",
"message": "Authorization required"
}{
"error": "missing_scope",
"required_scope": "sessions:read"
}{
"error": {
"type": "rate_limited",
"message": "This API key exceeded its request-rate limit"
}
}Answer provider sign-in prompt
Submit only the current prompt_id. Responses are write-only. Requires a workspace-bound user OAuth grant with org:write and workspace membership; a member signs in again only to an account they connected. API keys and browser sessions are not accepted. Login challenges are private to the initiating user. Sessions are persisted for recovery across API instances and restarts until expires_at. An uncertain token exchange is not replayed: an explicit restart-required failure means start a fresh login, retaining account_key. After expiry or a 404, start a new login. Provider device codes may expire sooner. Never share login URLs or codes.
Scope:org:writecurl --request POST \
--url https://api.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt_id": 123,
"value": "<string>"
}
'import requests
url = "https://api.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond"
payload = {
"prompt_id": 123,
"value": "<string>"
}
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({prompt_id: 123, value: '<string>'})
};
fetch('https://api.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond', 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.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond",
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([
'prompt_id' => 123,
'value' => '<string>'
]),
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.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond"
payload := strings.NewReader("{\n \"prompt_id\": 123,\n \"value\": \"<string>\"\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.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt_id\": 123,\n \"value\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reasonmachines.com/v3/organizations/{orgId}/provider-credentials/oauth/logins/{loginId}/respond")
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 \"prompt_id\": 123,\n \"value\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true
}{
"error": "prompt_required"
}{
"error": "missing_bearer",
"message": "Authorization required"
}{
"error": "missing_scope",
"required_scope": "sessions:read"
}{
"error": {
"type": "rate_limited",
"message": "This API key exceeded its request-rate limit"
}
}Authorizations
A workspace-bound human user OAuth grant with org:write scope. The user must be an organization owner/admin. API keys and browser sessions are not accepted.
Path Parameters
Organization id or slug. Resolve it with GET /v3/self.
The provider OAuth login id, returned as login_id by startProviderOAuthLogin and listPendingProviderOAuthLogins.
Body
Response
Answer accepted. Poll for the next action.
Always true when the request was accepted.

