Needs keys Submits the business profile used for carrier verification. Real review needs a Telnyx API key on the server. Without one, the mock reviewer approves a valid submission at once; with a key, the profile stays pending until the carrier review sets it to approved or rejected.
Submitting again replaces the whole profile and starts the review over. KYC only blocks buying numbers, outbound calls and SMS when the deployment sets TRIED_KYC_REQUIRED=1; those requests then return 403 until the profile is approved.
Request#
| Field | Type | Required | Description |
|---|---|---|---|
business_name |
string | Yes | Registered business name, 2 to 200 characters. |
country |
string | Yes | Two-letter country code in upper case, for example AU or NZ. |
website |
string | No | Business website, a full URL. |
business_registration_number |
string | No | ABN, EIN or other registration number, up to 64 characters. |
contact_email |
string | No | Email for the reviewer to contact. |
use_case |
string | No | What the workspace calls and texts people for, up to 1000 characters. |
Example request#
curl -X POST https://api.tried.com.au/kyc \
-H "Authorization: Bearer $TRIED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"business_name": "Acme Dental Pty Ltd",
"country": "AU",
"website": "https://acmedental.example.com.au",
"business_registration_number": "51824753556",
"contact_email": "compliance@acmedental.example.com.au",
"use_case": "Appointment reminders and inbound booking calls for patients."
}'const res = await fetch("https://api.tried.com.au/kyc", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TRIED_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
business_name: "Acme Dental Pty Ltd",
country: "AU",
website: "https://acmedental.example.com.au",
business_registration_number: "51824753556",
contact_email: "compliance@acmedental.example.com.au",
use_case: "Appointment reminders and inbound booking calls for patients.",
}),
});
const kyc = await res.json();import os, requests
res = requests.post(
"https://api.tried.com.au/kyc",
headers={"Authorization": f"Bearer {os.environ['TRIED_API_KEY']}"},
json={
"business_name": "Acme Dental Pty Ltd",
"country": "AU",
"website": "https://acmedental.example.com.au",
"business_registration_number": "51824753556",
"contact_email": "compliance@acmedental.example.com.au",
"use_case": "Appointment reminders and inbound booking calls for patients.",
},
)
kyc = res.json()Response#
200 OK
{
"status": "pending",
"business_name": "Acme Dental Pty Ltd",
"country": "AU",
"website": "https://acmedental.example.com.au",
"submitted_timestamp": 1760918400000,
"reviewed_timestamp": null
}The fields are described on Get KYC status. In mock mode status is approved and reviewed_timestamp equals submitted_timestamp. The submit is recorded in the audit log as kyc.submit.
Errors#
| Status | When |
|---|---|
400 |
A field fails validation, for example a lower-case or three-letter country, an invalid website URL or contact_email. |
401 |
Missing or invalid API key. |
403 |
The key's IP allowlist or scopes reject the request (this route needs the admin scope), or a dashboard user without the admin role calls it (Requires role: admin). |
429 |
Rate limit exceeded. See Rate limits. |
See Errors for the body format.