Generate a setup link
package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.kirimdev.com/v1/customers/cus_01HXYZABCDEFGHJKMNPQRSTVWX/setup_links"
payload := strings.NewReader("{ \"expires_in_hours\": 1, \"success_redirect_url\": \"https://example.com\", \"failure_redirect_url\": \"https://example.com\" }")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "order-20260910-0001") 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(res) fmt.Println(string(body))
}const url = 'https://api.kirimdev.com/v1/customers/cus_01HXYZABCDEFGHJKMNPQRSTVWX/setup_links';const options = { method: 'POST', headers: { 'Idempotency-Key': 'order-20260910-0001', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"expires_in_hours":1,"success_redirect_url":"https://example.com","failure_redirect_url":"https://example.com"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}use serde_json::json;use reqwest;
#[tokio::main]pub async fn main() { let url = "https://api.kirimdev.com/v1/customers/cus_01HXYZABCDEFGHJKMNPQRSTVWX/setup_links";
let payload = json!({ "expires_in_hours": 1, "success_redirect_url": "https://example.com", "failure_redirect_url": "https://example.com" });
let mut headers = reqwest::header::HeaderMap::new(); headers.insert("Idempotency-Key", "order-20260910-0001".parse().unwrap()); headers.insert("Authorization", "Bearer <token>".parse().unwrap()); headers.insert("Content-Type", "application/json".parse().unwrap());
let client = reqwest::Client::new(); let response = client.post(url) .headers(headers) .json(&payload) .send() .await;
let results = response.unwrap() .json::<serde_json::Value>() .await .unwrap();
dbg!(results);}curl --request POST \ --url https://api.kirimdev.com/v1/customers/cus_01HXYZABCDEFGHJKMNPQRSTVWX/setup_links \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: order-20260910-0001' \ --data '{ "expires_in_hours": 1, "success_redirect_url": "https://example.com", "failure_redirect_url": "https://example.com" }'Creates a one-time setup link the end-customer can use to complete Meta Embedded Signup. The token is embedded in setup_url; there is no separate token field. Store the URL immediately. It is returned in the initial response and replayed for 24 hours when the same POST is retried with the same Idempotency-Key; outside that replay it is not returned again.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Public Kirimdev end-customer ID.
Example
cus_01HXYZABCDEFGHJKMNPQRSTVWXPublic Kirimdev end-customer ID.
Header Parameters
Section titled “Header Parameters ”Optional retry key. Reusing the same key with the same method, path, and body within 24 hours returns the original response; reusing it for a different request returns 422.
Example
order-20260910-0001Optional retry key. Reusing the same key with the same method, path, and body within 24 hours returns the original response; reusing it for a different request returns 422.
Request Body
Section titled “Request Body ”object
Example generated
{ "expires_in_hours": 1, "success_redirect_url": "https://example.com", "failure_redirect_url": "https://example.com"}Responses
Section titled “ Responses ”Setup link created (token included in this idempotently replayable response)
object
object
Where the tenant is redirected after successful Embedded Signup. We append ?customer_id=&account_id=&status=success on the redirect.
Where the tenant is redirected on failure (link error, Meta signup cancelled, etc.). We append ?customer_id=&status=failed&reason=<code>.
Unique request identifier to include when contacting support.
Example
{ "data": { "id": "csl_01HXYZABCDEFGHJKMNPQRSTVWX", "object": "customer_setup_link", "status": "active" }, "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX"}Validation failure
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
A field value is invalid.
{ "error": { "type": "invalid_request_error", "code": "invalid_field_value", "message": "A field value is invalid.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Authentication failure
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
The provided API key is invalid.
{ "error": { "type": "authentication_error", "code": "invalid_api_key", "message": "The provided API key is invalid.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Billing / entitlement gate — subscription inactive, quota exceeded, or plan tier missing a feature (feature_not_entitled). Upgrade to continue.
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Your trial has ended or subscription is inactive. Upgrade to continue.
{ "error": { "type": "permission_error", "code": "subscription_inactive", "message": "Your trial has ended or subscription is inactive. Upgrade to continue.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Resource not found
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Resource not found.
{ "error": { "type": "not_found", "code": "resource_not_found", "message": "Resource not found.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Conflict (e.g. template already exists, webhook subscription disabled, setup link inactive)
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
An identical request is still being processed. Retry later.
{ "error": { "type": "conflict", "code": "idempotency_in_progress", "message": "An identical request is still being processed. Retry later.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Semantic failure (e.g. idempotency key reuse, pre-send compliance guard, media not found)
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Idempotency-Key was reused with a different request body.
{ "error": { "type": "invalid_request_error", "code": "idempotency_key_reuse", "message": "Idempotency-Key was reused with a different request body.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Rate limit exceeded
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
Rate limit exceeded.
{ "error": { "type": "rate_limit_error", "code": "rate_limit_exceeded", "message": "Rate limit exceeded.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}Internal server error
object
object
Human-readable explanation of the error.
Request field associated with the error, when applicable.
Unique request identifier to include when contacting support.
Examples
An unexpected error occurred.
{ "error": { "type": "api_error", "code": "internal_error", "message": "An unexpected error occurred.", "request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX" }}