curl --request POST \
--url https://api.circle.com/v2/cpn/payments/{paymentId}/transactions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"idempotencyKey": "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11",
"metadata": {}
}
'import requests
url = "https://api.circle.com/v2/cpn/payments/{paymentId}/transactions"
payload = {
"idempotencyKey": "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11",
"metadata": {}
}
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({idempotencyKey: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', metadata: {}})
};
fetch('https://api.circle.com/v2/cpn/payments/{paymentId}/transactions', 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.circle.com/v2/cpn/payments/{paymentId}/transactions",
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([
'idempotencyKey' => 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
'metadata' => [
]
]),
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.circle.com/v2/cpn/payments/{paymentId}/transactions"
payload := strings.NewReader("{\n \"idempotencyKey\": \"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11\",\n \"metadata\": {}\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.circle.com/v2/cpn/payments/{paymentId}/transactions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.circle.com/v2/cpn/payments/{paymentId}/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 \"idempotencyKey\": \"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"type": "transaction",
"id": "c4d1da72-111e-4d52-bdbf-2e74a2d803d5",
"paymentId": "c4d1da72-111e-4d52-bdbf-2e74a2d803d5",
"status": "PENDING",
"expireDate": "2023-01-01T12:04:05Z",
"senderAddress": "0xe01be9cdd9e744ae6a709794bfe531ec3ec0671c",
"blockchain": "ETH-SEPOLIA",
"amount": {
"amount": "110.270000",
"currency": "USDC"
},
"destinationAddress": "0xe01be9cdd9e744ae6a709794bfe531ec3ec0671c",
"messageType": "PAYMENT_SETTLEMENT_CONTRACT_V1_0_PAYMENT_INTENT",
"messageToBeSigned": {},
"metadata": {},
"failureReason": "FAILED_ONCHAIN",
"transactionHash": "2vmEDSBThR143WJyJePkpKVQcERVo9KePuCUwYU8fkoJaQjarTMj6sZG7DNnJ4zjhtRz6hDruqEFEkD4wJpGviiW"
}
}{
"code": 400,
"message": "Bad request."
}{
"code": 401,
"message": "Malformed authorization."
}{
"code": 3,
"message": "Forbidden"
}{
"code": 404,
"message": "Not found."
}Create a transaction (V2)
Create a V2 transaction for signing
curl --request POST \
--url https://api.circle.com/v2/cpn/payments/{paymentId}/transactions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"idempotencyKey": "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11",
"metadata": {}
}
'import requests
url = "https://api.circle.com/v2/cpn/payments/{paymentId}/transactions"
payload = {
"idempotencyKey": "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11",
"metadata": {}
}
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({idempotencyKey: 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', metadata: {}})
};
fetch('https://api.circle.com/v2/cpn/payments/{paymentId}/transactions', 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.circle.com/v2/cpn/payments/{paymentId}/transactions",
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([
'idempotencyKey' => 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
'metadata' => [
]
]),
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.circle.com/v2/cpn/payments/{paymentId}/transactions"
payload := strings.NewReader("{\n \"idempotencyKey\": \"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11\",\n \"metadata\": {}\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.circle.com/v2/cpn/payments/{paymentId}/transactions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"idempotencyKey\": \"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.circle.com/v2/cpn/payments/{paymentId}/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 \"idempotencyKey\": \"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"type": "transaction",
"id": "c4d1da72-111e-4d52-bdbf-2e74a2d803d5",
"paymentId": "c4d1da72-111e-4d52-bdbf-2e74a2d803d5",
"status": "PENDING",
"expireDate": "2023-01-01T12:04:05Z",
"senderAddress": "0xe01be9cdd9e744ae6a709794bfe531ec3ec0671c",
"blockchain": "ETH-SEPOLIA",
"amount": {
"amount": "110.270000",
"currency": "USDC"
},
"destinationAddress": "0xe01be9cdd9e744ae6a709794bfe531ec3ec0671c",
"messageType": "PAYMENT_SETTLEMENT_CONTRACT_V1_0_PAYMENT_INTENT",
"messageToBeSigned": {},
"metadata": {},
"failureReason": "FAILED_ONCHAIN",
"transactionHash": "2vmEDSBThR143WJyJePkpKVQcERVo9KePuCUwYU8fkoJaQjarTMj6sZG7DNnJ4zjhtRz6hDruqEFEkD4wJpGviiW"
}
}{
"code": 400,
"message": "Bad request."
}{
"code": 401,
"message": "Malformed authorization."
}{
"code": 3,
"message": "Forbidden"
}{
"code": 404,
"message": "Not found."
}Authorizations
Circle's API Keys are formatted in the following structure "PREFIX:ID:SECRET". All three parts are requred to make a successful request.
Path Parameters
The payment id created previously. System-generated unique identifier of the resource.
"c4d1da72-111e-4d52-bdbf-2e74a2d803d5"
Body
Create a V2 transaction for signing
Unique identifier to prevent duplicate transaction creation.
"a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11"
Key-value pairs for storing reference data. Up to 50 keys allowed, with key names up to 50 characters and values up to 400 characters.
Show child attributes
Show child attributes
Response
Transaction created successfully or idempotency conflict.
V2 Transaction response wrapper
V2 transaction response schema containing details about the transaction amount, addresses, and status
Show child attributes
Show child attributes
Was this page helpful?