curl --request POST \
--url https://api.meow.com/v1/users/invitations \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"email": "jsmith@example.com"
}
'import requests
url = "https://api.meow.com/v1/users/invitations"
payload = { "email": "jsmith@example.com" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({email: 'jsmith@example.com'})
};
fetch('https://api.meow.com/v1/users/invitations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meow.com/v1/users/invitations"
payload := strings.NewReader("{\n \"email\": \"jsmith@example.com\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.meow.com/v1/users/invitations")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jsmith@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meow.com/v1/users/invitations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"jsmith@example.com\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meow.com/v1/users/invitations",
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([
'email' => 'jsmith@example.com'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}const url = 'https://api.meow.com/v1/users/invitations';
const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({email: 'jsmith@example.com'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));using RestSharp;
var options = new RestClientOptions("https://api.meow.com/v1/users/invitations");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("x-api-key", "<api-key>");
request.AddJsonBody("{\n \"email\": \"jsmith@example.com\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
val client = OkHttpClient()
val mediaType = MediaType.parse("application/json")
val body = RequestBody.create(mediaType, "{\n \"email\": \"jsmith@example.com\"\n}")
val request = Request.Builder()
.url("https://api.meow.com/v1/users/invitations")
.post(body)
.addHeader("x-api-key", "<api-key>")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()import Foundation
let parameters = ["email": "jsmith@example.com"] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.meow.com/v1/users/invitations")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"x-api-key": "<api-key>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))falsefalse$headers=@{}
$headers.Add("x-api-key", "<api-key>")
$headers.Add("Content-Type", "application/json")
$response = Invoke-WebRequest -Uri 'https://api.meow.com/v1/users/invitations' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"email": "jsmith@example.com"
}'{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "new"
}{
"code": 123,
"message": "<string>",
"debug_message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}Invite a team member
Invite a colleague to your entity using a user API key with users:write and current admin access. Your key must have approved write access to the entity. Entity service keys cannot invite users. Your entity’s approval policy applies before the invitation is sent. Your colleague must accept the invitation before gaining access. Existing members, pending invitations, and active invitation requests are rejected. Retrying while a request or invitation is active does not send another invitation.
curl --request POST \
--url https://api.meow.com/v1/users/invitations \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"email": "jsmith@example.com"
}
'import requests
url = "https://api.meow.com/v1/users/invitations"
payload = { "email": "jsmith@example.com" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({email: 'jsmith@example.com'})
};
fetch('https://api.meow.com/v1/users/invitations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meow.com/v1/users/invitations"
payload := strings.NewReader("{\n \"email\": \"jsmith@example.com\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.meow.com/v1/users/invitations")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jsmith@example.com\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meow.com/v1/users/invitations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"jsmith@example.com\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meow.com/v1/users/invitations",
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([
'email' => 'jsmith@example.com'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}const url = 'https://api.meow.com/v1/users/invitations';
const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({email: 'jsmith@example.com'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));using RestSharp;
var options = new RestClientOptions("https://api.meow.com/v1/users/invitations");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("x-api-key", "<api-key>");
request.AddJsonBody("{\n \"email\": \"jsmith@example.com\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
val client = OkHttpClient()
val mediaType = MediaType.parse("application/json")
val body = RequestBody.create(mediaType, "{\n \"email\": \"jsmith@example.com\"\n}")
val request = Request.Builder()
.url("https://api.meow.com/v1/users/invitations")
.post(body)
.addHeader("x-api-key", "<api-key>")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()import Foundation
let parameters = ["email": "jsmith@example.com"] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.meow.com/v1/users/invitations")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"x-api-key": "<api-key>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))falsefalse$headers=@{}
$headers.Add("x-api-key", "<api-key>")
$headers.Add("Content-Type", "application/json")
$response = Invoke-WebRequest -Uri 'https://api.meow.com/v1/users/invitations' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"email": "jsmith@example.com"
}'{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "new"
}{
"code": 123,
"message": "<string>",
"debug_message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}users:write to invite a colleague to your entity.
Include x-entity-id with the entity’s public ID.
Your key needs write access to that entity, and you must currently have the Admin role.
Entity service keys, partner keys, and MCP credentials cannot create invitations.
Your entity’s approval policy applies to the invitation request.
The response contains the request ID and its status.
If the status is pending_approval, an administrator must approve the request in your dashboard.
The invitation gives no access until your colleague accepts it.
Choose an existing team role other than None.
The same role restrictions apply as in your dashboard.
The API rejects existing members, active invitations, and active invitation requests with HTTP 400.
Repeating the request while an invitation or request is active does not send another invitation.
Use your dashboard to resend an invitation.Authorizations
Your Meow API key, sent in the x-api-key header for authentication.
Headers
Optional entity_id to scope requests to a specific entity.
Body
Email address of the colleague you want to invite.
100Role your colleague receives after accepting the invitation.
Admin, Viewer, Bookkeeper, Controller, Card user, Card manager, Invoice user, AP Clerk, AP/AR Bookkeeper, Bill Approver, None Response
Successful Response
Invitation request ID. Use this to find the request in your dashboard's Approvals page.
Request status. A pending_approval request needs approval in your dashboard before your colleague receives an invitation.
new, pending_approval, approved, queued, in_progress, completed, failed, rejected, expired