C-compatible API for FFI bindings and cross-language integration.
Header
#include <exactedi/sdk/c_api.h>
Quick Start
#include <exactedi/sdk/c_api.h>
#include <stdio.h>
int main() {
// Create context
exactedi_context_t ctx = exactedi_create(NULL);
// Analyze file
exactedi_result_t result = NULL;
if (exactedi_analyze_file(ctx, "claims.edi", &result) == EXACTEDI_OK) {
// Get JSON output
char* json = NULL;
exactedi_result_to_facts_json(result, &json);
printf("%s\n", json);
exactedi_free_string(json);
exactedi_result_free(result);
}
exactedi_destroy(ctx);
return 0;
}
Types
Handles
typedef struct exactedi_context* exactedi_context_t; // Analysis context
typedef struct exactedi_result* exactedi_result_t; // Analysis result
Status Codes
typedef enum exactedi_status {
EXACTEDI_OK = 0,
EXACTEDI_ERROR_INVALID_ARGUMENT,
EXACTEDI_ERROR_FILE_NOT_FOUND,
EXACTEDI_ERROR_FILE_READ,
EXACTEDI_ERROR_FILE_WRITE,
EXACTEDI_ERROR_PARSE_FAILED,
EXACTEDI_ERROR_VALIDATION_FAILED,
EXACTEDI_ERROR_OUT_OF_MEMORY,
EXACTEDI_ERROR_LICENSE,
EXACTEDI_ERROR_INTERNAL
} exactedi_status_t;
Transaction Types
typedef enum exactedi_transaction_type {
EXACTEDI_TX_UNKNOWN = 0,
EXACTEDI_TX_837P = 1, // Professional claim
EXACTEDI_TX_837I = 2, // Institutional claim
EXACTEDI_TX_837D = 3, // Dental claim
EXACTEDI_TX_835 = 4, // Remittance advice
EXACTEDI_TX_277 = 5, // Claim status response
EXACTEDI_TX_999 = 6, // Implementation acknowledgment
EXACTEDI_TX_270 = 7, // Eligibility inquiry
EXACTEDI_TX_271 = 8, // Eligibility response
EXACTEDI_TX_276 = 9, // Claim status request
EXACTEDI_TX_277CA = 10, // Claim acknowledgment (277CA)
EXACTEDI_TX_278 = 11, // Health care services review (prior auth)
EXACTEDI_TX_820 = 12, // Premium payment
EXACTEDI_TX_834 = 13, // Benefit enrollment
EXACTEDI_TX_TA1 = 14 // Interchange acknowledgment
} exactedi_transaction_type_t;
Options
typedef struct exactedi_options {
int strict_validation; // Enable strict validation (default: 1)
int extract_facts; // Extract PHI-safe facts (default: 1)
int include_raw_segments; // Include raw segments (default: 0)
size_t max_transactions; // Max transactions (0 = unlimited)
int continue_on_error; // Continue after errors (default: 1)
} exactedi_options_t;
Statistics
typedef struct exactedi_stats {
size_t bytes_processed;
size_t segments_parsed;
uint32_t interchange_count;
uint32_t group_count;
uint32_t transaction_count;
size_t error_count;
size_t warning_count;
double elapsed_seconds;
} exactedi_stats_t;
Context Lifecycle
exactedi_create()
Create a new analysis context.
exactedi_context_t exactedi_create(const exactedi_options_t* options);
Parameters:
options- Configuration options (NULL for defaults)
Returns: Context handle, or NULL on error
exactedi_destroy()
Destroy an analysis context.
void exactedi_destroy(exactedi_context_t ctx);
exactedi_options_init()
Initialize options with defaults.
void exactedi_options_init(exactedi_options_t* options);
Analysis Functions
exactedi_analyze_file()
Analyze an X12 file.
exactedi_status_t exactedi_analyze_file(
exactedi_context_t ctx,
const char* file_path,
exactedi_result_t* out_result);
exactedi_analyze_memory()
Analyze X12 data from memory.
exactedi_status_t exactedi_analyze_memory(
exactedi_context_t ctx,
const void* data,
size_t data_len,
exactedi_result_t* out_result);
exactedi_validate_file()
Validate without fact extraction.
exactedi_status_t exactedi_validate_file(
exactedi_context_t ctx,
const char* file_path,
exactedi_stats_t* out_stats);
exactedi_validate_memory()
Validate memory buffer.
exactedi_status_t exactedi_validate_memory(
exactedi_context_t ctx,
const void* data,
size_t data_len,
exactedi_stats_t* out_stats);
Result Access
exactedi_result_get_stats()
exactedi_status_t exactedi_result_get_stats(
exactedi_result_t result,
exactedi_stats_t* out_stats);
exactedi_result_is_valid()
int exactedi_result_is_valid(exactedi_result_t result);
Returns 1 if valid (no errors), 0 otherwise.
exactedi_result_transaction_count()
size_t exactedi_result_transaction_count(exactedi_result_t result);
exactedi_result_transaction_type()
exactedi_transaction_type_t exactedi_result_transaction_type(
exactedi_result_t result,
size_t index);
exactedi_result_to_json()
exactedi_status_t exactedi_result_to_json(
exactedi_result_t result,
char** out_json);
Note: Caller must free with exactedi_free_string().
exactedi_result_to_facts_json()
exactedi_status_t exactedi_result_to_facts_json(
exactedi_result_t result,
char** out_json);
PHI-safe Facts JSON output.
exactedi_result_transaction_json()
exactedi_status_t exactedi_result_transaction_json(
exactedi_result_t result,
size_t index,
char** out_json);
exactedi_result_free()
void exactedi_result_free(exactedi_result_t result);
Streaming Analysis
Callback Type
typedef int (*exactedi_transaction_callback_t)(
const char* transaction_json,
exactedi_transaction_type_t transaction_type,
void* user_data);
Return non-zero to continue, 0 to stop.
exactedi_analyze_file_streaming()
exactedi_status_t exactedi_analyze_file_streaming(
exactedi_context_t ctx,
const char* file_path,
exactedi_transaction_callback_t callback,
void* user_data,
exactedi_stats_t* out_stats);
Example:
int my_callback(const char* json, exactedi_transaction_type_t type, void* data) {
printf("Transaction type %d: %s\n", type, json);
return 1; // Continue
}
exactedi_stats_t stats;
exactedi_analyze_file_streaming(ctx, "large.edi", my_callback, NULL, &stats);
Memory Management
exactedi_free_string()
Free strings allocated by ExactEDI.
void exactedi_free_string(char* str);
Error Handling
exactedi_get_last_error()
const char* exactedi_get_last_error(void);
Thread-local error message.
exactedi_clear_error()
void exactedi_clear_error(void);
exactedi_status_message()
const char* exactedi_status_message(exactedi_status_t status);
Version & License
exactedi_version()
const char* exactedi_version(void);
exactedi_version_components()
void exactedi_version_components(int* major, int* minor, int* patch);
exactedi_has_feature()
int exactedi_has_feature(const char* feature_name);
exactedi_license_status()
const char* exactedi_license_status(void);
exactedi_set_license_path()
exactedi_status_t exactedi_set_license_path(const char* path);
Complete Example
#include <exactedi/sdk/c_api.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <edi-file>\n", argv[0]);
return 1;
}
// Initialize options
exactedi_options_t options;
exactedi_options_init(&options);
options.strict_validation = 1;
// Create context
exactedi_context_t ctx = exactedi_create(&options);
if (!ctx) {
fprintf(stderr, "Failed to create context\n");
return 1;
}
// Analyze file
exactedi_result_t result = NULL;
exactedi_status_t status = exactedi_analyze_file(ctx, argv[1], &result);
if (status != EXACTEDI_OK) {
fprintf(stderr, "Error: %s\n", exactedi_get_last_error());
exactedi_destroy(ctx);
return 1;
}
// Get statistics
exactedi_stats_t stats;
exactedi_result_get_stats(result, &stats);
printf("Bytes: %zu\n", stats.bytes_processed);
printf("Segments: %zu\n", stats.segments_parsed);
printf("Transactions: %u\n", stats.transaction_count);
printf("Errors: %zu\n", stats.error_count);
printf("Valid: %s\n", exactedi_result_is_valid(result) ? "Yes" : "No");
// Get Facts JSON
char* json = NULL;
if (exactedi_result_to_facts_json(result, &json) == EXACTEDI_OK) {
printf("\n%s\n", json);
exactedi_free_string(json);
}
// Cleanup
exactedi_result_free(result);
exactedi_destroy(ctx);
return 0;
}