> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.withpersona.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.withpersona.com/_mcp/server.

# Create a Transaction

POST https://api.withpersona.com/api/v1/transactions
Content-Type: application/json

Creates a new Transaction for a specific transaction type in your organization.

Reference: https://docs.withpersona.com/api-reference/transactions/create-a-transaction

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Query parameters

- `include` (string, optional) — A comma-separated list of relationship paths. This can be used to customize which related resources will be fully serialized in the `included` key in the response. See [Serialization](https://docs.withpersona.com/serialization#inclusion-of-related-resources) for more details.
- `fields` (map from string to string, optional) — Comma-separated list(s) of attributes to include in the response. This can be used to customize which attributes will be serialized in the response. See [Serialization](https://docs.withpersona.com/serialization#sparse-fieldsets) for more details.

### Headers

- `Key-Inflection` (enum, optional) — Determines casing for the API response.
  - Allowed values: `camel`, `kebab`, `snake`
- `Idempotency-Key` (string, optional) — Ensures the request is idempotent.
- `Persona-Version` (enum, optional) — Server API version. More info on versioning can be found [here](https://docs.withpersona.com/versioning).
  - Allowed values: `2025-12-08`, `2025-10-27`, `2023-01-05`, `2022-09-01`, `2021-08-18`, `2021-07-05`, `2021-02-21`, `2020-05-18`

### Body (application/json)

This endpoint expects an object.

- `data` (TransactionsPostRequestBodyContentApplicationJsonSchemaData, required)
- `meta` (TransactionsPostRequestBodyContentApplicationJsonSchemaMeta, optional)

## Response

### 200

This endpoint returns a Transaction object and (optionally) its related objects in `included`.

- `data` (transaction, required)

### 201

This endpoint returns a Transaction object and (optionally) its related objects in `included`.

- `data` (transaction, required)

## Errors

### 400 Bad Request Error

The request was unacceptable, often due to invalid parameters.

- `errors` (list of TransactionsPostResponsesContentApplicationJsonSchemaErrorsItems, optional)

### 401 Unauthorized Error

An invalid API key was provided.

- `errors` (list of TransactionsPostResponsesContentApplicationJsonSchemaErrorsItems, optional)

### 403 Forbidden Error

The given API key doesn’t have permissions to perform the request or a quota has been exceeded.

- `errors` (list of TransactionsPostResponsesContentApplicationJsonSchemaErrorsItems, optional)

### 404 Not Found Error

The requested resource doesn’t exist.

- `errors` (list of TransactionsPostResponsesContentApplicationJsonSchemaErrorsItems, optional)

### 409 Conflict Error

The request conflicts with another request, often due to attempting to create a duplicate resource.

- `errors` (list of TransactionsPostResponsesContentApplicationJsonSchemaErrorsItems, optional)

### 422 Unprocessable Entity Error

The request modifies the resource in an unacceptable way, often due to an invalid action or parameter.

- `errors` (list of TransactionsPostResponsesContentApplicationJsonSchemaErrorsItems, optional)

### 429 Too Many Requests Error

Your organization’s rate limit has been exceeded. We recommend an exponential backoff on requests.

- `errors` (list of TransactionsPostResponsesContentApplicationJsonSchemaErrorsItems, optional)

## Types

### TransactionsPostRequestBodyContentApplicationJsonSchemaData

- `attributes` (TransactionsPostRequestBodyContentApplicationJsonSchemaDataAttributes, required)

### TransactionsPostRequestBodyContentApplicationJsonSchemaMeta

### transaction

- `id` (string, optional) — Unique identifier for this Transaction. Starts with `txn_`.
- `attributes` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionAttributes, optional)
- `relationships` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationships, optional)

### TransactionsPostResponsesContentApplicationJsonSchemaErrorsItems

- `title` (string, optional)
- `details` (string, optional)

### TransactionsPostRequestBodyContentApplicationJsonSchemaDataAttributes

- `transaction-type-id` (string, required) — Transaction type ID to create the transaction for. Required. Must be the ID of an existing Transaction Type in your organization, which always begins with `txntp_`.
- `fields` (map from string to any, optional) — JSON key-value pairs of field name to field value. Schema is defined by your transaction type.
- `reference-id` (string, optional) — Reference ID on Account, refers to an entity in your user model.
- `tags` (list of string, optional, nullable) — A list of tag names to be associated with the Transaction.

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionAttributes

- `status` (string, optional)
- `reference-id` (string, optional, nullable)
- `fields` (map from string to any, optional) — JSON key-value pairs of field name to field value. Exact schema depends on the configuration of the Transaction Type for this Transaction.
- `tags` (list of string, optional)
- `signals` (map from string to any, optional) — Risk signals computed for this Transaction, keyed by signal name. Only present for Transactions whose Transaction Type has Sentinel enabled; signals appear once the Sentinel session has been processed. Specific keys are not enumerated in the public spec and may be added or removed over time. Contact your Persona account team for more information.
- `created-at` (datetime, optional)
- `updated-at` (datetime, optional, nullable)

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationships

- `reviewer` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsReviewer, optional) — The entity that reviewed the transaction
- `transaction-label` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsTransactionLabel, optional)
- `transaction-type` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsTransactionType, optional)
- `related-objects` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsRelatedObjects, optional) — Objects involved in this Transaction's related Workflow runs.
- `sentinel-sessions` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsSentinelSessions, optional) — The Sentinel sessions that collected device and network data for this Transaction. Present on every Transaction; `data` is empty unless the Transaction has one or more Sentinel sessions.

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsReviewer

The entity that reviewed the transaction

- `data` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsReviewerData, optional, nullable)

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsTransactionLabel

- `data` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsTransactionLabelData, optional, nullable)

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsTransactionType

- `data` (VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsTransactionTypeData, optional)

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsRelatedObjects

Objects involved in this Transaction's related Workflow runs.

- `data` (list of VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsRelatedObjectsDataItems, optional)

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsSentinelSessions

The Sentinel sessions that collected device and network data for this Transaction. Present on every Transaction; `data` is empty unless the Transaction has one or more Sentinel sessions.

- `data` (list of VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsSentinelSessionsDataItems, optional)

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsReviewerData

- `type` (string, optional)
- `id` (string, optional)

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsTransactionLabelData

- `type` ("transaction-label", optional)
- `id` (string, optional) — Unique identifier for this Transaction Label. Starts with `txnl_`.

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsTransactionTypeData

- `type` ("transaction-type", optional)
- `id` (string, optional) — Unique identifier for this Transaction Type. Starts with `txntp_`.

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsRelatedObjectsDataItems

- `type` (string, optional)
- `id` (string, optional) — Unique identifier for this object.

### VerificationIncludedObjectsItemsDiscriminatorMappingTransactionRelationshipsSentinelSessionsDataItems

- `type` ("sentinel-session", optional)
- `id` (string, optional) — Unique identifier for this Sentinel Session. Starts with `snts_`.

## Examples

### Success

**Request**

```json
{
  "data": {
    "attributes": {
      "transaction-type-id": "txntp_8kQvWmT3xLpR6yNzHdF2sJbC"
    }
  }
}
```

**Response**

```json
{
  "data": {
    "id": "txn_ABC123",
    "attributes": {
      "status": "declined",
      "reference-id": null,
      "fields": {
        "back-photo": {
          "type": "file",
          "value": {
            "byte-size": 237011,
            "filename": "image.png",
            "mime-type": "image/png",
            "url": "https://files.withpersona.com/image.png?access_token=ACCESS_ABC123"
          }
        },
        "country": {
          "type": "string",
          "value": "US"
        },
        "front-photo": {
          "type": "file",
          "value": {
            "byte-size": 237011,
            "filename": "image.png",
            "mime-type": "image/png",
            "url": "https://files.withpersona.com/image.png?access_token=ACCESS_ABC123"
          }
        },
        "name-first": {
          "type": "string",
          "value": "LeBron"
        },
        "name-last": {
          "type": "string",
          "value": "James"
        },
        "selected-id-class": {
          "type": "string",
          "value": "dl"
        }
      },
      "tags": [],
      "created-at": "2023-05-26T16:49:33.860Z",
      "updated-at": "2023-05-26T16:49:43.965Z"
    },
    "relationships": {
      "reviewer": {
        "data": {
          "type": "workflow-run",
          "id": "wfr_ABC123"
        }
      },
      "transaction-label": {
        "data": null
      },
      "transaction-type": {
        "data": {
          "type": "transaction-type",
          "id": "txntp_ABC123"
        }
      },
      "related-objects": {
        "data": [
          {
            "type": "account",
            "id": "act_ABC123"
          },
          {
            "type": "verification/government-id",
            "id": "ver_ABC123"
          }
        ]
      },
      "sentinel-sessions": {
        "data": []
      }
    },
    "type": "transaction"
  }
}
```

**SDK Code**

```python Success
import requests

url = "https://api.withpersona.com/api/v1/transactions"

payload = { "data": { "attributes": { "transaction-type-id": "txntp_8kQvWmT3xLpR6yNzHdF2sJbC" } } }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Success
const url = 'https://api.withpersona.com/api/v1/transactions';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"data":{"attributes":{"transaction-type-id":"txntp_8kQvWmT3xLpR6yNzHdF2sJbC"}}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Success
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.withpersona.com/api/v1/transactions"

	payload := strings.NewReader("{\n  \"data\": {\n    \"attributes\": {\n      \"transaction-type-id\": \"txntp_8kQvWmT3xLpR6yNzHdF2sJbC\"\n    }\n  }\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(res)
	fmt.Println(string(body))

}
```

```ruby Success
require 'uri'
require 'net/http'

url = URI("https://api.withpersona.com/api/v1/transactions")

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  \"data\": {\n    \"attributes\": {\n      \"transaction-type-id\": \"txntp_8kQvWmT3xLpR6yNzHdF2sJbC\"\n    }\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java Success
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.withpersona.com/api/v1/transactions")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"data\": {\n    \"attributes\": {\n      \"transaction-type-id\": \"txntp_8kQvWmT3xLpR6yNzHdF2sJbC\"\n    }\n  }\n}")
  .asString();
```

```php Success
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.withpersona.com/api/v1/transactions', [
  'body' => '{
  "data": {
    "attributes": {
      "transaction-type-id": "txntp_8kQvWmT3xLpR6yNzHdF2sJbC"
    }
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Success
using RestSharp;

var client = new RestClient("https://api.withpersona.com/api/v1/transactions");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"data\": {\n    \"attributes\": {\n      \"transaction-type-id\": \"txntp_8kQvWmT3xLpR6yNzHdF2sJbC\"\n    }\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Success
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["data": ["attributes": ["transaction-type-id": "txntp_8kQvWmT3xLpR6yNzHdF2sJbC"]]] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.withpersona.com/api/v1/transactions")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Created

**Request**

```json
{
  "data": {
    "attributes": {
      "transaction-type-id": "txntp_8kQvWmT3xLpR6yNzHdF2sJbC"
    }
  }
}
```

**Response**

```json
{
  "data": {
    "id": "txn_ABC123",
    "attributes": {
      "status": "declined",
      "reference-id": null,
      "fields": {
        "back-photo": {
          "type": "file",
          "value": {
            "byte-size": 237011,
            "filename": "image.png",
            "mime-type": "image/png",
            "url": "https://files.withpersona.com/image.png?access_token=ACCESS_ABC123"
          }
        },
        "country": {
          "type": "string",
          "value": "US"
        },
        "front-photo": {
          "type": "file",
          "value": {
            "byte-size": 237011,
            "filename": "image.png",
            "mime-type": "image/png",
            "url": "https://files.withpersona.com/image.png?access_token=ACCESS_ABC123"
          }
        },
        "name-first": {
          "type": "string",
          "value": "LeBron"
        },
        "name-last": {
          "type": "string",
          "value": "James"
        },
        "selected-id-class": {
          "type": "string",
          "value": "dl"
        }
      },
      "tags": [],
      "created-at": "2023-05-26T16:49:33.860Z",
      "updated-at": "2023-05-26T16:49:43.965Z"
    },
    "relationships": {
      "reviewer": {
        "data": {
          "type": "workflow-run",
          "id": "wfr_ABC123"
        }
      },
      "transaction-label": {
        "data": null
      },
      "transaction-type": {
        "data": {
          "type": "transaction-type",
          "id": "txntp_ABC123"
        }
      },
      "related-objects": {
        "data": [
          {
            "type": "account",
            "id": "act_ABC123"
          },
          {
            "type": "verification/government-id",
            "id": "ver_ABC123"
          }
        ]
      },
      "sentinel-sessions": {
        "data": []
      }
    },
    "type": "transaction"
  }
}
```

**SDK Code**

```python Created
import requests

url = "https://api.withpersona.com/api/v1/transactions"

payload = { "data": { "attributes": { "transaction-type-id": "txntp_8kQvWmT3xLpR6yNzHdF2sJbC" } } }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Created
const url = 'https://api.withpersona.com/api/v1/transactions';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"data":{"attributes":{"transaction-type-id":"txntp_8kQvWmT3xLpR6yNzHdF2sJbC"}}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Created
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.withpersona.com/api/v1/transactions"

	payload := strings.NewReader("{\n  \"data\": {\n    \"attributes\": {\n      \"transaction-type-id\": \"txntp_8kQvWmT3xLpR6yNzHdF2sJbC\"\n    }\n  }\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(res)
	fmt.Println(string(body))

}
```

```ruby Created
require 'uri'
require 'net/http'

url = URI("https://api.withpersona.com/api/v1/transactions")

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  \"data\": {\n    \"attributes\": {\n      \"transaction-type-id\": \"txntp_8kQvWmT3xLpR6yNzHdF2sJbC\"\n    }\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java Created
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.withpersona.com/api/v1/transactions")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"data\": {\n    \"attributes\": {\n      \"transaction-type-id\": \"txntp_8kQvWmT3xLpR6yNzHdF2sJbC\"\n    }\n  }\n}")
  .asString();
```

```php Created
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.withpersona.com/api/v1/transactions', [
  'body' => '{
  "data": {
    "attributes": {
      "transaction-type-id": "txntp_8kQvWmT3xLpR6yNzHdF2sJbC"
    }
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Created
using RestSharp;

var client = new RestClient("https://api.withpersona.com/api/v1/transactions");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"data\": {\n    \"attributes\": {\n      \"transaction-type-id\": \"txntp_8kQvWmT3xLpR6yNzHdF2sJbC\"\n    }\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Created
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["data": ["attributes": ["transaction-type-id": "txntp_8kQvWmT3xLpR6yNzHdF2sJbC"]]] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.withpersona.com/api/v1/transactions")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```