Creer ou mettre a jour une operation externe
Crée ou met à jour immédiatement une opération à partir d’un identifiant partenaire stable. La réponse contient directement marko_id. Une valeur de taxonomie inconnue est créée pour l’entité, visible immédiatement et signalée dans taxonomy_additions. Le segment généré des codes custom__... n’est pas prévisible : le client doit conserver le code renvoyé et le réutiliser. Une création répond 201; une mise à jour, restauration ou répétition sans changement répond 200. Les notes utilisent leur endpoint dédié; seul POST /operations/batch reste asynchrone.
curl --request PUT \
--url https://partner-api.marko.fr/v1/operations/external/{external_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "Clubfunding Demo Deal",
"status": "Projet émis",
"type_investissement": "dette_senior",
"type_operation": "acquisition_detention",
"classe_actif": "residentiel",
"statut_interne": "analyse",
"statut_operationnel": [
"commercialisation"
],
"sous_classe_actif": "residentiel_coliving",
"data": {
"adresse": "12 rue de la Paix, Paris"
},
"kpi_snapshot": {
"date_reference": "2026-07-15",
"crd_total": 2500000,
"valeur_venale": 3400000,
"ltv": 0.7353
}
}
'import requests
url = "https://partner-api.marko.fr/v1/operations/external/{external_id}"
payload = {
"name": "Clubfunding Demo Deal",
"status": "Projet émis",
"type_investissement": "dette_senior",
"type_operation": "acquisition_detention",
"classe_actif": "residentiel",
"statut_interne": "analyse",
"statut_operationnel": ["commercialisation"],
"sous_classe_actif": "residentiel_coliving",
"data": { "adresse": "12 rue de la Paix, Paris" },
"kpi_snapshot": {
"date_reference": "2026-07-15",
"crd_total": 2500000,
"valeur_venale": 3400000,
"ltv": 0.7353
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Clubfunding Demo Deal',
status: 'Projet émis',
type_investissement: 'dette_senior',
type_operation: 'acquisition_detention',
classe_actif: 'residentiel',
statut_interne: 'analyse',
statut_operationnel: ['commercialisation'],
sous_classe_actif: 'residentiel_coliving',
data: {adresse: '12 rue de la Paix, Paris'},
kpi_snapshot: {
date_reference: '2026-07-15',
crd_total: 2500000,
valeur_venale: 3400000,
ltv: 0.7353
}
})
};
fetch('https://partner-api.marko.fr/v1/operations/external/{external_id}', 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://partner-api.marko.fr/v1/operations/external/{external_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Clubfunding Demo Deal',
'status' => 'Projet émis',
'type_investissement' => 'dette_senior',
'type_operation' => 'acquisition_detention',
'classe_actif' => 'residentiel',
'statut_interne' => 'analyse',
'statut_operationnel' => [
'commercialisation'
],
'sous_classe_actif' => 'residentiel_coliving',
'data' => [
'adresse' => '12 rue de la Paix, Paris'
],
'kpi_snapshot' => [
'date_reference' => '2026-07-15',
'crd_total' => 2500000,
'valeur_venale' => 3400000,
'ltv' => 0.7353
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://partner-api.marko.fr/v1/operations/external/{external_id}"
payload := strings.NewReader("{\n \"name\": \"Clubfunding Demo Deal\",\n \"status\": \"Projet émis\",\n \"type_investissement\": \"dette_senior\",\n \"type_operation\": \"acquisition_detention\",\n \"classe_actif\": \"residentiel\",\n \"statut_interne\": \"analyse\",\n \"statut_operationnel\": [\n \"commercialisation\"\n ],\n \"sous_classe_actif\": \"residentiel_coliving\",\n \"data\": {\n \"adresse\": \"12 rue de la Paix, Paris\"\n },\n \"kpi_snapshot\": {\n \"date_reference\": \"2026-07-15\",\n \"crd_total\": 2500000,\n \"valeur_venale\": 3400000,\n \"ltv\": 0.7353\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.put("https://partner-api.marko.fr/v1/operations/external/{external_id}")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Clubfunding Demo Deal\",\n \"status\": \"Projet émis\",\n \"type_investissement\": \"dette_senior\",\n \"type_operation\": \"acquisition_detention\",\n \"classe_actif\": \"residentiel\",\n \"statut_interne\": \"analyse\",\n \"statut_operationnel\": [\n \"commercialisation\"\n ],\n \"sous_classe_actif\": \"residentiel_coliving\",\n \"data\": {\n \"adresse\": \"12 rue de la Paix, Paris\"\n },\n \"kpi_snapshot\": {\n \"date_reference\": \"2026-07-15\",\n \"crd_total\": 2500000,\n \"valeur_venale\": 3400000,\n \"ltv\": 0.7353\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://partner-api.marko.fr/v1/operations/external/{external_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Clubfunding Demo Deal\",\n \"status\": \"Projet émis\",\n \"type_investissement\": \"dette_senior\",\n \"type_operation\": \"acquisition_detention\",\n \"classe_actif\": \"residentiel\",\n \"statut_interne\": \"analyse\",\n \"statut_operationnel\": [\n \"commercialisation\"\n ],\n \"sous_classe_actif\": \"residentiel_coliving\",\n \"data\": {\n \"adresse\": \"12 rue de la Paix, Paris\"\n },\n \"kpi_snapshot\": {\n \"date_reference\": \"2026-07-15\",\n \"crd_total\": 2500000,\n \"valeur_venale\": 3400000,\n \"ltv\": 0.7353\n }\n}"
response = http.request(request)
puts response.read_body{
"external_id": "CF-OP-001",
"marko_id": "44444444-4444-4444-4444-444444444444",
"outcome": "updated",
"resource": {
"id": "44444444-4444-4444-4444-444444444444",
"spv_id": null,
"lead_operateur_id": null,
"name": "Clubfunding Demo Deal - Mise à jour",
"status": "custom__a3e08c7bde__projet_emis",
"type_investissement": "dette_senior",
"type_operation": "acquisition_detention",
"classe_actif": "residentiel",
"statut_interne": "analyse",
"statut_operationnel": [
"commercialisation"
],
"sous_classe_actif": "residentiel_coliving",
"data": {
"adresse": "14 rue de la Paix, Paris"
},
"created_at": "2026-08-22T08:00:00Z",
"updated_at": "2026-08-22T09:30:00Z"
},
"taxonomy_additions": [],
"request_id": "req_cf_operation_update"
}{
"external_id": "CF-OP-001",
"marko_id": "44444444-4444-4444-4444-444444444444",
"outcome": "created",
"resource": {
"id": "44444444-4444-4444-4444-444444444444",
"spv_id": null,
"lead_operateur_id": null,
"name": "Clubfunding Demo Deal",
"status": "custom__a3e08c7bde__projet_emis",
"type_investissement": "dette_senior",
"type_operation": "acquisition_detention",
"classe_actif": "residentiel",
"statut_interne": "analyse",
"statut_operationnel": [
"commercialisation"
],
"sous_classe_actif": "residentiel_coliving",
"data": {
"adresse": "12 rue de la Paix, Paris"
},
"created_at": "2026-08-22T08:00:00Z",
"updated_at": "2026-08-22T08:00:00Z"
},
"taxonomy_additions": [
{
"code": "custom__a3e08c7bde__projet_emis",
"dimension": "operation_status",
"display_label": "Projet émis",
"source_kind": "partner",
"source_display_name": "ClubFunding",
"is_visible": true,
"is_active": true,
"position": 10000,
"usage_count": 0,
"label_editable": true,
"canonical_code": null
}
],
"request_id": "req_cf_operation_upsert"
}{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "A valid bearer token is required.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "The API key does not allow this operation.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Not Found",
"status": 404,
"detail": "Existing MARKO operation or related resource not found",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "The request payload or parameters are invalid.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Precondition Required",
"status": 428,
"detail": "The Idempotency-Key header is required.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "The request rate limit was exceeded.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Internal Server Error",
"status": 500,
"detail": "An unexpected server error occurred.",
"request_id": "req_example_partner_call"
}Authorizations
Use the access_token returned by POST /v1/auth/token. Do not send the raw API secret on business endpoints.
Headers
Partner-generated correlation identifier echoed in logs and error payloads.
Required for every write, including environments where replay deduplication is disabled. Reuse the same value when retrying the same logical write and use a new value for a different write.
255^[!-~]+$Path Parameters
1 - 255^[A-Za-z0-9_~-][A-Za-z0-9._:~-]{0,254}$Body
1 - 2551 - 2551 - 2551 - 2551 - 2551 - 2551001 - 255Show child attributes
Show child attributes
Response
Successful response for the accompanying request example
created, updated, noop, restored, bound Show child attributes
Show child attributes
Show child attributes
Show child attributes
curl --request PUT \
--url https://partner-api.marko.fr/v1/operations/external/{external_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "Clubfunding Demo Deal",
"status": "Projet émis",
"type_investissement": "dette_senior",
"type_operation": "acquisition_detention",
"classe_actif": "residentiel",
"statut_interne": "analyse",
"statut_operationnel": [
"commercialisation"
],
"sous_classe_actif": "residentiel_coliving",
"data": {
"adresse": "12 rue de la Paix, Paris"
},
"kpi_snapshot": {
"date_reference": "2026-07-15",
"crd_total": 2500000,
"valeur_venale": 3400000,
"ltv": 0.7353
}
}
'import requests
url = "https://partner-api.marko.fr/v1/operations/external/{external_id}"
payload = {
"name": "Clubfunding Demo Deal",
"status": "Projet émis",
"type_investissement": "dette_senior",
"type_operation": "acquisition_detention",
"classe_actif": "residentiel",
"statut_interne": "analyse",
"statut_operationnel": ["commercialisation"],
"sous_classe_actif": "residentiel_coliving",
"data": { "adresse": "12 rue de la Paix, Paris" },
"kpi_snapshot": {
"date_reference": "2026-07-15",
"crd_total": 2500000,
"valeur_venale": 3400000,
"ltv": 0.7353
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Clubfunding Demo Deal',
status: 'Projet émis',
type_investissement: 'dette_senior',
type_operation: 'acquisition_detention',
classe_actif: 'residentiel',
statut_interne: 'analyse',
statut_operationnel: ['commercialisation'],
sous_classe_actif: 'residentiel_coliving',
data: {adresse: '12 rue de la Paix, Paris'},
kpi_snapshot: {
date_reference: '2026-07-15',
crd_total: 2500000,
valeur_venale: 3400000,
ltv: 0.7353
}
})
};
fetch('https://partner-api.marko.fr/v1/operations/external/{external_id}', 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://partner-api.marko.fr/v1/operations/external/{external_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Clubfunding Demo Deal',
'status' => 'Projet émis',
'type_investissement' => 'dette_senior',
'type_operation' => 'acquisition_detention',
'classe_actif' => 'residentiel',
'statut_interne' => 'analyse',
'statut_operationnel' => [
'commercialisation'
],
'sous_classe_actif' => 'residentiel_coliving',
'data' => [
'adresse' => '12 rue de la Paix, Paris'
],
'kpi_snapshot' => [
'date_reference' => '2026-07-15',
'crd_total' => 2500000,
'valeur_venale' => 3400000,
'ltv' => 0.7353
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://partner-api.marko.fr/v1/operations/external/{external_id}"
payload := strings.NewReader("{\n \"name\": \"Clubfunding Demo Deal\",\n \"status\": \"Projet émis\",\n \"type_investissement\": \"dette_senior\",\n \"type_operation\": \"acquisition_detention\",\n \"classe_actif\": \"residentiel\",\n \"statut_interne\": \"analyse\",\n \"statut_operationnel\": [\n \"commercialisation\"\n ],\n \"sous_classe_actif\": \"residentiel_coliving\",\n \"data\": {\n \"adresse\": \"12 rue de la Paix, Paris\"\n },\n \"kpi_snapshot\": {\n \"date_reference\": \"2026-07-15\",\n \"crd_total\": 2500000,\n \"valeur_venale\": 3400000,\n \"ltv\": 0.7353\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.put("https://partner-api.marko.fr/v1/operations/external/{external_id}")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Clubfunding Demo Deal\",\n \"status\": \"Projet émis\",\n \"type_investissement\": \"dette_senior\",\n \"type_operation\": \"acquisition_detention\",\n \"classe_actif\": \"residentiel\",\n \"statut_interne\": \"analyse\",\n \"statut_operationnel\": [\n \"commercialisation\"\n ],\n \"sous_classe_actif\": \"residentiel_coliving\",\n \"data\": {\n \"adresse\": \"12 rue de la Paix, Paris\"\n },\n \"kpi_snapshot\": {\n \"date_reference\": \"2026-07-15\",\n \"crd_total\": 2500000,\n \"valeur_venale\": 3400000,\n \"ltv\": 0.7353\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://partner-api.marko.fr/v1/operations/external/{external_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Clubfunding Demo Deal\",\n \"status\": \"Projet émis\",\n \"type_investissement\": \"dette_senior\",\n \"type_operation\": \"acquisition_detention\",\n \"classe_actif\": \"residentiel\",\n \"statut_interne\": \"analyse\",\n \"statut_operationnel\": [\n \"commercialisation\"\n ],\n \"sous_classe_actif\": \"residentiel_coliving\",\n \"data\": {\n \"adresse\": \"12 rue de la Paix, Paris\"\n },\n \"kpi_snapshot\": {\n \"date_reference\": \"2026-07-15\",\n \"crd_total\": 2500000,\n \"valeur_venale\": 3400000,\n \"ltv\": 0.7353\n }\n}"
response = http.request(request)
puts response.read_body{
"external_id": "CF-OP-001",
"marko_id": "44444444-4444-4444-4444-444444444444",
"outcome": "updated",
"resource": {
"id": "44444444-4444-4444-4444-444444444444",
"spv_id": null,
"lead_operateur_id": null,
"name": "Clubfunding Demo Deal - Mise à jour",
"status": "custom__a3e08c7bde__projet_emis",
"type_investissement": "dette_senior",
"type_operation": "acquisition_detention",
"classe_actif": "residentiel",
"statut_interne": "analyse",
"statut_operationnel": [
"commercialisation"
],
"sous_classe_actif": "residentiel_coliving",
"data": {
"adresse": "14 rue de la Paix, Paris"
},
"created_at": "2026-08-22T08:00:00Z",
"updated_at": "2026-08-22T09:30:00Z"
},
"taxonomy_additions": [],
"request_id": "req_cf_operation_update"
}{
"external_id": "CF-OP-001",
"marko_id": "44444444-4444-4444-4444-444444444444",
"outcome": "created",
"resource": {
"id": "44444444-4444-4444-4444-444444444444",
"spv_id": null,
"lead_operateur_id": null,
"name": "Clubfunding Demo Deal",
"status": "custom__a3e08c7bde__projet_emis",
"type_investissement": "dette_senior",
"type_operation": "acquisition_detention",
"classe_actif": "residentiel",
"statut_interne": "analyse",
"statut_operationnel": [
"commercialisation"
],
"sous_classe_actif": "residentiel_coliving",
"data": {
"adresse": "12 rue de la Paix, Paris"
},
"created_at": "2026-08-22T08:00:00Z",
"updated_at": "2026-08-22T08:00:00Z"
},
"taxonomy_additions": [
{
"code": "custom__a3e08c7bde__projet_emis",
"dimension": "operation_status",
"display_label": "Projet émis",
"source_kind": "partner",
"source_display_name": "ClubFunding",
"is_visible": true,
"is_active": true,
"position": 10000,
"usage_count": 0,
"label_editable": true,
"canonical_code": null
}
],
"request_id": "req_cf_operation_upsert"
}{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Idempotency-Key must contain at most 255 visible ASCII characters without spaces.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Unauthorized",
"status": 401,
"detail": "A valid bearer token is required.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "The API key does not allow this operation.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Not Found",
"status": 404,
"detail": "Existing MARKO operation or related resource not found",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "The idempotency key payload, external reference, target, or source conflicts with an existing write.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Unprocessable Content",
"status": 422,
"detail": "The request payload or parameters are invalid.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Precondition Required",
"status": 428,
"detail": "The Idempotency-Key header is required.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "The request rate limit was exceeded.",
"request_id": "req_example_partner_call"
}{
"type": "about:blank",
"title": "Internal Server Error",
"status": 500,
"detail": "An unexpected server error occurred.",
"request_id": "req_example_partner_call"
}